Kustomize는 Kustomization 파일을 통해 쿠버네티스 오브젝트를 사용자가 편리하게 Customize 할 수 있도록 하는 독립형 도구입니다.
쿠버네티스를 운영하다보면 동일한 애플리케이션을 운영/개발/테스트 환경으로 각각 배포해야 하는 경우가 발생합니다.
각 환경마다 환경변수나 일부 설정 값만 다르고 동일한 환경이 필요하게 되는데 이때 각 오브젝트 마다 배포 yaml 파일을 구성하는 것 보다 상속을 기반으로 일부만 변경하는 배포 파일을 작성하여 편리하게 동일한 애플리케이션을 각기 다른 환경으로 구축할 수 있도록 합니다.
Kustomize는 기존의 쿠버네티스 매니페스트 파일을 수정하거나 레이어로 조합하여 애플리케이션 배포를 구성할 수 있도록 합니다.
특정 배포 환경에 맞게 구성을 쉽게 할 수 있고 반복작업은 줄이고 중복을 피할 수 있는 장점이 있습니다.
또한, 단순 오버레이만 지원하는 것이 아니라 다양한 환경에 따라 값을 변화시키는 Patch 기능을 제공합니다.
기본 구조
Kustomize의 기본 구조는 아래와 같습니다.
kustomize
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── kic-qa
│ ├── deployment.yaml
│ └── kustomization.yaml
└── kic-st
├── deployment.yaml
└── kustomization.yaml
원본 파일이 있는 base 디렉토리와 각 환경별 디렉토리를 만들고, 변경 사항을 정의하는 patch 파일을 작성합니다.
즉, base/ 가 기본 매니페스트 파일 디렉토리, overlays/phase/ 가 각 환경 별 내용이 정의된 kustomization.yaml 파일을 작성하여 위치합니다.
kustomization.yaml 파일
kustomization.yaml 파일은 어떻게 파일을 생성하고 변경할지 방법을 기술하는 파일입니다.
그 중 resources 와 patches에 대해 설명하자면
resources 는 배포 구성에 포함될 리소스의 원본 매니페스트 파일 리스트입니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- pod.yaml
- qa/deployment.yaml
- github.com/kubernetes/kustomize/qa/...
- ns.yaml
patches 는 리소스를 수정하기 위한 파일을 지정합니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patches:
- path: qa-deployment-fix.yaml
target:
kind: Deployment
name: latast-deployment
예를 들어 아래와 같이 base/hpa.yaml 파일을 작성했다면
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: frontend-deployment-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: frontend-deployment
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
해당 hpa의 min max 값을 10, 50 으로 변경하고자 한다면
overlays/kic-qa/hpa에 아래와 같이 patch를 정의한다.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: frontend-deployment-hpa
spec:
minReplicas: 10
maxReplicas: 50
그 후 overlays/kic-qa/ 에 kustomization/yaml 파일을 작성하고 상속 받을 매니페스트 파일 의 parent 디렉토리와 파일 목록을 정의 합니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../base
patchesStrategicMerge:
#patches:
- hpa.yaml
- deployment.yaml
작성을 완료 했다면 overlays/kic-qa/ 에서 kustomize build ./ 혹은, kustomize 가 kubectl 1.14 버전 이후로 포함되어 kubectl 명령으로 kubectl apply -f ./ 명령으로도 배포가 가능하다.
이렇게 편리하게 동일한 애플리케이션을 다양한 환경으로 배포가 가능하지만 주의할 점도 있다.
예를 들어 Service를 배포할 때 기존 8080 포트를 9090 포트로 변경하는 오버레이 패치를 적용하면
8080포트가 9090 포트로 변경되는 것이 아닌 기존에 있던 8080 포트에 9090이 추가 되는 형식으로 구성된다.
왜냐하면 Service는 여러개의 Port를 가질 수 있기 때문에 오버레이가 아니라 머지가 발생하게 되는 것이다.
이런 경우에 patch에서 기존 8080포트를 삭제하고 새 포트인 9090을 작성해줘야 의도한대로 반영된다.
kustomize는 kubectl 명령으로 간편하게 동일 환경을 수정, 배포할 수 있어 유용해 보이며 CI/CD 툴과 통합하며 사용하면 더욱 편리할 것 같다고 생각한다.
참고 링크
https://www.gomgomshrimp.com/posts/k8s/helm-and-kustomize#a7416e92-222c-4962-8b9b-1894b404909d
'Docker & Kubenetes' 카테고리의 다른 글
Kubernetes Service (0) | 2024.05.14 |
---|---|
MLOps를 위한 EKS 클러스터 구축 - 2 (with. Kubeflow) (0) | 2024.04.26 |
MLOps를 위한 EKS 클러스터 구축 - 1 (with. Kubeflow) (0) | 2024.04.19 |
Deployments 와 StatefulSets (0) | 2024.04.17 |
Kubernetes - Cluster Node 제거 (1) | 2024.02.01 |