Ssoon

Kustomize : Kustomize에서 Kubernetes 필드 업데이트하기 본문

CICD Study [1기]

Kustomize : Kustomize에서 Kubernetes 필드 업데이트하기

구구달스 2025. 10. 14. 00:21

🔧 Kustomize로 Kubernetes 필드 자유롭게 수정하기

문제 (Problem): Kustomize를 사용하여 replicas 수와 같은 특정 필드를 업데이트하고 싶습니다.

해결책 (Solution): patches 섹션을 사용하여 JSON Patch 명세에 따라 변경 사항을 지정합니다.

Kustomize는 이러한 모든 시나리오를 지원하기 위해 Kustomize 리소스로 정의된 모든 Kubernetes 리소스를 수정할 수 있는 JSON Patch 기능을 제공합니다. 이 기능을 사용하려면, 적용할 JSON Patch 표현식과 이 patch를 적용할 대상 리소스를 지정해야 합니다.


🧩 patches와 JSON Patch로 정밀하게 수정하기

예를 들어, 다음 deployment.yaml 파일의 replicas 수를 1에서 3으로 수정해 보겠습니다.

원본 deployment.yaml (일부):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pacman-kikd
  namespace: pacman
  labels:
    app.kubernetes.io/name: pacman-kikd
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
# ... (중략) ...

kustomization.yaml 업데이트: replicas 수를 변경하기 위해 kustomization.yaml 파일에 patches 섹션을 추가합니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> kustomization.yaml

patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2

patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3
  • patches: 리소스에 적용할 patch 목록을 정의합니다.
  • target: 변경할 Kubernetes object를 식별합니다. 이 값들은 이전에 생성한 deployment.yaml 파일의 apiVersion (group/version), kind, metadata.name, metadata.namespace와 일치해야 합니다.
  • patch: 적용할 JSON Patch 표현식입니다.
    • op: replace: 기존 값을 '수정(replace)'하라는 작업(operation)입니다.
    • path: /spec/replicas: YAML 구조 내에서 수정할 필드의 정확한 경로입니다.
    • value: 3: 해당 경로에 설정할 새로운 값입니다.

변경 사항 확인하기: kustomize CLI를 사용하여 출력을 검증합니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: pacman-kikd
  namespace: pacman
spec:
  replicas: 3 # <-- 값이 3으로 변경됨
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.0.2
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

실행 결과: 출력된 Deployment YAML에서 replicas 수가 3으로 변경된 것을 확인할 수 있습니다.

"patches 섹션과 JSON Patch를 사용하면 원본 YAML 파일을 수정하지 않고도 리소스의 모든 필드를 정밀하게 replace (수정)할 수 있습니다."


 replicas 필드를 이용한 간편한 변경

replicas 값은 kustomization.yaml 파일의 replicas 필드를 사용하여 더 간단하게 업데이트할 수도 있습니다.

다음 스니펫은 replicas 필드를 사용하는 동일한 Kustomize 파일입니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ sed -i '/patches:/,/^$/d' kustomization.yaml
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2


(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> kustomization.yaml

replicas:
  - name: pacman-kikd
    count: 3
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2


replicas:
  - name: pacman-kikd
    count: 3
    
    
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: pacman-kikd
  namespace: pacman
spec:
  replicas: 3
  selector:
...
  • replicas.name: replicas 수를 업데이트할 Deployment의 이름
  • replicas.count: 새로운 replicas 

"Kustomize는 replicas와 같이 자주 변경되는 필드를 위해 patches보다 사용하기 쉬운 전용 필드를 제공합니다."


➕ JSON Patch로 새 필드 추가하기

Kustomize는 값을 수정하는 것 외에도 op: add (추가) 또는 op: remove (삭제)를 사용하여 값을 추가하거나 삭제할 수 있습니다.

replicas를 3으로 수정하면서 동시에 새로운 label을 추가하는 방법

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ sed -i '/replicas:/,/^[^ ]/d' kustomization.yaml

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> kustomization.yaml

patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3
      - op: add
        path: /metadata/labels/testkey
        value: testvalue
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2



patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 3
      - op: add
        path: /metadata/labels/testkey
        value: testvalue
  • op: add: 새 필드와 값을 '추가'합니다.
  • path: /metadata/labels/testkey: 새 필드를 추가할 경로 (testkey라는 이름의 새 레이블).
  • value: testvalue: 설정할 값.

실행 결과: 이 파일을 적용한 결과는 다음과 같습니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
    testkey: testvalue   # <-- 새로운 레이블이 추가됨
  name: pacman-kikd
  namespace: pacman
spec:
  replicas: 3 # <-- 값도 함께 변경됨
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.0.2
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

"JSON Patch의 op: add를 사용하면 labels나 annotations와 같은 새로운 필드를 리소스에 손쉽게 추가할 수 있습니다."


🗂️ Patch 표현식 파일로 분리하기

JSON Patch 표현식을 kustomization.yaml 내부에 patch 필드로 포함하는 대신, Patch 표현식을 별도의 YAML 파일로 만들고 path 필드를 사용하여 참조할 수 있습니다.

external_patch.yaml 파일 생성:

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > external_patch.yaml
- op: replace
  path: /spec/replicas
  value: 3
- op: add
  path: /metadata/labels/testkey
  value: testvalue
EOF

kustomization.yaml 수정: patch 필드를 path 필드로 변경하고 patch 파일을 가리키도록 수정합니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ sed -i '/^patches:/,/^[^ ]/d' kustomization.yaml

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> kustomization.yaml
patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    path: external_patch.yaml
EOF
``
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2



patches:
  - target:
      version: v1
      group: apps
      kind: Deployment
      name: pacman-kikd
      namespace: pacman
    path: external_patch.yaml # <-- 외부 patch 파일을 가리키는 경로

"복잡한 patch는 별도 파일로 분리하고 path 필드로 참조하여 kustomization.yaml을 깔끔하게 유지할 수 있습니다."


🖇️ Strategic Merge Patch (SMP)로 병합하기

Kustomize는 JSON Patch 표현식 외에도 Kubernetes 리소스를 수정하기 위해 **Strategic Merge Patch (SMP)**도 지원합니다.

요약하자면, Strategic Merge Patch(SMP)는 "불완전한" YAML 파일을 원본 YAML 파일에 병합(merge)하는 방식입니다.

예를 들어, 컨테이너 이미지를 업데이트하기 위해 다음과 같이 최소한의 Deployment 파일만 patch로 사용할 수 있습니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ sed -i '/^patches:/,/^[^ ]/d' kustomization.yaml

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> kustomization.yaml
patches:
  - target:
      labelSelector: "app.kubernetes.io/name=pacman-kikd" #
    patch: |- #
      apiVersion: apps/v1 #
      kind: Deployment
      metadata:
        name: pacman-kikd
      spec:
        template:
          spec:
            containers:
              - name: pacman-kikd
                image: lordofthejars/pacman-kikd:1.2.0 #
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./namespace.yaml
- ./deployment.yaml
- ./service.yaml

images:
- name: lordofthejars/pacman-kikd
  newTag: 1.0.2



patches:
  - target:
      labelSelector: "app.kubernetes.io/name=pacman-kikd" #
    patch: |- #
      apiVersion: apps/v1 #
      kind: Deployment
      metadata:
        name: pacman-kikd
      spec:
        template:
          spec:
            containers:
              - name: pacman-kikd
                image: lordofthejars/pacman-kikd:1.2.0 #
  • target.labelSelector: name 대신 labelSelector를 사용하여 patch 대상을 선택할 수도 있습니다.
  • patch: Kustomize는 이 내용이 JSON Patch인지 SMP인지 자동으로 감지합니다.
  • 이 patch는 최소한의 Deployment 파일입니다.
  • image: 변경할 필드(image)만 설정하고 나머지는 그대로 둡니다.

실행 결과: 생성된 출력은 원본 deployment.yaml 파일에 새로운 컨테이너 이미지가 병합된 결과입니다. 원본의 replicas: 1은 그대로 유지됩니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: pacman-kikd
  namespace: pacman
spec:
  replicas: 1 # <-- 원본 값이 그대로 유지됨
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.0.2 # <-- 이미지만 변경됨
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

"Strategic Merge Patch (SMP)는 원본 YAML의 구조와 동일한 '부분적인' YAML 파일을 제공하여 Kustomize가 자동으로 병합하도록 하는 방식입니다."


📌 핵심 요약

  • replicas 수나 labels 같은 Kubernetes 리소스의 모든 필드를 수정하려면 patches 섹션을 사용합니다.
  • JSON Patch op (replace, add, remove), path (필드 경로), value (새 값)를 사용하여 리소스를 정밀하게 수정합니다.
  • patches.target 필드는 patch를 적용할 리소스를 group, version, kind, name, namespace 또는 labelSelector로 정확히 지정합니다.
  • Patch는 kustomization.yaml에 인라인(patch:)으로 작성하거나, 별도 파일(path:)로 분리할 수 있습니다.
  • Kustomize는 JSON Patch 외에도 '부분적인 YAML'을 병합하는 Strategic Merge Patch (SMP) 방식도 지원합니다.
  • replicas처럼 자주 변경되는 항목은 Kustomize 설정 파일 최상단에 전용 필드(replicas:)를 사용하여 더 쉽게 수정할 수 있습니다.
Comments