kustomize

개요

쿠스토마이즈는 쿠버네티스 양식 파일을 통합적으로 적용하고 관리하는데 쓰이는 툴이다.
헬름과 같이 버전 관리에도 활용할 수 있고, 다양한 설정을 할 수 있다.
kubectl에서는 -k 옵션을 통해 내장 지원하고 있다.

기본 사용법

기본적인 사용법은 아주아주 간단하다.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: my-namespace
commonLabels:
  app: foo
  environment: test
resources:
- deployment.yaml

일단 kustomization.yaml 파일을 만들고, 여기에 쿠스토마이즈로 관리할 파일 경로를 명시한다.
그 다음에 kubectl apply -k .를 하면 해당 파일을 읽고 명시된 양식 파일들을 배포한다!
image.png
이러한 방식을 조금 더 계층적으로 구성해서 다양한 환경에서 커스텀되도록 구성하는 게 가능하다.
여기에서 각 디렉토리를 이름에 맞춰서 사용해주면 되는데, 위 구성 방식은 운영 환경과 개발 환경에서 조금씩 변경 사항이 있는 조직에서 사용하는 방식이다.
일단 base 디렉토리는 루트 쿠스토마이즈가 담기는 경로로, 공통적으로 적용되는 파일들을 넣어둔다.

resources:
- ./../base
namePrefix: stag-

그리고 overlays에 있는 쿠스토마이즈 파일에는 이런 식으로 베이스 경로를 넣어주고, 또 자신의 디렉토리의 파일들을 담아주면 된다.

k apply -k someApp/overlays/development
k apply -k someApp/overlays/production

이제 개발 환경, 운영 환경을 배포할 때 이런 식으로 명령을 치기만 하면 각 환경에 커스텀된 설정으로 리소스를 적용할 수 있게 되는 것이다.

시크릿, 컨피그맵 동적 구성

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
- name: my-application-properties
  files:
  - application.properties

이렇게 시크릿이나 컨피그맵의 경우에는 동적으로 구성되도록 하는 것이 가능하다.

이미지 변경

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

images:
- name: postgres
  newName: my-registry/my-postgres
  newTag: v1
- name: nginx
  newTag: 1.8.0
- name: my-demo-app
  newName: my-app
- name: alpine
  digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3

resources:
- deployment.yaml

이런 식으로 images 필드를 통해 워크로드의 이미지를 변경하는 게 가능하다.
name 필드를 통해 해당 이미지를 찾고, newName, newTag를 붙이는 방식이다.

파일 병합

resources:
- ../base

patchesStrategicMerge:
- |-
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: deploy
  spec:
    template:
      spec:
        containers:
        - name: nginx
          image: nginx:latest  

이런 식으로 구성하면 특정 파일의 설정을 병합하는 식으로 설정이 가능하다.
이 방식은 좋은 게 다른 설정들은 안 건드리고 명시된 필드에 대해서만 추가된다는 것이다.

여기에 몇 가지 활용법이 더 있다.

        containers:
        - name: nginx
          $patch: delete 

이런 식으로 적용하려는 줄 바로 아래 $patch를 사용하면 특정 필드에 대해 더 세부적인 컨트롤이 가능하다.
위의 세팅은 컨테이너 하위 필드로 있던 nginx를 지워버리게 될 것이다.

        - name: nginx
          image: nginx:1.7.9
          $patch: replace  

이런 식으로 하면 이미지 버전을 교체하게 된다.

patchesJSON6902:
- target:
    group: apps
    version: v1
    kind: Deployment
    name: deploy
  patch: |-
    - op: replace
      path: /spec/template/spec/containers/0/image
      value: nginx:latest  

patchesJSON6902은 어떤 리소스를 타겟하는지 명시하고, 그 다음 어떤 작업을 수행하지 조금 더 명시적으로 지정한다.

관련 문서

이름 noteType created

참고