Deployments

2025. 1. 7. 15:43쿠버네티스/Kubernetes for the Absolute Beginners

728x90
반응형

Deployment란?

쿠버네티스에서 Deployment는 애플리케이션을 프로덕션 환경에 배포하고 관리하는 고급 객체입니다. Deployment는 Pod와 ReplicaSet보다 상위 계층의 개념으로, 애플리케이션 배포를 더 효율적이고 유연하게 관리할 수 있도록 도와줍니다.

2. Deployment를 사용하는 이유

2.1 다수의 애플리케이션 인스턴스 실행

  • 프로덕션 환경에서는 웹 서버 같은 애플리케이션을 단일 인스턴스가 아닌 여러 인스턴스로 실행해야 합니다.
  • Deployment는 이를 자동으로 관리합니다.

2.2 롤링 업데이트(Rolling Updates)

  • 새로운 애플리케이션 버전이 Docker 레지스트리에 업로드되면, 이를 기존 Pod에 적용할 수 있습니다.
  • 모든 Pod를 동시에 업데이트하지 않고, 순차적으로 업데이트하여 사용자에게 영향을 최소화합니다.

2.3 롤백(Rollback)

  • 만약 업데이트 중 오류가 발생하면, 이전 상태로 쉽게 되돌릴 수 있습니다.

2.4 일괄 변경(Pause and Resume)

  • 여러 변경 사항(예: 애플리케이션 버전 업그레이드, 리소스 할당 조정 등)을 한 번에 적용하고 싶을 때, Deployment를 일시 중지(Pause)한 후 변경 사항을 적용하고 다시 재개(Resume)할 수 있습니다.

3. Deployment의 구조

Deployment 정의 파일은 ReplicaSet 정의 파일과 유사하지만, kind 필드가 Deployment로 설정됩니다.

3.1 주요 구성 요소

  • apiVersion: API 버전 (예: apps/v1).
  • kind: 객체 유형 (Deployment).
  • metadata: Deployment의 이름과 라벨.
  • spec:
    • replicas: 실행할 Pod의 개수.
    • selector: 관리 대상 Pod를 식별하기 위한 라벨.
    • template: Pod 템플릿 정의(Pod의 이름, 라벨, 컨테이너 이미지 등).

3.2 YAML 파일 예제

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: nginx-container
        image: nginx

Create a new Deployment with the below attributes using your own deployment definition file.

 

   Name: httpd-frontend;

   Replicas: 3;

   Image: httpd:2.4-alpine

  • kubectl create deployment httpd-frontend --image=httpd:2.4-alpine --replicas=3

Update and Rollback

1. Deployment 업데이트와 롤백 개요

쿠버네티스에서 Deployment는 애플리케이션 배포를 관리하는 고급 객체로, 다음과 같은 작업을 수행할 수 있습니다:

  • 애플리케이션 버전 업데이트(롤링 업데이트).
  • 이전 상태로 롤백.
  • 변경 이력을 기록하고 관리.

2. Deployment 생성 및 상태 확인

2.1 Deployment 생성

Deployment 정의 파일을 작성한 후, 아래 명령어를 사용해 Deployment를 생성합니다:

kubectl create -f deployment-definition.yml

2.2 Deployment 상태 확인

kubectl rollout status 명령어를 사용하여 Deployment의 상태를 확인할 수 있습니다:

kubectl rollout status deployment/<deployment-name>
  • 이 명령어는 Pod가 순차적으로 생성되는 과정을 보여줍니다(예: 0/6, 1/6, 2/6 등).
  • 모든 Pod가 정상적으로 생성된 후에야 Deployment가 성공으로 간주됩니다.

3. 변경 이력 관리

3.1 변경 기록 활성화

Deployment 생성 시 --record 옵션을 추가하면 변경 이력이 기록됩니다:

kubectl create -f deployment-definition.yml --record
  • 이 옵션은 변경 명령어를 "원인"으로 기록하여 추후 참조할 수 있도록 합니다.

3.2 변경 이력 확인

kubectl rollout history 명령어로 Deployment의 변경 이력을 확인할 수 있습니다:

kubectl rollout history deployment/<deployment-name>
  • 각 수정 사항은 "Revision"으로 기록되며, 원인이 함께 표시됩니다.

4. Deployment 업데이트

4.1 YAML 파일 수정

kubectl edit deployment 명령어로 YAML 파일을 열어 직접 수정할 수 있습니다:

kubectl edit deployment/<deployment-name> --record
  • 예: 컨테이너 이미지를 최신 버전에서 이전 버전으로 변경(nginx:1.19  nginx:1.18).

4.2 이미지 업데이트 (명령어 사용)

이미지만 업데이트하려면 아래 명령어를 사용합니다:

kubectl set image deployment/<deployment-name> <container-name>=<new-image> --record
kubectl set image deployment/my-app-deployment nginx=nginx:1.18 --record

4.3 롤링 업데이트 진행

업데이트 중에는 새로운 Pod가 생성되고, 기존 Pod는 순차적으로 종료됩니다. 이는 기본 전략인 롤링 업데이트 덕분에 사용자에게 영향을 최소화합니다.

5. 롤백

5.1 롤백 수행

이전 버전으로 되돌리려면 아래 명령어를 사용합니다:

kubectl rollout undo deployment/<deployment-name>
  • 특정 버전으로 롤백하려면 --to-revision=<revision-number> 옵션을 추가합니다.

5.2 롤백 확인

롤백 후에도 상태를 확인하여 모든 Pod가 정상적으로 실행 중인지 확인합니다:

kubectl rollout status deployment/<deployment-name>

6. 실패한 업데이트 처리

6.1 잘못된 이미지로 인한 실패

  • 잘못된 이미지(존재하지 않는 이미지)를 지정하면 새 Pod가 오류 상태(ImagePullBackOff)에 빠집니다.
  • 기존 Pod는 여전히 실행 중이므로 애플리케이션 가용성에는 영향을 주지 않습니다.

6.2 해결 방법

  1. 잘못된 이미지를 수정하거나 이전 버전으로 롤백.
  2. kubectl describe pods 명령어로 오류 세부 정보를 확인.

7. 주요 명령어 요약

작업 명령어
Deployment 생성 kubectl create -f <file>.yml
상태 확인 kubectl rollout status deployment/<deployment-name>
변경 이력 확인 kubectl rollout history deployment/<deployment-name>
YAML 파일 수정 kubectl edit deployment/<deployment-name> --record
이미지 업데이트 kubectl set image deployment/<deployment-name> <container>=<image>
롤백 kubectl rollout undo deployment/<deployment-name>

 

Upgrade the application by setting the image on the deployment to kodekloud/webapp-color:v3

kubectl set image deployments frontend simple-webapp=kodekloud/webapp-color:v3
deployment.apps/frontend image updated

➜  kubectl get pods
NAME                        READY   STATUS        RESTARTS   AGE
frontend-74649f5d7c-4ssx8   1/1     Terminating   0          6m38s
frontend-74649f5d7c-55gks   1/1     Terminating   0          6m16s
frontend-74649f5d7c-dqsn6   1/1     Terminating   0          6m16s
frontend-74649f5d7c-htmph   1/1     Terminating   0          6m38s
반응형

'쿠버네티스 > Kubernetes for the Absolute Beginners' 카테고리의 다른 글

Microsevices Architectue  (0) 2025.01.07
Services  (0) 2025.01.07
Replication Controllers and ReplicaSets  (0) 2025.01.07
PODs with YAML  (0) 2025.01.07