Kustomize 를 사용한 애플리케이션 커스터마이징

KubernetesBeginner
지금 연습하기

소개

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 를 통해 커스터마이징된 애플리케이션이 정상 작동함을 확인했습니다.