현대 오토에버 클라우드 스쿨
Kustomize
Gom3rye
2025. 8. 11. 17:45
728x90
반응형
Kustomize
묶어서 배포할 수 있게 해주는 것
- 쿠버네티스 커뮤니티 sig-cli가 제공하는 매니페스트 템플레이팅 툴
- 환경마다 매니페스트를 생성하거나 특정 필드를 덮어쓰는 기능이 있어서 효율적으로 매니페스트를 생성할 수 있다.
- 헬름은 설정을 채워나가는 방식인데 반해 kustomize는 기본값을 덮어쓰는 형태로 설정할 수 있는 것이 특징이다.
- kustomize라는 별도의 명령어가 있었는데 현재는 kubectl의 하위 명령어
여러 매니페스트 결합
- sample-deployment.yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas:
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
# 리소스 생성
kubectl apply -f sample-deployment.yaml
- service-lb.yaml 작성
apiVersion: v1
kind: Service
metadata:
name: sample-lb
spec:
type: LoadBalancer
ports:
- name: "http-port"
protocol: "TCP"
port: 8080
targetPort: 80
nodePort: 30082
selector:
app: sample-app
# 리소스 생성
kubectl apply -f service-lb.yaml
# 지금은 잘 되지만 sample-deployment로 만들어진 pod를 지우고 curl 192.168.56.240:8080 (EXTERNAL-IP:PORT) 해보면 안 됨
# -> pod가 없기 때문 => 애플리케이션을 만들고 service를 만들어야 하는데 그러지 못한 케이스
애플리케이션 만들고 service 만들기
service 지우고 애플리케이션 지우기
- 2개의 리소스 파일을 묶어주는 kustomization.yaml 파일 생성
resources:
- sample-deployment.yaml
- service-lb.yaml
# 빌드 결과 미리보기 (See the rendered YAML from Kustomize.)
kubectl kustomize kustomization.ymal파일경로
kubectl kustomize .
# 적용
kubectl apply -k kustomization.yaml파일경로
kubectl apply -k .
# 확인
kubectl get svc
## service가 만들어져 있다.
## sample-lb LoadBalancer 10.105.104.213 192.168.56.240 8080:30082/TCP 2m51s
# 삭제
kubectl delete -k .


네임스페이스 바꾸기
namespace: sample-namespace
resources:
- sample-deployment.yaml
- service-lb.yaml
# 네임스페이스 없으면 만들기
kubectl create namespace sample-namespace
# 리소스 생성
kubectl apply -k .
# 네임스페이스가 sample-namespace로 바뀌었기 때문에 kubectl get pods 하면 아무것도 안나옴
# 해당 네임스페이스에서 확인
kubectl get pods -n sample-namespace
## sample-deployment-774c976f8d-mn66j 1/1 Running 0 21s
공통된 이름 부여
- namePrefix와 nameSuffix를 이용하면 공통된 이름을 부여할 수 있다.
namePrefix: prefix-
nameSuffix: -suffix
resources:
- sample-deployment.yaml
- service-lb.yaml
# kubectl get service -n sample-namespace로 항상 지워줘야 한다. (nodeport는 중복 안되니까)
kubectl apply -k .
## service/prefix-sample-lb-suffix created
## deployment.apps/prefix-sample-deployment-suffix created
kubectl get pods
## prefix-sample-deployment-suffix-774c976f8d-9lp5m 1/1 Running 0 43s
공통 메타데이터 설정
- commonLabel이나 commonAnnotations를 이용하면 리소스에 공통 레이블이나 어노테이션을 부여할 수 있다.
commonLabels:
label1: label1-val
commonAnnotations:
annotation: annotation1-val
resources:
- sample-deployment.yaml
- service-lb.yaml
# 리소스 생성
kubectl apply -k .
kubectl describe pod sample-deployment
## 결과
Labels: app=sample-app
label1=label1-val
이미지 변경
- images 를 사용하면 리소스에 사용되는 이미지를 변경할 수 있다.
- 이름에 일치하는 이미지는 모두 변경되기 때문에 여러 deployment 등이 이는 경우 모두에 영향을 준다.
images:
- name: nginx
newName: amsy810/echo-nginx
newTag: v2.0
resources:
- sample-deployment.yaml
- service-lb.yaml
오버레이로 값 덮어 쓰기
- 메타 데이터 계열의 필드는 이전 방식으로 수정이 가능하다.
- 세부적인 설정은 오버레이 기능을 이용해서 리소스에 대해 패치해서 변경 가능하다.
- 서비스 환경이나 스테이징마다 레플리카 수나 CPU/메모리 리소스 변경을 쉽게 수행한다.
- 디렉토리 안에 기본 매니페스트를 등록해두고 bases로 설정한다.
- 서비스 환경이나 스테이징 또는 시스템의 환경에 따라 설정을 덮어쓰기 하는 매니페스트를 patches로 지정한다.
실습
- kustomization.yaml 파일 수정
resources:
- sample-deployment.yaml
- service-lb.yaml
patches:
- path: patch-replicas.yaml
target:
kind: Deployment
name: sample-deployment
- patch-replicas.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 10
- kubectl apply -k . 후에 kubectl kustomize . 을 해보면 replicas가 10으로 바뀐 것을 볼 수 있다.
Production 환경과 Staging 환경 나누어서 배포

- staging 디렉토리 생성
- 디렉토리 내부에 kustomization.yaml 생성
resources:
- ../../base
patches:
- path: patch-replicas.yaml
target:
kind: Deployment
name: sample-deployment
images:
- name: nginx
newTag: staging
- staging 디렉토리 내부에 patch-replicas.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 1
- production 디렉토리 생성
- 디렉토리 내부에 kustomization.yaml 생성
resources:
- ../../base
patches:
- path: patch-replicas.yaml
target:
kind: Deployment
name: sample-deployment
images:
- name: nginx
newTag: production
- production 디렉토리 내부에 patch-replicas.yaml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 1
Configmap과 시크릿의 동적 생성
- 새로 생성된 컨피그맵의 이름은 데이터 구조에서 계산 해시값이 접미사로 부여된다.
- 컨피그맵 데이터가 변경된 경우에는 새로운 이름으로 컨피그맵이 생성된다.
- 새로운 컨피그맵이 만들어지더라도 이전 컨피그맵은 그대로 남아 있다.
- 실습
- generate-sample 이라는 디렉토리를 생성
- sample-deployment.yaml 파일 작성
- vi generate-sample/sample-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
envFrom:
- configMapRef:
name: generated-configmap
- 값을 저장할 sample.txt 파일 생성 (/generate-sample 폴더 안에)
- vi generate-sample/sample.txt
- this is a testfile. 작성
- kustomization.yaml 파일 생성
resources:
- sample-deployment.yaml
configMapGenerator:
- name: generated-configmap
literals:
- KEY1=VAL1
files:
- ./sample.txt
kyla@masternode:~/kustomize$ kubectl apply -k generate-sample
## configmap/generated-configmap-bdk6h5tgt4 created
## deployment.apps/sample-deployment created
→ 현재까지의 위치는 모두 kustomize 폴더고 kubectl kustomize generate-sample 을 해보면 generated-configmpa이 생성되는 걸 미리 볼 수 있다.
kubectl 의 kustomize 하위 명령
- kustomize: 결과로 만들어질 yaml 파일의 결과를 보여준다.
- kubectl kustomize base
- kubectl kustomize generate-sample
- apply -k: 적용
- get -k: 정보 조회

- describe -k: 자세히 보기
- build 결과 저장 (-o 옵션 이용)
Helm
쿠버네티스의 패키지 관리자
- 레드햇 계열의 Yum이나 데비안 계열의 APT에 해당하는 개념
- 오픈 소스 소프트웨어
- 레디스 클러스터 구성이나 워드 프레스 환경 등의 소프트웨어를 하나의 명령어로 쿠버네티스 클러스터에 배포할 수 있다.
- 롤링 업데이트 등에서 지원하는 것이 많아서 쿠버네티스에 최적화된 설정으로 사용할 수 있는 장점이 있다.
헬름 설치
- 다운로드 받아서 직접 설치: curl -sL https://get.helm.sh/helm-v버전-운영체제종류-amd64.tar.gz -o 저장파일경로
- curl -sL https://get.helm.sh/helm-v3.18.4-linux-amd64.tar.gz -o /tmp/hel.tar.gz
- 압축 해제: tar -xvf /tmp/hel.tar.gz
- helm을 아무데서나 호출할 수 있도록 /usr/local/bin으로 이동
- sudo mv linux-amd64/helm /usr/local/bin/helm
- 실행 권한 부여
- sudo chmod 755 /usr/local/bin/helm
- 자동 완성 기능 활성화
- source <(helm completion bash)
- 스크립트를 받아서 설치 (자동으로 최신 버전을 받아서 설치)
- 패키지 매니저(apt, yum, brew 등)를 이용해서 설치
Chart
- 쿠버네티스 리소스들을 패키지 형태로 묶어 놓은 배포 단위
- 쿠버네티스 앱을 배포하기 위한 설치 패키지
- 역할
- 애플리케이션 설치 자동화: Deployment, Service, ConfigMap, Ingress 등 여러 리소스를 한 번에 설치
- 환경별 설정 분리: values.yaml 파일에서 dev/prod 설정만 변경해서 재사용
- 버전 관리: 차트 버전을 지정해서 동일한 배포를 재현 가능
- 의존성 관리: 다른 차트와 함께 배포 가능
저장소 추가
- 헬름은 기본적으로 저장소가 설정되어 있지 않는다.
- stable 저장소 추가
- 헬름이 관리하는 공식 차트는 각각의 성숙도에 따라 stable과 incubator로 구분한다.
- 각 차트는 github에서 관리한다.
- stable과 incubator의 차이
- 업데이트 가능 여부
- 데이터 영속성 가능
- 보안
- 적절한 기본값이 제공
- 쿠버네티스 모범 사례에 따라 설정
저장소 추가
helm repo add stable https://charts.helm.sh/stable

- bitnami 저장소 추가
- bitnami 저장소: Bitnami가 유지 관리하는 인기 오픈소스 애플리케이션 차트를 모아 놓은 공식 차트 레포지토리
- MySQL, WordPress, Redis, Nginx, Kafka 같은 앱들을 쉽게 배포 가능
- 대부분 production ready 수준의 앱들이라서 테스트 뿐 아니라 배포에도 사용 가능하다.
저장소 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
저장소 확인
- helm repo list

- 저장소 업데이트
- helm repo update
wordpress 설치 및 삭제
검색 (저장소만 검색)
- helm search repo wordpress
artifact hub
- 여러 헬름 저장소를 통합 검색할 수 있는 서비스
- 헬름 커뮤니티가 관리하는 저장소는 물론 다양한 OSS(Open Source Software) 가 제공하는 헬름 저장소도 등록되어 있다.
- 여기서 검색할 때는 repo 대신에 hub를 설정해서 검색
- helm search hub wordpress
- 설정 가능한 파라미터 확인
- helm show values bitnami/wordpress
- readme 확인
- helm show readme bitnami/wordpress
설치 및 삭제
helm install sample-wordpress bitnami/wordpress --version 25.0.8
helm uninstall sample-wordpress
728x90
반응형