Kustomize - Patch

2026. 1. 8. 14:49·CKA

앞에서 본 commonLabels, nameSuffix, namespace 같은 Common Transformers는 “모든 리소스에 공통으로 적용”하는 데 최적입니다.
반대로, 특정 오브젝트(또는 일부 오브젝트)의 특정 필드만 바꾸고 싶다면 patches가 더 적합합니다.

예:

  • 특정 Deployment만 replicas를 1 → 5로 변경
  • 특정 Deployment만 metadata.name을 바꿈
  • 특정 리소스에서 특정 label/annotation 제거
  • 특정 Pod template에 sidecar container 하나 추가

이런 “정밀 타격”이 patches의 목적입니다.


1) Patch의 구성 요소 3가지(개념)

강의가 말한 핵심은 아래 3개입니다.

  1. Operation(무슨 동작?)
  • add : 새 값을 추가 (예: container 추가)
  • remove : 값 제거 (예: label 제거)
  • replace : 기존 값을 교체 (예: replicas 교체)
  1. Target(어떤 리소스에?)
  • kind, apiVersion, name, namespace
  • labelSelector, annotationSelector
  • 등 조합해서 “딱 그 리소스(들)”만 맞춥니다.
  1. Value(무엇으로 바꿀지?)
  • replace/add는 새로운 값이 필요
  • remove는 삭제라서 value가 보통 필요 없음

2) Patch 방식 2가지: JSON 6902 vs Strategic Merge

Kustomize 패치에는 크게 2가지 스타일이 있습니다.

  • JSON 6902 Patch: op/path/value로 매우 명확하게 “YAML 트리 경로”를 찍어서 변경
  • Strategic Merge Patch: “쿠버네티스 리소스 YAML처럼 생긴 조각”을 원본에 merge해서 변경

둘 다 가능하고, 섞어 써도 됩니다.


A. JSON 6902 Patch (inline 예시)

예시 1) Deployment 이름 변경: api-deployment → web-deployment

원본 depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 1

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - depl.yaml

patches:
  - target:
      kind: Deployment
      name: api-deployment
    patch: |-
      - op: replace
        path: /metadata/name
        value: web-deployment
  • target이 “어떤 Deployment를 바꿀지”
  • patch가 “어디를(/metadata/name) 무엇으로(web-deployment) 바꿀지”

예시 2) replicas 변경: 1 → 5

patches:
  - target:
      kind: Deployment
      name: api-deployment
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 5

path는 어떻게 잡나?

  • metadata.name → /metadata/name
  • spec.replicas → /spec/replicas
  • 더 깊으면 계속 내려갑니다. (예: /spec/template/spec/containers/0/image)

주의: 리스트(배열) 접근은 containers/0처럼 인덱스를 써야 해서, 사람이 읽기엔 다소 부담이 될 수 있습니다.


B. Strategic Merge Patch (가독성 좋은 방식)

강의에서 “원본을 복사해 와서 바꿀 부분만 남기는” 방식이 이겁니다.

예시) replicas 변경(가장 흔한 케이스)

patch-replicas.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 5

kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - depl.yaml

patchesStrategicMerge:
  - patch-replicas.yaml

장점:

  • “쿠버네티스 YAML처럼” 써서 직관적
  • path를 외울 필요가 적음
  • replicas 같이 단순 필드 변경에 특히 좋음

3) 언제 Transformers vs Patches를 쓰나(실전 기준)

Transformers가 맞는 경우(전체 공통)

  • 라벨/어노테이션을 전 리소스에 추가
  • 네임스페이스를 전 리소스에 지정
  • namePrefix/nameSuffix로 전 리소스 네이밍 규칙 통일
  • 이미지 태그를 전반적으로 교체(특정 이미지 name 기준)

Patches가 맞는 경우(정밀 타격)

  • 특정 Deployment만 replicas 변경
  • 특정 리소스 1~2개만 다른 설정 적용
  • 특정 container에만 env/volume 추가
  • 특정 리소스에서 특정 필드 제거

4) 적용 전에 결과 확인(필수 습관)

패치는 실수하면 “원치 않는 리소스가 변경”될 수 있으니, 항상 렌더링 결과를 먼저 보는 게 안전합니다.

kubectl kustomize ./k8s | less

또는 변경점만:

kubectl diff -k ./k8s

5) 개인적으로 추천하는 운영 패턴

  • base/에는 가능한 “공통”만 둔다
  • 환경별 overlays/에서
    • 공통은 transformers로 처리 (namespace, nameSuffix, commonLabels)
    • 특정 리소스의 차이는 patches로 처리 (replicas, resources, env 등)

이렇게 가면 “한눈에” 유지보수가 됩니다.


정리

  • Patches는 transformers보다 정밀하게 특정 리소스/필드만 수정하는 기능
  • Patch 구성: op(add/remove/replace) + target + value(필요 시)
  • 방식 2개:
    • JSON 6902: op/path/value로 정확하지만 리스트 경로가 읽기 어려울 수 있음
    • Strategic Merge: Kubernetes YAML처럼 작성해 가독성이 좋음(실무 선호 많음)

'CKA' 카테고리의 다른 글

Kustomize - Overlays  (0) 2026.01.08
Kustomize - Patch 심화(inline vs 파일분리, dictionary, list 조작)  (0) 2026.01.08
Kustomize - Transformers  (0) 2026.01.08
Kustomize - 여러 디렉토리 관리  (0) 2026.01.08
Kustomize - build/apply/delete  (0) 2026.01.08
'CKA' 카테고리의 다른 글
  • Kustomize - Overlays
  • Kustomize - Patch 심화(inline vs 파일분리, dictionary, list 조작)
  • Kustomize - Transformers
  • Kustomize - 여러 디렉토리 관리
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      버퍼
      jpq
      @within
      requset scope
      Thread
      gesingleresult
      프록시
      typequery
      락
      프록시 팩토리
      김영한
      jdk 동적 프록시
      @discriminatorvalue
      빈 후처리기
      log trace
      @discriminatorcolumn
      양방향 맵핑
      스레드
      reentarantlock
      조회 성능 최적화
      Target
      페치 조인
      단방향 맵핑
      hibernate5module
      자바
      고급
      @args
      WAS
      JPQL
      cglib
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Kustomize - Patch
    상단으로

    티스토리툴바