Kubernetes

쿠버네티스 디플로이먼트(Deployment)

☀️ 디플로이먼트 개념

쿠버네티스 디플로이먼트(Kubernetes Deployment)는 애플리케이션을 배포(Deploy)하고 관리하는 가장 중요한 리소스 중 하나입니다.
Deployment를 사용하면 Pod 및 ReplicaSet을 자동으로 생성, 업데이트, 롤백 및 확장할 수 있습니다.

쿠버네티스에서 Deployment는 애플리케이션의 선언적(Declarative) 방식의 배포 및 관리를 지원하여 운영 자동화를 가능하게 합니다.


1. 디플로이먼트의 주요 기능

(1) 애플리케이션 배포 자동화

  • 새로운 버전의 애플리케이션을 쉽게 배포 가능.

(2) 롤링 업데이트(Rolling Update) 지원

  • 애플리케이션을 중단 없이 새로운 버전으로 업데이트 가능.

(3 ) 자동 롤백 지원

  • 업데이트 중 오류 발생 시 이전 버전으로 자동 복구 가능.

(4) 자동 스케일링(Scaling)

  • kubectl scale 또는 HorizontalPodAutoscaler(HPA)를 통해 자동 확장 가능.

(5) Self-healing(자가 복구)

  • Pod 장애 발생 시 자동으로 새로운 Pod를 생성하여 애플리케이션 가용성을 보장.

2.디플로이먼트의 기본 구조

디플로이먼트는 ReplicaSet을 관리하며, ReplicaSet은 Pod를 관리하는 구조입니다.

Deployment → ReplicaSet → Pod
  • Deployment: 애플리케이션을 관리하는 최상위 리소스.
  • ReplicaSet: 동일한 Pod의 복제본을 관리하고, Pod가 실패할 경우 자동으로 새로운 Pod를 생성.
  • Pod: 컨테이너를 실행하는 최소 실행 단위.

3. 디플로이먼트 매니페스트 예제

아래는 Nginx 웹 서버를 배포하는 쿠버네티스 Deployment 매니페스트 예제입니다.

  • File Name : nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3  # Pod 복제본 수
  selector:
    matchLabels:
      app: nginx-deploy
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
      - name: nginx
        image: nginx:latest  # 사용할 컨테이너 이미지
        ports:
        - containerPort: 80  # 컨테이너 내부 포트

📌 설명

  • replicas: 3 → 동일한 Pod 3개를 생성하여 가용성을 확보.
  • selector.matchLabels.app: nginx-deploy→ Pod를 선택하는 기준.
  • template.metadata.labels.app: nginx-deploy→ 생성할 Pod의 라벨 설정
  • containers.image: nginx:latest → 사용할 컨테이너 이미지.
  • ports.containerPort: 80 → 컨테이너 내부에서 사용할 포트 지정.

4. 디플로이먼트 명령어

디플로이먼트 생성

bash
kubectl apply -f nginx-deployment.yaml
  • 위 매니페스트 파일을 적용하여 Deployment를 생성.

디플로이먼트 조회

bash
kubectl get deployments 
kubectl get pods 
kubectl get replicaset
  • 현재 배포된 Deployment, Pod, ReplicaSet 목록을 확인.

디플로이먼트 상세 정보 조회

bash
kubectl describe deployment nginx-deployment
  • nginx-deployment의 상세 정보 확인.

디플로이먼트 삭제

bash
kubectl delete deployment nginx-deployment
  • nginx-deployment를 삭제하여 관련된 모든 Pod 및 ReplicaSet 제거.

5. 디플로이먼트 업데이트 및 롤백

📌주요 kubectl set 과 rollout 명령어

kubectl set image deployment/<배포 이름> my-container=my-image:1.19.0 -> 배포의 컨테이너 이미지를 업데이트
kubectl rollout status deployment/<배포 이름> -> 배포의 현재 롤아웃 상태를 확인.
kubectl rollout history deployment/<배포 이름> -> 배포의 롤아웃 기록을 확인.
kubectl rollout undo deployment/<배포 이름> -> 배포를 이전 버전으로 롤백.
kubectl rollout restart deployment/<배포 이름> -> 배포를 재시작.

디플로이먼트 이미지 업데이트

Deployment는 애플리케이션을 무중단으로 업데이트할 수 있도록  롤링 업데이트(Rolling Update)를 지원합니다.

bash
kubectl set image deployment/nginx-deployment nginx=nginx:1.19.0
  • 기존 nginx:latestnginx:1.19.0으로 변경.
  • 쿠버네티스가 새로운 버전의 Pod를 점진적으로 배포(롤링 업데이트).

업데이트 상태 확인

bash
kubectl rollout status deployment/nginx-deployment
  • 롤링 업데이트의 진행 상황 확인.

업데이트 롤백

새로운 버전이 문제가 있을 경우 롤백할 수 있습니다.

 
bash 
kubectl rollout undo deployment/nginx-deployment
  • 이전 버전으로 즉시 롤백.

업데이트 기록 확인

 
bash 
kubectl rollout history deployment/nginx-deployment
  • 배포된 버전의 히스토리 확인.

6. 디플로이먼트 스케일링(Scaling)

수동 스케일링

bash
kubectl scale deployment nginx-deployment --replicas=5
  • 기존 replicas: 3에서 replicas: 5로 변경.

자동 스케일링 (HPA)

쿠버네티스는 HorizontalPodAutoscaler(HPA)를 사용하여 CPU 사용량에 따라 자동으로 Pod 개수를 조정할 수 있습니다.

bash
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=2 --max=10
  • CPU 사용률이 50%를 넘으면 최소 2개, 최대 10개까지 Pod를 자동 확장.

7. 디플로이먼트 전략

쿠버네티스는 Pod를 업데이트하는 방식으로 두 가지 전략을 제공합니다.

  1. RollingUpdate (기본값)
    • 새 버전의 Pod를 점진적으로 생성하고, 기존 Pod를 하나씩 제거.
    • 애플리케이션이 무중단 배포 가능.
  2. Recreate
    • 기존 Pod를 모두 삭제한 후 새로운 버전의 Pod를 생성.
    • 서비스 중단이 발생할 수 있음.

RollingUpdate 전략 설정 예제

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # 동시에 중단될 수 있는 최대 Pod 개수
      maxSurge: 2        # 동시에 추가 생성할 수 있는 최대 Pod 개수

📌정리

기능 설명
배포(Deploy) 새로운 애플리케이션을 배포
스케일링(Scaling) 애플리케이션의 가용성을 위해 Pod 개수 조정
업데이트(Update) 롤링 업데이트를 통해 무중단 배포 지원
롤백(Rollback) 문제 발생 시 이전 버전으로 복원
Self-healing  Pod 장애 발생 시 자동 복구

쿠버네티스 디플로이먼트는 애플리케이션의 배포와 업데이트를 자동으로 관리하는 핵심 요소입니다.
롤링 업데이트, 자동 롤백, 스케일링, Self-healing 기능을 통해 가용성을 보장하며, 지속적인 배포(CI/CD)에도 최적화되어 있습니다.
디플로이먼트를 효과적으로 활용하면 안정적이고 확장 가능한 애플리케이션 운영이 가능합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!