본문 바로가기
서버구축 (WEB,DB)

Minikube(k8s) 환경 Ingress Nginx 컨트롤러 고급 옵션 활성화 사용법

by 날으는물고기 2024. 7. 2.

Minikube(k8s) 환경 Ingress Nginx 컨트롤러 고급 옵션 활성화 사용법

Kubernetes Ingress Controller Advanced 구성: Snippet 활용

Minikube에서 ingress-nginx를 사용하고 allow-snippet-annotations의 기본값을 true로 설정하는 방법을 다루겠습니다. Minikube는 ingress-nginx를 플러그인으로 쉽게 설치할 수 있으며, 설정을 커스터마이즈하기 위해서는 일부 추가 단계가 필요합니다.

1단계: Minikube에 ingress-nginx 설치

Minikube에 ingress-nginx를 설치합니다. 다음 명령어를 사용하여 Minikube에 Ingress 컨트롤러를 활성화할 수 있습니다.

minikube addons enable ingress

2단계: ConfigMap 수정

ingress-nginx의 설정을 변경하기 위해 ConfigMap을 수정해야 합니다. 이를 위해 먼저 기존의 ConfigMap을 수정하거나 새로운 ConfigMap을 생성할 수 있습니다. 기본적으로 생성되는 ConfigMap의 이름은 nginx-load-balancer-conf입니다. 다음은 kubectl을 사용하여 해당 ConfigMapallow-snippet-annotationstrue로 설정하는 예제입니다.

  1. 기존 ConfigMap 수정
     kubectl patch configmap nginx-load-balancer-conf -n kube-system --type merge -p '{"data":{"allow-snippet-annotations":"true"}}'
    이 명령어는 nginx-load-balancer-conf ConfigMap을 찾아 allow-snippet-annotations 값을 true로 설정합니다.
  2. ConfigMap 적용 후, Ingress 컨트롤러 Pod 재시작
     kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
    이 명령어는 ingress-nginx의 Deployment를 재시작하여 설정 변경사항을 적용합니다.
  3. Ingress 컨트롤러가 새로운 설정을 인식하도록 Pod를 재시작해야 합니다.

3단계: 설정 확인

설정이 제대로 적용되었는지 확인하기 위해, ConfigMap의 내용을 확인할 수 있습니다.

kubectl get configmap nginx-load-balancer-conf -n kube-system -o yaml

이 명령어를 통해 현재 ConfigMap의 상태를 확인할 수 있으며, allow-snippet-annotationstrue로 설정된 것을 볼 수 있습니다.

 

Minikube 재시작 시 설정이 유지되지 않는 경우가 있습니다. 이를 해결하기 위해 Minikube 시작 스크립트에 ConfigMap 업데이트를 포함시키거나, Helm과 같은 도구를 사용하여 Ingress 설정을 관리할 수 있습니다. 위의 단계를 통해 Minikube에서 ingress-nginxallow-snippet-annotations 기본값을 true로 설정할 수 있습니다.

 

ingress-nginx 컨트롤러의 Deployment에 직접 allow-snippet-annotationstrue로 설정하는 방법은 컨트롤러의 Deployment 리소스를 수정하여 해당 설정을 컨테이너 시작 인자에 추가하는 것입니다. 이 방법은 ConfigMap을 통한 설정보다 더 직접적이며, 컨트롤러가 시작할 때 주어진 설정을 반영하도록 합니다.

1단계: Deployment 수정

ingress-nginx 컨트롤러의 Deployment를 수정하여 --enable-snippet-annotations=true 인자를 추가합니다. 다음은 kubectl 명령어를 사용하여 Deployment를 수정하는 방법입니다.

  1. Deployment를 열어서 수정하기
     kubectl edit deployment ingress-nginx-controller -n ingress-nginx
    이 명령어를 실행하면, 기본 편집기에서 Deployment의 설정을 직접 수정할 수 있습니다.
  2. 컨테이너의 args 섹션을 찾아 다음 인자를 추가합니다.
     - --enable-snippet-annotations=true
    args 배열에 이 줄을 추가해야 합니다. 위치는 기존 args의 다른 값들 사이 어디든 상관없습니다.

2단계: 변경사항 적용 확인

수정 후, Kubernetes는 자동으로 변경 사항을 감지하고 Deployment를 업데이트합니다. 변경사항이 적용되었는지 확인하기 위해 Deployment의 Pod가 재시작되는지 확인할 수 있습니다.

  1. Pod 재시작 상태 확인
     kubectl rollout status deployment ingress-nginx-controller -n ingress-nginx
    이 명령어는 Deployment의 업데이트 상태를 보여주며, 모든 Pod가 새 설정으로 재시작되었는지 확인할 수 있습니다.

3단계: 기능 테스트

설정이 제대로 적용되었는지 테스트하기 위해 Ingress 리소스에 어노테이션을 추가하고 정상적으로 작동하는지 확인할 수 있습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      location /testpath {
          return 200 'It works!';
      }
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test-service
            port:
              number: 80

이 예제에서는 /testpath를 호출했을 때 "It works!" 메시지를 반환하도록 설정하고 있습니다. 이를 통해 allow-snippet-annotations 설정이 제대로 적용되었는지 확인할 수 있습니다.

 

위의 단계들을 통해 ingress-nginx Deployment에 직접적으로 allow-snippet-annotations를 활성화할 수 있습니다. 이 방법은 ConfigMap을 수정하는 대신 컨트롤러 자체의 설정을 변경하기 때문에 Minikube 재시작 후에도 유지될 가능성이 더 높습니다.

 

ingress-nginx Deployment의 컨테이너 인자 중 --configmap=$(POD_NAMESPACE)/ingress-nginx-controller--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config로 변경하고자 한다면, kubectl patch 명령어를 사용하여 이 변경을 직접 적용할 수 있습니다. 아래는 이러한 변경을 수행하기 위한 방법입니다.

Patch 명령어를 사용한 Deployment 수정

kubectl patch 명령어를 사용하여 Deployment 내의 특정 컨테이너 인자를 변경할 수 있습니다. JSON 패치를 사용하여 이 변경을 적용하는 예제 명령어는 다음과 같습니다.

kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type='json' -p='[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/args/4",
    "value": "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config"
  }
]'

패치 명령어 설명

  • --type='json': 이 옵션은 JSON 패치 형식을 사용하겠다는 것을 명시합니다.
  • -p: 패치를 적용할 내용을 JSON 배열로 제공합니다.
  • op: 수행할 작업 유형으로, 여기서는 "replace"를 사용하여 기존 값을 새 값으로 대체합니다.
  • path: 변경하고자 하는 대상의 JSON 경로를 지정합니다. 여기서는 첫 번째 컨테이너(containers/0)의 다섯 번째 인자(args/4)를 대상으로 하고 있습니다. 이 경로는 인자 배열에서 --configmap이 위치하는 인덱스에 따라 달라질 수 있으므로, 실제 사용 전에 해당 Deployment를 확인해 정확한 위치를 파악하는 것이 중요합니다.
  • value: 새로운 값으로 "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config"를 지정합니다.

주의사항

  • path/spec/template/spec/containers/0/args/4 부분에서 args/4--configmap 인자의 현재 위치를 나타냅니다. 실제 Deployment의 args 배열을 검사하여 정확한 인덱스를 확인해야 할 필요가 있습니다. 이 위치는 설치된 ingress-nginx의 버전이나 설정에 따라 다를 수 있습니다.
  • 이 패치 명령은 ingress-nginx 네임스페이스와 ingress-nginx-controller Deployment에 적용되므로, 실제 환경의 네임스페이스와 Deployment 이름을 확인하고 필요에 따라 조정해야 합니다.

 

패치 적용 후에는 변경사항을 확인하고, 필요한 경우 Deployment를 재시작하여 새 설정을 적용할 수 있습니다. 변경된 설정이 제대로 적용되었는지 확인하기 위해 Deployment의 로그를 확인하거나 관련 리소스의 동작을 테스트하는 것이 좋습니다.

 

kubectl을 사용하여 YAML 파일을 통해 Kubernetes Deployment를 패치하는 방법을 설명하겠습니다. 이 방법은 기존 리소스에 변경 사항을 적용하고 싶을 때 유용합니다.

1단계: YAML 파일 작성

먼저, 수정하고자 하는 Deployment의 변경사항을 포함한 YAML 파일을 만듭니다. 예를 들어, ingress-nginx-controller Deployment의 --configmap 인자를 수정하는 변경사항을 다음과 같이 작성할 수 있습니다.

  1. 원하는 변경사항만 포함된 YAML 파일(patch-deployment.yaml)을 생성합니다. 이 파일에는 변경하려는 컨테이너 인자만 명시합니다.
spec:
  template:
    spec:
      containers:
      - name: controller
        args:
        - /nginx-ingress-controller
        - --election-id=ingress-nginx-leader
        - --controller-class=k8s.io/ingress-nginx
        - --watch-ingress-without-class=true
        - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config  # 변경된 부분
        - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
        - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
        - --validating-webhook=:8443
        - --validating-webhook-certificate=/usr/local/certificates/cert
        - --validating-webhook-key=/usr/local/certificates/key

참고: 여기서 name: controller는 실제 Deployment의 컨테이너 이름과 일치해야 합니다. 실제 Deployment의 이름을 확인하고 해당 이름을 사용하세요.

2단계: YAML 파일을 사용한 Deployment 패치

작성한 YAML 파일을 사용하여 Deployment를 패치할 수 있습니다. kubectl patch 명령을 사용하는 대신, kubectl apply 명령을 사용하여 YAML 파일을 적용합니다.

kubectl apply -f patch-deployment.yaml

이 명령은 patch-deployment.yaml 파일의 내용을 기반으로 Deployment를 업데이트합니다. YAML 파일에서 지정된 설정만 변경되며, 다른 설정은 그대로 유지됩니다.

3단계: 변경사항 확인

변경사항이 성공적으로 적용되었는지 확인하기 위해 Deployment의 세부 정보를 조회할 수 있습니다.

kubectl describe deployment ingress-nginx-controller -n ingress-nginx

추가 정보

  • kubectl apply는 기존 리소스를 관리할 때 권장되는 방법입니다. 이 명령은 실제 리소스와 제공된 YAML 파일 간의 차이를 계산하고, 필요한 변경만을 적용합니다.
  • YAML 파일을 사용하는 방법은 원하는 변경사항을 더 명확하게 문서화하고, 리소스 구성의 버전 관리가 용이해집니다.

 

위의 단계를 따라 Kubernetes 리소스의 수정사항을 쉽게 패치하고 관리할 수 있습니다. 특정 문자열을 다른 문자열로 치환하여 Kubernetes Deployment를 패치하는 경우, kubectl을 사용하여 컨테이너 인자를 조건적으로 수정할 수 있습니다. 이 작업은 일반적으로 JSON Patch를 사용하여 수행할 수 있으나, 복잡한 로직을 처리하기 위해서는 작업을 단계별로 수행해야 할 수도 있습니다. 여기서는 먼저 해당 Deployment의 컨테이너 인자를 검색하고, 그 중 --configmap 인자가 포함된 인덱스를 찾은 다음, 해당 인덱스의 값을 새 값으로 치환하는 절차를 거치겠습니다.

1단계: 현재 설정 확인

ingress-nginx-controller Deployment의 현재 컨테이너 인자를 확인합니다.

kubectl get deployment ingress-nginx-controller -n ingress-nginx -o jsonpath="{.spec.template.spec.containers[*].args}"

2단계: 치환할 인자의 위치 찾기

위 명령어의 출력에서 --configmap=$(POD_NAMESPACE)/ingress-nginx-controller 인자의 정확한 위치를 찾습니다. 이 위치는 배열 내의 인덱스 번호로 표현됩니다. 예를 들어, 이 인자가 다섯 번째 위치에 있다면 인덱스는 4가 됩니다. (인덱스는 0부터 시작)

3단계: JSON Patch 파일 생성

치환할 인자의 위치를 알게 된 후, JSON Patch 명령을 사용하여 이를 업데이트하는 파일을 생성합니다. patch.json라는 이름의 파일을 만들고 다음과 같이 작성합니다.

[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/args/4",  // 인덱스 번호는 실제 위치에 따라 변경해야 함
    "value": "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config"
  }
]

여기서 path/spec/template/spec/containers/0/args/4입니다. 여기서 0은 첫 번째 컨테이너를 가리키고, 4--configmap 인자의 위치입니다. 실제 경로는 확인한 인덱스에 따라 다를 수 있습니다.

4단계: JSON Patch 적용

생성한 JSON Patch 파일을 사용하여 Deployment를 패치합니다.

kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type=json --patch-file=patch.json

5단계: 변경사항 확인

변경사항을 확인하고, Deployment가 예상대로 업데이트되었는지 검사합니다.

kubectl get deployment ingress-nginx-controller -n ingress-nginx -o jsonpath="{.spec.template.spec.containers[*].args}"

이 명령을 사용하여 변경된 인자를 확인할 수 있습니다.

 

이 절차를 통해 Kubernetes Deployment 내의 특정 문자열을 다른 문자열로 치환하고 패치하는 방법을 알 수 있습니다. JSON Patch 방법은 특정 필드의 값을 변경할 때 매우 유용합니다. 만약 많은 변경사항이 있거나 전체 구성을 업데이트해야 하는 경우, 전체 Deployment 매니페스트를 kubectl apply로 적용하는 것이 더 적합할 수 있습니다.

 

ingress-nginx-controller Deployment의 특정 인자 값을 자동으로 수정하고자 할 때, jq 명령어를 사용하여 JSON 데이터를 처리하고 이를 kubectl patch와 함께 사용하는 스크립트를 작성할 수 있습니다. 다음은 jq를 사용하여 --configmap 인자를 자동으로 찾아서 변경하고, 변경된 값을 적용하는 절차를 단계별로 설명한 스크립트입니다.

스크립트 작성

  1. Deployment 정보 추출: 먼저, Deployment의 현재 설정을 JSON 형식으로 추출합니다.
  2. jq로 인자 수정: jq를 사용하여 --configmap 인자를 찾고 수정합니다.
  3. 변경사항 적용: 수정된 JSON을 kubectl apply를 통해 다시 적용합니다.

스크립트 예제

아래는 이러한 단계를 구현한 Bash 스크립트의 예시입니다.

#!/bin/bash

# Deployment 설정을 JSON으로 추출
kubectl get deployment ingress-nginx-controller -n ingress-nginx -o json > ingress-nginx-deployment.json

# jq를 사용하여 --configmap 인자 변경
jq '(.spec.template.spec.containers[].args[] | select(. | startswith("--configmap")) ) |= sub("ingress-nginx-controller"; "ingress-nginx-controller-config")' ingress-nginx-deployment.json > modified-deployment.json

# 수정된 Deployment를 적용
kubectl apply -f modified-deployment.json

# 정리
rm ingress-nginx-deployment.json modified-deployment.json

스크립트 설명

  • 첫 번째 줄: Deployment의 현재 설정을 JSON 파일로 저장합니다.
  • 두 번째 줄: jq를 사용하여 --configmap 인자의 값을 수정합니다. sub 함수를 사용하여 문자열 치환을 수행합니다. 이 예에서는 ingress-nginx-controlleringress-nginx-controller-config로 변경합니다.
  • 세 번째 줄: 수정된 JSON 파일을 kubectl apply를 통해 적용합니다.
  • 네 번째 줄: 사용이 끝난 JSON 파일을 삭제하여 정리합니다.

주의사항

  • 이 스크립트는 실제로 실행하기 전에 테스트 환경에서 충분히 테스트해야 합니다. 또한, 인자의 배열 인덱스가 변경될 수 있으므로 실제로 적용할 환경에 맞게 인자의 위치를 확인하고 스크립트를 조정해야 합니다.
  • jq는 기본적으로 설치되어 있지 않을 수 있으므로, 사용 전에 시스템에 설치해야 합니다. sudo apt-get install jq 또는 해당하는 패키지 매니저를 사용하여 설치할 수 있습니다.

 

위 스크립트를 사용하여 ingress-nginx-controller의 인자를 자동으로 수정할 수 있으며, 다양한 환경에서 유용하게 사용할 수 있습니다. 특정 부분만을 수정하여 kubectl patch 명령어를 사용하는 더 세밀한 방법을 제공하겠습니다. 이 방법은 jq로 전체 JSON을 수정하는 대신, 수정해야 할 특정 인자만을 찾아 변경한 후 해당 변경사항만을 kubectl patch 명령어로 적용합니다. 이 접근 방식은 불필요한 변경을 최소화하고, 특정 인자만을 정확하게 업데이트할 수 있게 합니다.

1단계: --configmap 인자의 인덱스 찾기

Deployment의 args 배열에서 --configmap 인자의 인덱스를 찾는 Bash 스크립트를 작성합니다.

#!/bin/bash

# Deployment의 컨테이너 args를 배열로 가져옵니다.
args=$(kubectl get deployment ingress-nginx-controller -n ingress-nginx -o jsonpath="{.spec.template.spec.containers[0].args}")

# Bash 배열로 변환
args_array=($args)

# --configmap 인자의 인덱스 찾기
for i in "${!args_array[@]}"; do
  if [[ "${args_array[$i]}" == "--configmap="* ]]; then
    index=$i
    break
  fi
done

# 인덱스 확인
echo "Index of --configmap: $index"

2단계: kubectl patch로 특정 인자 수정

찾은 인덱스를 사용하여 --configmap 인자만 수정합니다.

# --configmap 인자를 새 값으로 변경
new_value="--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config"

# JSON Patch 생성
patch_string="[ { \"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/args/$index\", \"value\": \"$new_value\" } ]"

# kubectl patch 명령어 실행
kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type=json -p="$patch_string"

스크립트 합치기

위의 두 단계를 하나의 스크립트로 합쳐서 실행할 수 있습니다. 전체 스크립트는 다음과 같습니다.

#!/bin/bash

# Deployment의 컨테이너 args를 배열로 가져옵니다.
args=$(kubectl get deployment ingress-nginx-controller -n ingress-nginx -o jsonpath="{.spec.template.spec.containers[0].args}")

# Bash 배열로 변환
args_array=($args)

# --configmap 인자의 인덱스 찾기
for i in "${!args_array[@]}"; do
  if [[ "${args_array[$i]}" == "--configmap="* ]]; then
    index=$i
    break
  fi
done

# --configmap 인자를 새 값으로 변경
new_value="--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config"

# JSON Patch 생성
patch_string="[ { \"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/args/$index\", \"value\": \"$new_value\" } ]"

# kubectl patch 명령어 실행
kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type=json -p="$patch_string"

이 스크립트는 특정 인자만을 수정하여 Kubernetes Deployment를 업데이트합니다. 이 방법은 불필요한 변경을 방지하고, 필요한 부분만을 정확히 업데이트할 수 있어 효율적입니다.

 

kubectljq 명령어를 사용하여 Kubernetes Deployment의 --configmap 인자를 수정하고, 결과를 YAML 형식으로 출력하여 그것을 사용해 Deployment를 패치하는 방법을 구현하겠습니다. 이를 위해 Bash 스크립트를 작성하여 필요한 변환을 수행합니다.

스크립트 작성

아래 스크립트는 kubectl을 사용하여 ingress-nginx-controller의 컨테이너 인자를 가져오고, jq--configmap 값을 변경한 다음, 변경된 내용을 YAML 파일로 출력합니다.

#!/bin/bash

# Deployment의 현재 args를 가져옵니다.
args_json=$(kubectl get deployment ingress-nginx-controller -n ingress-nginx -o jsonpath="{.spec.template.spec.containers[*].args}")

# jq를 사용하여 --configmap 인자를 수정합니다.
modified_args=$(echo $args_json | jq 'map(if test("--configmap=.*") then "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config" else . end)')

# 수정된 args를 YAML 형식으로 출력합니다.
cat <<EOF > modified-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  template:
    spec:
      containers:
      - name: controller
        args: $modified_args
EOF

# 수정된 YAML 파일을 사용하여 Deployment를 패치합니다.
kubectl apply -f modified-deployment.yaml

# 생성된 YAML 파일 삭제 (선택적)
rm modified-deployment.yaml

스크립트 설명

  1. Deployment 정보 가져오기: kubectl get deployment 명령어를 사용하여 현재 컨테이너의 args를 JSON 배열로 추출합니다.
  2. jq를 사용한 수정: jq를 사용하여 --configmap 인자를 찾아 그 값을 변경합니다. test() 함수를 사용하여 해당 문자열이 있는지 확인하고, 조건에 맞는 경우 새 값을 적용합니다.
  3. YAML 파일 생성: Bash의 here-document를 사용하여 수정된 args를 포함하는 새로운 YAML 파일을 생성합니다. 이 파일은 변경을 적용하는 데 사용됩니다.
  4. Deployment 패치: kubectl apply 명령어를 사용하여 변경된 YAML 파일로 Deployment를 업데이트합니다.
  5. 파일 정리: 생성된 임시 YAML 파일을 삭제합니다. 이는 선택적 단계입니다.

실행 전 주의사항

  • 스크립트를 실행하기 전에 jq가 시스템에 설치되어 있는지 확인하세요.
  • 실제 Deployment의 컨테이너 이름이 controller인지 확인하고, 다른 이름을 사용한다면 스크립트 내에서 해당 이름으로 변경하세요.
  • 이 스크립트는 변경 사항을 적용하기 전에 테스트 환경에서 실행해 보는 것이 좋습니다.

 

이 방법을 사용하면 ingress-nginx-controller Deployment의 특정 인자만을 선택적으로 수정하고 이를 적용할 수 있습니다, 효과적으로 원하는 설정 변경을 관리할 수 있습니다.

 

kubectljq를 사용하여 간결하게 명령 줄에서 ingress-nginx-controller--configmap 인자를 직접 수정하고, 이를 YAML 파일 없이 즉시 적용하는 방법을 제공하겠습니다. 이 방법은 복잡한 스크립트를 작성하는 대신 한 줄의 명령어로 필요한 작업을 완료합니다.

명령 줄로 실행하는 방법

변경할 args 배열을 생성하고, 변경사항을 적용하기 위한 kubectl patch 명령을 사용합니다.

kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type=json -p="[{\"op\": \"replace\", \"path\": \"/spec/template/spec/containers/0/args\", \"value\": $(kubectl get deployment ingress-nginx-controller -n ingress-nginx -o json | jq '.spec.template.spec.containers[0].args | map(if test(\"^--configmap=\") then \"--configmap=\$(POD_NAMESPACE)/ingress-nginx-controller-config\" else . end)') }]"

명령어 설명

  • kubectl get : 현재 Deployment의 설정을 JSON 형식으로 가져옵니다.
  • jq 처리
    • .spec.template.spec.containers[0].args: 첫 번째 컨테이너의 args 배열을 선택합니다.
    • map(...): 배열의 각 요소를 반복하면서, --configmap=으로 시작하는 문자열을 찾아 변경합니다.
    • test("^--configmap="): 각 배열 요소가 --configmap=으로 시작하는지 확인합니다.
    • if...then...else: 조건이 참이면 새 값을 사용하고, 거짓이면 기존 값을 그대로 사용합니다.
  • kubectl patch
    • --type=json: JSON Patch 형식을 사용하여 변경사항을 적용합니다.
    • -p: 적용할 JSON Patch를 지정합니다. 이 JSON은 args 배열 전체를 새 배열로 대체합니다.

주의사항

  • 이 명령어는 Deployment의 첫 번째 컨테이너에만 적용됩니다. 컨테이너의 인덱스나 args의 특정 위치를 조정해야 할 경우, 이를 확인하고 조정해야 합니다.
  • kubectl patch 명령은 실시간으로 클러스터에 변경사항을 적용하므로, 실행 전에 변경 내용을 정확히 확인하는 것이 중요합니다.

 

이 명령어는 Kubernetes 클러스터의 설정을 직접적이고 빠르게 변경할 수 있는 강력한 방법을 제공합니다. 복잡한 스크립트 없이 단일 명령어로 필요한 작업을 완료할 수 있어, 관리가 편리합니다.

 

Kubernetes 리소스에 JSON 파일을 직접 참조하여 kubectl patch 명령을 사용하는 방법을 설명하겠습니다. 이 방법은 JSON 파일을 로컬에서 미리 작성하고, 그 파일을 kubectl patch 명령에 사용하여 Deployment를 업데이트하는 경우에 적합합니다.

 

jq 명령어를 사용하여 op, path, 그리고 value 키를 가진 JSON 객체를 생성하여 이 배열을 JSON Patch 포맷으로 변환합니다.

jq 명령어 작성

입력된 JSON 배열을 받아 JSON Patch 형식으로 변환하는 jq 명령어는 다음과 같습니다.

echo '[ "/nginx-ingress-controller", "--election-id=ingress-nginx-leader", "--controller-class=k8s.io/ingress-nginx", "--watch-ingress-without-class=true", "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config", "--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services", "--udp-services-configmap=$(POD_NAMESPACE)/udp-services", "--validating-webhook=:8443", "--validating-webhook-certificate=/usr/local/certificates/cert", "--validating-webhook-key=/usr/local/certificates/key" ]' | jq '[{ op: "replace", path: "/spec/template/spec/containers/0/args", value: . }]'
  • echo ...: 이 부분은 입력된 JSON 배열을 jq에 전달하기 위해 사용됩니다. 실제 사용 시에는 이 배열이 파일에서 오거나 다른 명령어의 출력일 수 있습니다.
  • | jq ...: jq 명령어는 파이프(|)를 통해 전달된 JSON 배열을 받아 처리합니다.
  • [{ ... }]: jq 스크립트 내에서, 배열을 생성하고 JSON Patch 객체를 포함합니다. 이 객체는 세 가지 주요 속성을 가집니다:
    • op: 작업 유형을 나타내며, 여기서는 "replace"를 사용합니다.
    • path: 대상 JSON 경로를 나타내며, 여기서는 첫 번째 컨테이너의 args 배열을 지정합니다.
    • value: 새 값으로 설정될 배열을 나타냅니다. 여기서 .jq의 현재 입력 (즉, 전달된 JSON 배열)을 참조합니다.

JSON 파일 준비

JSON Patch를 포함하는 파일을 직접 작성할 수도 있습니다. 예를 들어, 변경하고자 하는 args를 새 값으로 대체하는 내용을 patch.json 파일로 저장하겠습니다.

patch.json 파일의 내용

[
    {
        "op": "replace",
        "path": "/spec/template/spec/containers/0/args",
        "value": [
            "/nginx-ingress-controller",
            "--election-id=ingress-nginx-leader",
            "--controller-class=k8s.io/ingress-nginx",
            "--watch-ingress-without-class=true",
            "--configmap=$(POD_NAMESPACE)/ingress-nginx-controller-config",
            "--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services",
            "--udp-services-configmap=$(POD_NAMESPACE)/udp-services",
            "--validating-webhook=:8443",
            "--validating-webhook-certificate=/usr/local/certificates/cert",
            "--validating-webhook-key=/usr/local/certificates/key"
        ]
    }
]

명령어 사용

이제 kubectl patch 명령을 사용하여 이 JSON 파일을 참조하겠습니다. JSON 파일을 사용하는 방법은 클러스터의 상태를 변경하기 전에 변경사항을 미리 검토할 수 있는 장점이 있습니다.

kubectl patch deployment ingress-nginx-controller -n ingress-nginx --type json --patch-file patch.json

명령어 설명

  • --type json: 이 옵션은 JSON Patch를 사용하겠다는 것을 명시합니다. JSON Patch는 특정 JSON 문서의 일부를 수정하는 데 사용되는 형식입니다.
  • --patch-file patch.json: patch-file 옵션은 kubectl patch 명령에 JSON Patch가 포함된 파일을 제공합니다. 이 파일은 변경하고자 하는 args 배열의 새 값을 정의합니다.

실행 전 주의사항

  • JSON Patch 파일이 올바르게 형식화되어 있는지 확인하세요.
  • 해당 Deployment와 네임스페이스가 올바른지 검증하세요.
  • 변경사항을 적용하기 전에 테스트 환경에서 먼저 실행하여 예상치 못한 문제를 방지하세요.

 

이 방법을 사용하면 Kubernetes 리소스를 효과적으로 관리하고, 필요한 변경사항을 신속하게 적용할 수 있습니다. JSON 파일을 사용하는 접근 방식은 변경 사항을 미리 검토하고, 필요에 따라 쉽게 조정할 수 있어 관리가 용이합니다.

728x90

댓글