Kustomize Basics


k8s/
├── base/
│	├── kustomization.yaml
│	├── nginx-depl.yaml
│	├── service.yaml
│	└── redis-depl.yaml
└── overlays/
 	├── dev/
    │   ├── kustomization.yaml
    │   └── config-map.yaml
 	├── stg/
    │   ├── kustomization.yaml
    │   └── config-map.yaml
 	└── prod/
        ├── kustomization.yaml
        └── config-map.yaml

Kustomize 는 Environment 별 다른 설정값을 주기 위해 사용되는 툴이다. 기본적으로 base 에 기본값이 포함된 yaml 파일들을 넣어두고 overlay 에서 Environment 별 값들을 추가해주는 식이다.

Helm 의 경우 go template 형식으로 설정값들을 주입하지만 Kustomize 는 순수 yaml 파일로 구성되기 때문에 훨씬 읽기 편하다는 장점이 있다. 다만 Helm 과 달리 패키지 매니저 역할을 하진 않는다.

# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
 
resources:
  - nginx-deployment.yaml
  - nginx-service.yaml
 
commonLabels:
  company: KodeKloud

위와 같이 적용할 파일들을 추가해준 뒤 추가할 내용을 아래 적어주면 된다.

kustomize build k8s/

Kustomize 의 경우 설정값을 주입한 후 yaml 파일의 모습을 출력하기만 할 뿐 실제로 apply 하진 않는다.

kustomize build k8s/ | kubectl apply -f -
kubectl apply -k k8s/

위와 같은 명령어를 사용하면 설정값이 적용된 Object 들을 그대로 apply 할 수 있다.

k8s/
├── kustomization.yaml
├── api/
│   └── kustomization.yaml
├── db/
│   └── kustomization.yaml
├── cache/
│   └── kustomization.yaml
└── kafka/
	└── kustomization.yaml
# k8s/kustomization.yaml

resources:
  - api/
  - db/
  - cache/
  - kafka/

여러 리소스를 한 번에 관리할 경우 각 리소스 마다 kustomization.yaml 을 선언해 준 뒤 최상위 kustomization.yaml 에서 사용할 수 있도록 설정해줄 수 있다.

Transformers


Common Transformers

commonLabels:
  org: OrgLabel
 
namespace: lab
 
namePrefix: Org-
 
nameSuffix: -dev
 
commonAnnotations:
  branch: master

위와 같은 Transformer 들을 활용해 yaml 파일을 조작할 수 있다.

  • commonLabels
    • Resource 에 Label 을 추가한다.
  • namePrefix/Suffix
    • Resource 이름 앞 또는 뒤에 단어를 추가한다.
  • namespace
    • Resource 가 속할 namespace 를 지정한다.
  • commonAnnotations
    • Resource 에 Annotation 을 추가한다.

Image Transformers

images:
  - name: nginx
    newName: haproxy
    newTag: 2.4

nginx 라는 이미지를 사용하는 Resource 를 haproxy:2.4 로 변경한다.

Patches


patches:
- target:
    kind: Deployment
    name: api-deployment
  patch: |-
    - op: replace
      path: /metadata/name
      value: web-deployment

Patch 를 사용하면 실제 설정값을 조작할 수 있다. 위 예시는 api-deployment 라는 이름을 가진 Deployment Object 의 metadata.nameweb-deployment 로 변경하는 예시다.

Overlays


bases:
  - ../../base

resources:
  - grafana-depl.yaml

patch: |-
  - op: replace
    path: /spec/replicas
    value: 2

Overlay 에서 base 에 있는 리소스를 변경하고 추가해야할 경우 위처럼 작성할 수 있다.

Components


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

resources:
  - postgres-depl.yaml

secretGenerator:
  - name: postgres-cred
    literals:
	  - password=postgres123

patches:
  - deployment-patch.yaml

특정 환경에만 Component 를 추가해야할 경우 위와 같이 추가할 수 있다.

References