반응형
Kustomize란?
❈ kubernetes 1.14부터 kustomize는 내장되었다.
Kustomize는 Kubernetes 리소스를 YAML 파일로 관리하면서, 중복 없이 다양한 환경에 맞춰 쉽게 리소스를 커스터마이징할 수 있는 도구입니다. Base와 Overlay 개념을 통해 공통 리소스를 정의하고, Overlay에 대한 내용을 상속받아 환경별로 다르게 적용 가능하다.
Kustomize와 Helm 비교
kubernetes를 사용하면서, 대표적인 배포 도구 helm, kustomize 에 대해서 비교해 본다.
- Helm: 패키징된 Chart를 사용해 전체 애플리케이션을 배포하고 관리하며, 변수화와 템플릿화를 지원한다.
- Kustomize: 기존 YAML 파일을 커스터마이징하는 방식으로, 패키징된 차트가 필요하지 않다. 또한, kustomize를 통해서 쿠버네티스 오브젝트(ConfigMap, Secret)을 선언적으로 관리할 수 있다.
- 장단점 비교
- Helm의 장점: 템플릿화된 구성을 사용하여 복잡한 애플리케이션을 쉽게 배포 가능해진다. (잘 세팅된 내용을 가져오기 용이함)
- Kustomize의 장점: 단순하고 선언적인 방식으로 YAML 파일을 관리, 로직이 없이 순수 YAML 파일만 사용한다. 상속을 통해 커스터마이징이 용이하다.
디렉터리
- patch에는 deployment, service에 대한 규격을 맞출 필요 없이 변경되는 부분만 작성한다.
- base이미지에, patch에서 변경되는 내역이 상속되어 배포된다.
- kustomization.yaml에는, base가 될 내용과, patch 내용이 포함되면 된다. ConfigMap, Secret도 포함된다.
my-app/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── patch.yaml
└── prod/
├── kustomization.yaml
└── patch.yaml
Kustomize 동작 방식
- 패치(patch) 방식
- 패치는 기존 Kubernetes 리소스의 일부를 수정하거나 덮어쓸 때 사용된다. kustomize파일에 패치 리소스를 추가하여 기본 리소스의 속성을 변경할 수 있다.
- 환경에 따라 리소스의 특정 필드만 수정할 때 유용하다.
- overlay 방식
- overlay는 기본 리소스(base) 위에 추가적인 설정을 덧붙여 최종 리소스를 생성하는 방식이다. 기본 리소스에 여러 개의 오버레이를 적용할 수 있어 환경별로 리소스를 쉽게 관리할 수 있다.
- 공통 리소스(base) 설정을 유지하면서 환경별로 필요한 설정을 오버레이하여 각각의 환경에 적합한 Kubernetes 리소스를 추가로 생성할 수 있다.
실습
💡kustomize를 통해 config, secret을 선언적으로 생성해보고, overlay를 통해 환경마다 다른 nodeport를 설정해본다.
- v1.21부터는 Kustomize 기능이 내장되어 있어 별도의 설치 없이 사용할 수 있다.
kubectl kustomize ./
- Base와 Overlay 구조
- 디렉토리 구조
➜ hellospring . ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml ├── dev │ ├── dev.properties │ ├── kustomization.yaml │ └── service.yaml └── prod ├── kustomization.yaml ├── prod.properties └── service.yaml
- Base 디렉토리 내 파일 생성
# /base/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hellospring-deployment spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: hellospring-container image: suhyeonsong/hellospring:latest ports: - containerPort: 3000 # /base/service.yaml apiVersion: v1 kind: Service metadata: name: hellospring-service spec: type: NodePort selector: app: backend ports: - port: 3000 targetPort: 3000 nodePort: 30001 # /base/kustomization.yaml resources: - deployment.yaml - service.yaml
- kustomize를 통한 k8s리소스 출력
kubectl kustomize ./
아래와 같이 kustomize파일에 넣은 service, deployment가 출력된다.
- Overlay 적용 (개발 환경):
kubectl apply -k ./overlays/dev
- 이제, base를 기반하여 dev환경에 맞춘 service 구성과, config파일을 overlay한다.
# dev/dev.properties
FOO=dev
# dev/kustomization.yaml
namePrefix: dev-
resources:
- ../base
patches:
- path: service.yaml # 패치할 파일 경로
target:
kind: Service # 패치할 리소스의 종류
name: hellospring-service # 패치할 리소스의 이름
configMapGenerator:
- name: test-configuration
files:
- dev.properties
# dev/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hellospring-service
spec:
ports:
- port: 3000
nodePort: 30002
- 이제, overlay가 올바르게 되었는지 확인을 진행한다.
아래와 같이
- config 파일 생성
- dev에 대한 모든 자원에 prefix로 dev가 붙여 네이밍 되었다.
- nodeport가 변경되었다.
- 이제 의도된 바와 같이 설정된 것을 확인하였으니, 배포를 시작해본다.
kubectl apply -k ./
아래와 같이 정상적으로 배포된 것을 볼 수 있다.
- 삭제를 진행할때는 아래와 같이 진행한다.
kubectl delete -k ./
- 나머지 운영계도 배포를 진행한다.
# prod/kustomization.yaml
namePrefix: prod-
resources:
- ../base
patches:
- path: service.yaml # 패치할 파일 경로
target:
kind: Service # 패치할 리소스의 종류
name: hellospring-service # 패치할 리소스의 이름
configMapGenerator:
- name: prod-configuration
files:
- prod.properties
# prod/prod.properties
FOO=prod
# prod/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hellospring-service
spec:
ports:
- port: 3000
nodePort: 30003
➜ prod git:(main) ✗
반응형
'사이드 프로젝트' 카테고리의 다른 글
[CI/CD 프로젝트] Ingress 를 통한 외부 트래픽 관리 (0) | 2024.11.20 |
---|---|
[CI/CD 프로젝트] Helm 구조와 Helm Chart 생성 방법 (0) | 2024.11.20 |
[CI/CD 프로젝트] K8S - Calico 내부 동작 이해 (0) | 2024.11.19 |
[CI/CD 프로젝트] K8S - kubeadm으로 Kubernetes Cluster 구축하기 (0) | 2024.11.19 |
[CI/CD 프로젝트] K8S - Containerd 내부 구조 이해 (0) | 2024.11.19 |