Nodejs

 

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 DeploymentCanary Deployment 같은 전략으로도 확장할 수 있습니다.

  • NestJS 마이크로서비스도 이런 방식으로 손쉽게 배포 및 확장할 수 있습니다.

 

 

✅ 이 전체 내용 요약

  1. Deployment는 Kubernetes에서 Pod를 선언적으로 관리하는 핵심 리소스다.

  2. deployment.yml을 통해 기본적인 Pod(nginx 3개)를 배포했다.

  3. rolling_update.yml을 통해 버전을 nginx:1.19로 올리고, Pod를 20개로 확장하면서 무중단 롤링 업데이트를 수행했다.

  4. Deployment → ReplicaSet → Pod 구조의 관계와 업데이트 과정이 실제로 어떻게 동작하는지 확인했다.

  5. 이 방식은 NestJS 같은 마이크로서비스를 운영 환경에 안정적으로 배포할 때 매우 유용하다.

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

천을 강수(江水)나 한수(漢水)의 깨끗한 물에 빨아 강한 가을 햇볕에 말린 것처럼 깨끗하고 흰 모양은 한 점 흠잡을 데가 없다. 증자(曾子)가 그의 스승 공자의 인격을 찬양한 말. -맹자

댓글 ( 0)

댓글 남기기

작성