본문 바로가기

Container/Kubernetes

[K8S] Kustomize Patches

Kustomize의 patches 기능은 기존의 YAML 파일을 직접 수정하지 않고, 특정 리소스(Deployment, Service 등)의 일부 필드만 변경할 수 있도록 도와준다.
✅ 환경별(Dev, Prod 등)로 일부 설정만 다르게 적용할 때 유용
✅ 기본(Base) 리소스를 그대로 유지하면서 일부 값만 변경 가능
✅ 수정된 최종 YAML을 kustomize build로 확인 가능

✅ Remove, Replace, Add  가능

 

Json 6902 Patch   : https://datatracker.ietf.org/doc/html/rfc6902

  • Inline 방식
# Kustomization
patches:
  - target:
      kind: Deployment
      name: api-deployment
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 5

|-는 YAML 블록 문자열(block scalar) 표기법으로, 여러 줄을 포함하는 멀티라인 문자열을 작성할 때 사용됨

  • Seperate File 방식
# Kustomization
patches:
  - path: replica-patch.yaml
    target:
      kind: Deployment
      name: nginx-deployment
      
# replica-patch.yaml
- op: replicas
  path: /spec/replicas
  value: 5

 

전략적 병합 패치(Strategic merge patch)

표준 kubernetes config와 유사하게 작성된다.

patches:
  - patch: |-
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: api-deployment # 어떤 것을 바꿀지 명확하게 
      spec:
        replicas: 5
patches:
  - patch: |-
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: api-deployment
      spec:
        template:
          metadata:
            labels:
              org: KodeKloud

Patches Dictionary

    patch:
      - op: replace
        path: "/spec/replicas"
        value: 5
      - op: replace
        path: "/spec/template/spec/containers/0/image"
        value: "nginx:1.20"
      - op: add
        path: /spec/template/metadata/labels/org
        value: KodeKloud # org: KodeKloud

 

Patches List

  • 컨테이너 변경
patches:
  - target:
    kind: Deployment
    name: api-deployment
    patch: |-
      - op: replace
        path: /spec/template/spec/containers/0  # 첫 번째 컨테이너 변경
        value:
          name: haproxy
          image: haproxy
  • 컨테이너 추가
patches:
  - target:
    kind: Deployment
    name: api-deployment
    patch: |-
      - op: add   # 추가
        path: /spec/template/spec/containers/-    # -: 목록의 마지막에 append
        value:
          name: haproxy
          image: haproxy
  • Strategic Merge Patch로 List 삭제
# Kustomization
patches:
  - label-patch.yaml
  
# label-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment # 어떤 것을 바꿀지 명확하게 
spec:
  template:
    spec:
      containers:
        - $patch: delete
          name: database # 삭제하고자 하는 container 명시하기

 

실습 ] 

📄api-patches.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  template:
    spec:
      containers:
        - name: memcached
          image: memcached

📄api-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: api
  template:
    metadata:
      labels:
        component: api
    spec:
      containers:
        - name: nginx
          image: nginx

📄kustomization.yaml

resources:
  - mongo-depl.yaml
  - api-depl.yaml
  - mongo-service.yaml
  - host-pv.yaml
  - host-pvc.yaml

patches:
  - path: mongo-patch.yaml
  - path: api-patch.yaml

📄 strategic merge path를 사용해서 memcached container 삭제하기

- api-patch.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  template:
    spec:
      containers:
        - $patch: delete
          name: memcached

 

📄  inline json6902 patch를 사용해서 mongo-deployment로 부터 org: KodeKloud label 삭제하기

resources:
  - mongo-depl.yaml
  - api-depl.yaml
  - mongo-service.yaml

patches:
  - target:
      kind: Deployment
      name: mongo-deployment
    patch: |-
      - op: remove
        path: /spec/template/metadata/labels/org
        # value: null 붙여도 된다.

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Admission Controller  (0) 2025.02.24
[K8S] Kustomize Overlay/Components  (0) 2025.02.24
[K8S] Kustomize Transformers  (0) 2025.02.23
[K8S] Kustomize build  (0) 2025.02.22
[K8S]Kustomize  (1) 2025.02.21