[Kubernetes] Kubernetes Deployment 이해하기

 

Kubernetes에서 Deployment는 컨테이너 기반 애플리케이션을 안정적으로 배포, 관리, 확장하기 위한 핵심 리소스입니다. 복잡한 인프라 환경에서도 서비스의 가용성을 유지하고, 유연한 업데이트 및 롤백을 제공하는 중요한 도구입니다.

이번 포스팅에서는 Deployment의 개념과 주요 기능, 그리고 관련 구조 및 동작 흐름을 그림을 통해 알아보겠습니다.

 

 

1. Deployment란?

Deployment는 Kubernetes 클러스터에 애플리케이션의 원하는 상태를 정의하고, 이를 지속적으로 유지하도록 하는 리소스입니다. 사용자는 파드(Pod)의 수, 컨테이너 이미지, 업데이트 전략 등을 정의하기만 하면, Kubernetes가 실제 상태를 원하는 상태로 자동으로 조정해줍니다.

 

2. Deployment의 주요 기능

2.1 선언적 배포 (Declarative Deployment)

사용자는 YAML 또는 kubectl 명령어를 통해 원하는 애플리케이션의 상태(예: 파드 수, 이미지 버전)를 선언적으로 정의합니다. Kubernetes는 이를 기준으로 현재 상태를 감시하고, 차이가 생기면 자동으로 수정합니다.

# vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: nginx

2.2 롤링 업데이트 (Rolling Update)

Deployment는 기존 파드를 하나씩 새로운 버전으로 교체하는 롤링 업데이트 전략을 지원합니다. 이를 통해 서비스를 중단하지 않고 새로운 버전을 배포할 수 있습니다.

2.3 롤백 (Rollback)

업데이트 후 문제가 발생했을 경우, 간단한 명령어로 이전 상태로 되돌릴 수 있는 기능을 제공합니다.

kubectl rollout undo deployment [deployment-name]
 

2.4 스케일링 (Scaling)

replicas 값을 변경하거나, kubectl scale 명령어를 통해 애플리케이션의 인스턴스 수를 실시간으로 조절할 수 있습니다. 이는 오토스케일링(HPA)과 연동되면 자동화도 가능합니다.

kubectl scale deployment [name] --replicas=5
 

2.5 자동 복구 (Auto-Recovery)

파드가 비정상적으로 종료되거나 삭제되더라도, Deployment는 자동으로 파드를 다시 생성해 애플리케이션 가용성을 유지합니다.

 

3. 디플로이먼트 구조 설명

아래 이미지는 Kubernetes Deployment의 구성 관계를 보여줍니다.

구성 요소 설명:

  • Deployment: 선언된 상태를 기반으로 ReplicaSet을 관리합니다.
  • ReplicaSet: 지정된 수만큼 파드를 유지하도록 보장합니다.
  • Pod: 실제 애플리케이션 컨테이너가 실행되는 단위입니다.

Deployment는 직접적으로 파드를 생성하지 않고, ReplicaSet을 통해 파드를 관리합니다. 새로운 버전의 이미지로 업데이트하면, 새로운 ReplicaSet이 생성되고 기존 ReplicaSet은 점차 줄어드는 방식으로 무중단 배포가 이루어집니다.

 

4. 레플리카셋 생성 및 배포 흐름

아래 이미지는 사용자가 kubectl apply 등을 통해 Deployment를 실행했을 때, 파드가 생성되고 실행되기까지의 흐름을 보여줍니다.

단계별 동작 설명:

  1. kubectl을 통한 ReplicaSet 생성 요청
    사용자가 명령을 실행하면 API 서버는 ReplicaSet을 생성합니다.
  2. ReplicaSet Controller가 요청 감지
    ReplicaSet Controller는 새로운 ReplicaSet 객체를 감지하고, 파드를 몇 개 생성할지 판단합니다.
  3. Replica 수에 따라 파드 생성 요청 전송
    필요한 만큼의 파드를 생성하라고 API 서버에 요청합니다.
  4. 스케줄러가 적절한 노드 선택
    스케줄러는 클러스터의 상태를 고려해 각 파드를 실행할 적절한 노드를 선택합니다.
  5. 파드를 노드에 할당
    파드가 해당 노드에 할당되면, kubelet이 이를 감지합니다.
  6. kubelet이 파드 실행 상태 감시
    kubelet은 노드에 파드가 제대로 실행되었는지를 감시합니다.
  7. 컨테이너 런타임(Docker 또는 containerd 등)이 파드 실행
    실제 컨테이너가 생성되고 실행됩니다.
  8. 파드 상태 업데이트
    파드의 상태가 API 서버에 전달되어 “Running” 상태로 전환됩니다.

 

마치며

Deployment는 Kubernetes에서 가장 많이 사용되는 리소스 중 하나로, 배포, 업데이트, 복구, 확장의 모든 과정을 자동화합니다. 이를 이해하고 활용하면 운영 중인 애플리케이션의 신뢰성과 가용성을 크게 향상시킬 수 있습니다.