Kubernetes Deployment 실습 튜토리얼 – NestJS 마이크로서비스 배포하기
마이크로서비스 아키텍처를 실제 운영 환경에 올릴 때 가장 많이 쓰는 도구가 바로 Kubernetes(K8s)입니다.
이번 글에서는 Kubernetes의 핵심 개념 중 하나인 Deployment를 다루고, deployment.yml 과 rolling_update.yml을 활용해 실제로 어떻게 배포와 업데이트가
진행되는지를 실습 형태로 정리해보겠습니다.
1. Deployment란 무엇인가?
Deployment는 Kubernetes에서 애플리케이션 배포와 관리를 자동화하는 리소스입니다.
쉽게 말해, "내가 원하는 Pod가 몇 개 떠 있어야 하는지, 어떤 이미지를 사용할지, 업데이트는 어떤 방식으로 진행할지" 등을 선언적으로 기술하는 설계도입니다.
비유하자면,
ReplicaSet이 "Pod 복제 관리인"이라면,
Deployment는 "전체 서비스 운영 매니저"라고 할 수 있습니다.
Deployment는 ReplicaSet을 내부적으로 생성 및 관리하면서, 새로운 버전으로 교체할 때는 롤링 업데이트(Rolling Update) 방식으로 순차적으로 교체합니다.
2. 실습 준비: deployment.yml
먼저 가장 기본적인 배포 파일인 deployment.yml을 작성해봅니다.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: apps: nginx-app type: back-end spec: replicas: 3 template: metadata: labels: app: nginx-app type: back-end spec: containers: - name: nginx-container image: nginx ports: - containerPort: 80 selector: matchLabels: app: nginx-app type: back-end
해설
replicas: 3 → Nginx Pod를 3개 띄우겠다는 의미입니다.
template.metadata.labels → Pod를 구분하는 라벨. Service나 ReplicaSet이 Pod를 식별할 때 사용합니다.
containers.image: nginx → 기본 Nginx 최신 이미지를 사용합니다.
즉, 이 파일을 적용하면 nginx 컨테이너가 3개 떠 있는 Pod가 자동으로 생성됩니다.
3. 배포 적용 및 결과 확인
이제 실제로 배포를 적용합니다.
kubectl apply -f 3_deployment
출력 결과:
deployment.apps/nginx-deployment created
Deployment가 잘 생성되었는지 확인해보죠.
kubectl get replicaset
결과:
NAME DESIRED CURRENT READY AGE nginx-deployment-5b44f47bc9 3 3 3 14s
ReplicaSet이 자동으로 생성되었고, Pod 3개가 정상적으로 Running 상태임을 확인할 수 있습니다.
kubectl get pod
결과:
nginx-deployment-5b44f47bc9-7jfpr 1/1 Running 0 41s nginx-deployment-5b44f47bc9-tskqx 1/1 Running 0 41s nginx-deployment-5b44f47bc9-z2q8m 1/1 Running 0 41s
4. Rolling Update 실습: rolling_update.yml
서비스를 운영하다 보면 버전 업그레이드가 필요합니다.
바로 이때 사용하는 것이 Rolling Update 전략입니다.
rolling_update.yml 파일을 보겠습니다.
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: apps: nginx-app type: back-end spec: replicas: 20 template: metadata: labels: app: nginx-app type: back-end spec: containers: - name: nginx-container image: nginx:1.19 ports: - containerPort: 80 selector: matchLabels: app: nginx-app type: back-end strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
해설
replicas: 20 → Pod 개수를 20개로 늘립니다.
image: nginx:1.19 → 버전을 명시적으로 1.19로 고정합니다.
strategy.RollingUpdate → 한 번에 Pod를 다 바꾸는 게 아니라, 최대 1개만 새로 생성하고 1개만 중단하면서 천천히 교체합니다.
즉, 서비스가 중단되지 않고 점진적으로 새 버전으로 바뀌는 것이 핵심입니다.
5. Rolling Update 실행 및 결과
Rolling Update를 적용합니다.
kubectl apply -f ./3_deployment/rolling_update.yml
출력:
deployment.apps/nginx-deployment configured
Pod 상태를 확인해보면, 기존 Pod가 하나씩 종료되고 새로운 Pod가 생성되는 것을 확인할 수 있습니다.
kubectl get pod
일부 출력:
nginx-deployment-5b44f47bc9-cn4mr 1/1 Terminating 0 2m46s nginx-deployment-75f6448cc6-5g8nj 1/1 Running 0 54s nginx-deployment-75f6448cc6-8mxg6 0/1 ContainerCreating 0 5s
또한 ReplicaSet도 점차 교체됩니다.
kubectl get replicaset
변화 과정:
nginx-deployment-5b44f47bc9 3 → 2 → 1 → 0 nginx-deployment-75f6448cc6 1 → 19 → 20
즉, 구버전 ReplicaSet은 점점 줄어들고, 새 버전 ReplicaSet이 20개로 확대된 것을 확인할 수 있습니다.
6. Deployment와 Rolling Update의 관계
정리하자면,
deployment.yml → 초기 배포 정의서
rolling_update.yml → 기존 Deployment를 업데이트 전략(RollingUpdate)으로 변경한 버전
즉, 두 파일은 별개의 Deployment가 아니라 같은 Deployment 리소스의 다른 버전 관리 방식을 보여줍니다.
Deployment는 ReplicaSet을 관리하며, Rolling Update 전략을 통해 서비스 무중단 업데이트를 보장합니다.
7. 응용 포인트
실서비스 운영: 버그 수정이나 버전 업그레이드 시, Rolling Update 전략을 활용하면 무중단 배포가 가능합니다.
Blue-Green Deployment나 Canary Deployment 같은 전략으로도 확장할 수 있습니다.
NestJS 마이크로서비스도 이런 방식으로 손쉽게 배포 및 확장할 수 있습니다.
✅ 이 전체 내용 요약
Deployment는 Kubernetes에서 Pod를 선언적으로 관리하는 핵심 리소스다.
deployment.yml을 통해 기본적인 Pod(nginx 3개)를 배포했다.
rolling_update.yml을 통해 버전을 nginx:1.19로 올리고, Pod를 20개로 확장하면서 무중단 롤링 업데이트를 수행했다.
Deployment → ReplicaSet → Pod 구조의 관계와 업데이트 과정이 실제로 어떻게 동작하는지 확인했다.
이 방식은 NestJS 같은 마이크로서비스를 운영 환경에 안정적으로 배포할 때 매우 유용하다.
댓글 ( 0)
댓글 남기기