서버구축 (WEB,DB)

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

날으는물고기 2024. 7. 2. 00:54

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