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.name 을 web-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