소개
Helm 은 Kubernetes 템플릿을 릴리스 단위로 패키징합니다. 반면 Kustomize 는 다른 접근 방식을 취합니다. 템플릿 표현식을 사용하는 대신 일반적인 Kubernetes YAML 에서 시작하여 그 위에 변경 사항을 계층화 (layering) 합니다. 이는 공유 베이스를 유지하면서 이름, 네임스페이스, 복제본 수 또는 패치와 같은 환경별 차이점을 적용하고자 할 때 유용합니다.
이 실습에서는 기본 Deployment 와 Service 를 생성하고, Kustomize 로 해당 베이스를 렌더링한 다음, 이름, 네임스페이스, 복제본 수 및 애플리케이션 메시지를 변경하는 프로덕션 오버레이를 생성합니다. 마지막으로 kubectl apply -k를 사용하여 오버레이를 배포하고 생성된 Service 를 테스트합니다.
Kustomize 작업 공간 준비
이 단계에서는 네임스페이스를 준비하고 kubectl을 통해 Kustomize 지원이 가능한지 확인합니다.
/home/labex/project에서 시작합니다. 이 실습에서는 기본 매니페스트와 오버레이 파일을 이 작업 공간에 보관합니다.
mkdir -p /home/labex/project
cd /home/labex/project
Kubernetes API 서버에 연결할 수 있는지 확인합니다. VM 이 막 시작되어 노드가 아직 준비되지 않은 경우, 몇 초 기다린 후 명령어를 다시 실행하세요.
kubectl get nodes --request-timeout=5s
예상 출력:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
클러스터 네트워킹 Pod 가 준비 (Ready) 상태가 될 때까지 기다립니다. 실습 마지막에 Service 를 테스트해야 하므로 클러스터 네트워킹이 정상 상태여야 합니다.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
예상 출력:
pod/calico-node-... condition met
ckad-prep-kustomize라는 이름의 네임스페이스를 생성하고 현재 네임스페이스로 설정합니다.
kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize
네임스페이스를 확인하고 kubectl kustomize를 사용할 수 있는지 확인합니다. kubectl kustomize는 리소스를 실제로 적용하지 않고 Kustomize 디렉토리를 렌더링합니다.
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'
예상 출력:
ckad-prep-kustomize
Build a set of KRM resources...
재사용 가능한 베이스 생성
이 단계에서는 일반적인 Kubernetes YAML 로부터 Kustomize 베이스를 생성합니다.
베이스는 공유되는 시작점입니다. 환경별 커스터마이징이 추가되기 전의 완전하고 유효한 Kubernetes 객체를 포함해야 합니다. 여기서는 하나의 Deployment 와 하나의 Service 를 베이스로 구성합니다. 이 애플리케이션은 MESSAGE 환경 변수의 값을 작은 웹 페이지에 기록합니다.
베이스 디렉토리를 생성합니다.
mkdir -p kustomize-demo/base
베이스 Deployment 를 작성합니다.
cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
labels:
app: kustomize-web
spec:
replicas: 1
selector:
matchLabels:
app: kustomize-web
template:
metadata:
labels:
app: kustomize-web
spec:
terminationGracePeriodSeconds: 0
containers:
- name: web
image: busybox:1.36
env:
- name: MESSAGE
value: base-v1
command:
- /bin/sh
- -c
- |
mkdir -p /www
echo "$MESSAGE" > /www/index.html
httpd -f -p 8080 -h /www
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 1
periodSeconds: 2
EOF
베이스 Service 를 작성합니다. 셀렉터는 Deployment 의 Pod 라벨과 일치합니다.
cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: kustomize-web
spec:
selector:
app: kustomize-web
ports:
- port: 80
targetPort: 8080
EOF
베이스 kustomization.yaml을 생성합니다. 이 파일은 Kustomize 에게 어떤 리소스가 베이스에 포함되는지 알려줍니다.
cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF
적용하지 않고 베이스를 렌더링해 봅니다.
kubectl kustomize kustomize-demo/base | sed -n '1,120p'
예상 출력에는 kustomize-web이라는 이름의 Service, kustomize-web이라는 이름의 Deployment, replicas: 1, value: base-v1이 포함되어야 합니다.
프로덕션 오버레이 추가
이 단계에서는 프로덕션 환경 배포를 위해 베이스를 커스터마이징하는 오버레이를 생성합니다.
오버레이는 베이스를 가리키며 변경 사항을 추가합니다. 이 오버레이는 객체를 ckad-prep-kustomize 네임스페이스에 배치하고, prod- 이름 접두사를 추가하며, Deployment 복제본을 3 개로 확장하고, MESSAGE 값을 prod-v2로 패치합니다.
오버레이 디렉토리를 생성합니다.
mkdir -p kustomize-demo/overlays/prod
Deployment 패치를 작성합니다. 패치는 원본 베이스 객체인 kustomize-web을 지정합니다. Kustomize 는 prod- 접두사를 추가하기 전에 패치를 매칭합니다.
cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
spec:
replicas: 3
template:
spec:
containers:
- name: web
env:
- name: MESSAGE
value: prod-v2
EOF
오버레이 kustomization.yaml을 생성합니다. resources 항목은 베이스를 가리키고, namespace, namePrefix, patches는 커스터마이징 내용을 설명합니다.
cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF
프로덕션 오버레이를 렌더링합니다.
kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'
예상 출력:
name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2
커스터마이징된 애플리케이션 배포 및 테스트
이 단계에서는 프로덕션 오버레이를 적용하고 생성된 Service 를 테스트합니다.
kubectl apply -k 명령어는 Kustomize 디렉토리를 렌더링하고 렌더링된 객체를 Kubernetes API 서버로 전송합니다. 임시 YAML 파일을 생성할 필요가 없습니다.
프로덕션 오버레이를 적용합니다.
kubectl apply -k kustomize-demo/overlays/prod
예상 출력:
service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created
커스터마이징된 Deployment 가 준비될 때까지 기다립니다.
kubectl rollout status deployment/prod-kustomize-web --timeout=120s
예상 출력:
deployment "prod-kustomize-web" successfully rolled out
오버레이로부터 생성된 객체를 확인합니다.
kubectl get deployment,service prod-kustomize-web
예상 출력:
deployment.apps/prod-kustomize-web 3/3
service/prod-kustomize-web
클라이언트 Pod 를 생성하여 Service 를 테스트합니다. 응답이 prod-v2여야 하며, 이는 오버레이 패치가 실행 중인 애플리케이션 구성을 성공적으로 변경했음을 증명합니다.
kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web
예상 출력:
prod-v2
요약
일반적인 Deployment 및 Service YAML 로부터 Kustomize 베이스를 구축하고, 네임스페이스, 객체 이름, 복제본 수 및 애플리케이션 메시지를 변경하는 프로덕션 오버레이를 생성했습니다. kubectl apply -k를 사용하여 오버레이를 적용하기 전에 베이스와 오버레이를 모두 렌더링해 보았으며, 최종적으로 Service 를 통해 커스터마이징된 애플리케이션이 정상 작동함을 확인했습니다.


