디플로이먼트 (Deployment) 생성하기

KubernetesBeginner
지금 연습하기

소개

파드 (Pod) 는 컨테이너를 실행하지만, 파드 단독으로는 쿠버네티스에서 애플리케이션을 운영하는 일반적인 방식이 아닙니다. 디플로이먼트 (Deployment) 는 애플리케이션의 원하는 상태를 기술하며, 레플리카셋 (ReplicaSet) 을 생성하여 파드를 만들고 유지 관리합니다.

이번 실습에서는 첫 번째 디플로이먼트를 생성하고, 사용 가능 상태가 될 때까지 기다린 후, 생성된 디플로이먼트, 레플리카셋, 파드를 검사합니다. 마지막으로 파드를 삭제했을 때 디플로이먼트가 어떻게 파드를 복구하는지 확인합니다. 이는 향후 CKAD 주제인 스케일링, 롤링 업데이트, 롤백, 애플리케이션 노출 등을 학습하기 위한 기초가 됩니다.

디플로이먼트 네임스페이스 준비

이 단계에서는 디플로이먼트 실습을 위한 깨끗한 네임스페이스를 준비하고, 해당 네임스페이스를 기본값으로 설정합니다.

/home/labex/project에서 시작합니다. 이번 실습에서는 매니페스트 파일을 직접 작성할 필요는 없지만, 동일한 작업 공간을 사용하는 것이 학습의 일관성을 유지하는 데 도움이 됩니다.

mkdir -p /home/labex/project
cd /home/labex/project

쿠버네티스 API 서버에 접근 가능한지 확인합니다. VM 이 막 시작된 상태라면 이 명령어가 실패할 수 있습니다. 몇 초간 기다린 후 노드 상태가 Ready가 될 때까지 다시 실행하세요.

kubectl get nodes --request-timeout=5s

예상 출력 결과:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

파드가 Ready 상태가 되려면 클러스터 네트워킹 플러그인이 필요합니다. 애플리케이션 워크로드를 생성하기 전에 Calico 노드 파드가 준비될 때까지 기다립니다.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

예상 출력 결과:

pod/calico-node-... condition met

ckad-prep-deployments라는 이름의 네임스페이스를 생성합니다.

kubectl create namespace ckad-prep-deployments

명령어가 성공적으로 실행되면 다음과 같이 확인됩니다.

namespace/ckad-prep-deployments created

이 네임스페이스를 현재 컨텍스트의 기본 네임스페이스로 설정합니다.

kubectl config set-context --current --namespace=ckad-prep-deployments

현재 네임스페이스를 확인합니다.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

예상 출력 결과:

ckad-prep-deployments

디플로이먼트 생성

이 단계에서는 두 개의 레플리카를 가진 web-demo라는 이름의 디플로이먼트를 생성합니다.

kubectl create deployment 명령어는 쿠버네티스에 디플로이먼트 객체 생성을 요청합니다. --image 옵션은 파드 템플릿의 컨테이너 이미지를 설정하며, --replicas=2는 디플로이먼트가 두 개의 파드를 항상 실행 상태로 유지하도록 합니다.

kubectl create deployment web-demo --image=registry.k8s.io/pause:3.10.1 --replicas=2

예상 출력 결과:

deployment.apps/web-demo created

디플로이먼트 롤아웃이 완료될 때까지 기다립니다. 새로운 디플로이먼트의 경우, 롤아웃 상태는 쿠버네티스가 레플리카셋을 생성하고 요청된 파드들이 사용 가능한 상태가 되었음을 의미합니다.

kubectl rollout status deployment/web-demo --timeout=90s

파드가 준비되는 동안 짧은 대기 메시지가 출력될 수 있습니다. 최종적으로는 다음 메시지가 나타납니다.

deployment "web-demo" successfully rolled out

이제 디플로이먼트 요약을 확인합니다.

kubectl get deployment web-demo

예상 출력 결과:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

레플리카셋과 파드 검사

이 단계에서는 디플로이먼트 하위에 생성된 객체들을 검사합니다.

디플로이먼트는 컨테이너를 직접 실행하지 않습니다. 대신 레플리카셋을 생성하고, 레플리카셋이 파드를 생성합니다. 디플로이먼트의 셀렉터 (selector) 와 파드 템플릿의 레이블 (label) 이 이 객체들을 서로 연결합니다.

먼저 디플로이먼트의 셀렉터 레이블과 템플릿 레이블을 확인합니다. JSONPath 를 사용하면 필요한 필드만 출력하여 결과를 명확하게 볼 수 있습니다.

kubectl get deployment web-demo -o 'jsonpath={.spec.selector.matchLabels.app}{" "}{.spec.template.metadata.labels.app}{"\n"}'

예상 출력 결과:

web-demo web-demo

첫 번째 값은 디플로이먼트 셀렉터 레이블이고, 두 번째 값은 템플릿에서 파드에 부여된 레이블입니다. 두 값이 일치하므로 디플로이먼트가 해당 파드들을 관리할 수 있습니다.

디플로이먼트에 의해 생성된 레플리카셋을 나열합니다.

kubectl get replicasets -l app=web-demo

예상 출력 결과:

NAME                  DESIRED   CURRENT   READY   AGE
web-demo-...          2         2         2       ...

이제 동일한 레이블을 가진 파드들을 나열합니다.

kubectl get pods -l app=web-demo --show-labels

예상 출력 결과 (두 개의 실행 중인 파드):

NAME                        READY   STATUS    RESTARTS   AGE   LABELS
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...
web-demo-...                1/1     Running   0          ...   app=web-demo,pod-template-hash=...

마지막으로 각 파드의 소유자 (owner) 종류를 확인합니다. 각 파드는 디플로이먼트가 아닌 레플리카셋에 의해 소유됩니다.

kubectl get pods -l app=web-demo -o 'custom-columns=NAME:.metadata.name,OWNER:.metadata.ownerReferences[0].kind,PHASE:.status.phase'

예상 출력 결과:

NAME                        OWNER        PHASE
web-demo-...                ReplicaSet   Running
web-demo-...                ReplicaSet   Running

원하는 상태 복구 관찰

이 단계에서는 현재 실행 중인 파드들을 삭제하고 디플로이먼트가 어떻게 원하는 상태를 복구하는지 관찰합니다.

이것이 단일 파드와 디플로이먼트의 핵심적인 차이점입니다. 독립적인 파드를 삭제하면 파드는 사라지지만, 디플로이먼트가 관리하는 파드를 삭제하면 디플로이먼트가 실제 상태가 원하는 상태와 일치하지 않음을 감지하고 즉시 대체 파드를 생성합니다.

app=web-demo 레이블을 가진 파드들을 삭제합니다. --wait=false 옵션을 사용하면 삭제 요청을 보낸 직후 명령어가 반환되므로, 이전 파드가 완전히 사라지기 전에 복구 과정을 관찰할 수 있습니다.

kubectl delete pods -l app=web-demo --wait=false

예상 출력 결과:

pod "web-demo-..." deleted from ckad-prep-deployments namespace
pod "web-demo-..." deleted from ckad-prep-deployments namespace

디플로이먼트가 다시 사용 가능 상태가 될 때까지 기다립니다.

kubectl wait --for=condition=Available deployment/web-demo --timeout=90s

예상 출력 결과:

deployment.apps/web-demo condition met

파드 목록을 다시 확인합니다.

kubectl get pods -l app=web-demo

예상 출력 결과 (두 개의 실행 중인 파드): 레플리카셋이 대체 파드를 생성했기 때문에 파드 이름은 이전과 다를 수 있습니다.

NAME                        READY   STATUS    RESTARTS   AGE
web-demo-...                1/1     Running   0          ...
web-demo-...                1/1     Running   0          ...

디플로이먼트 요약을 다시 한번 확인합니다.

kubectl get deployment web-demo

예상 출력 결과:

NAME       READY   UP-TO-DATE   AVAILABLE   AGE
web-demo   2/2     2            2           ...

요약

이번 실습에서는 디플로이먼트를 생성하고, 롤아웃을 기다리고, 셀렉터와 파드 템플릿 레이블을 검사하고, 생성된 레플리카셋과 파드를 확인한 뒤, 파드 삭제 후 원하는 상태가 복구되는 과정을 관찰했습니다. 이러한 개념들은 레플리카 수 변경, 애플리케이션 업데이트, 롤아웃 동작 관리 등을 다루는 다음 디플로이먼트 실습을 위한 준비 과정입니다.