기술 단어장/Kubernetes

[k8s] Deployment를 이용한 배포전략

MFDO 2024. 3. 4. 12:29

 

배포-시작-구동까지 서비스 중단이 있었던

ReplicaSet의 한계 극복 대안인

Deployment에 대해 알아보고 사용해 보았다.

 

▼ 요약지 다운로드 ▼

 

5.Deployment.pdf

 

drive.google.com

 


 

Deployment 배경

 

 - Pod 배포를 위한 필요 정보

selector   어떤 Pod 집합을 대상으로 Replication 하는가
replicas   얼마나 Pod를 만들까
image   Pod는 어떤 컨테이너를 실행할까

=> 배포 시 변경 부분은 고정됨

 

 - 지원기능 : Pod 배포 자동화를 위한 오브젝트 (ReplicaSe + 배포전략)

  > Pod의 롤아웃/롤백 시, ReplicaSet 생성을 대신해줌

  > 다양한 배포 전략 제공, 새 파드로의 전환 속도 제어

 

 


 

 

Deployment 형태

  

 


 

 

 Deployment 배포전략 

 

 

 - Recreate 배포

 : 이전 Pod을 모두 종료하고 새로운 Pod replicas만큼 생성

 

 - RollingUpdate 배포

 : 새로운 Pod 생성과 이전 Pod 종료가 동시에 일어나는 방식

 

 


 

 

Recreate RollingUpdate 비교

 

 

 - Recreate (재생성)

  > 새로운 버전을 배포하기 전에 이전 버전이 즉시 종료됨

  > 컨테이너가 정상적으로 시작되기 전까지 서비스하지 못함

  > replicas 수만큼의 컴퓨팅 리소스 필요

  > 개발단계에서 유용

 

 - RollingUpdate (롤링 업데이트)

  > 새로운 버전을 배포하면서 이전 버전을 종료

  > 서비스 다운 타임 최소화

  > 동시 실행 Podreplicas를 넘으므로 더 많은 컴퓨팅 리소스 요구

 

 

 


 

 

 

 RollingUpdate 속도 제어 옵션

 

 

 - maxUnavailable

 : 롤링 업데이트를 수행중 유지하고자 하는 최소 Pod의 비율()을 지정

 

ex ) replicas: 10, maxUnavailable: 30%

- 이전 버전 Pod replicas의 최대 30%까지 즉시 Scale Down 가능
- replicas 10일 때, 이전 버전의 Pod 3개까지 즉시 종료 가능
- 새 버전 Pod 생성과 이전 버전의 Pod 종료를 진행하면서,
- replicas
70% 이상의 Pod를 항상 Running 상태로 유지해야 함

 

 

 

 - maxSurge

 : 롤링 업데이트를 수행중 허용하는 최대 Pod의 비율()을 지정

 

ex ) replicas: 10, maxSurge: 30%

- 새 버전의 Pod replicas의 최대 30%까지 즉시 Scale Up 가능
- 새 버전의 Pod 3개까지 즉시 생성 가능
- 새 버전의 Pod 생성과 이전 버전의 Pod 종료를 진행하면서,
-
Pod의 수가 replicas 130%를 넘지 않도록 유지해야 함

 

 


 

 

 

Deployment 롤백

 : Deployment는 롤아웃 히스토리를 Revision으로 관리함

 

kubectl rollout undo deployment <deployment-name>
--to-revision=1

 

 

 

 


 

 

실습 진행

: deployment를 이용한 Pod/ReplicaSet 조작

 

 

1) deployment.ymal 정의

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        project: fastcampus
        env: production
    spec:
      containers:        
      - name: my-app
        images: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
 

 

 

 

2) deployment 배포

kubectl apply -f deployment.yaml

 

 

 

2-1) Deployment ReplicaSet 이벤트 확인

kubectl describe deployment/my-app

 > ReplicaSet이 만들어짐을 확인

 

 

 

3) replicas 수 조절

kubectl scale deployment/my-app --replicas=5

 

 

 

3-1) Deployment ReplicaSet 이벤트 확인

kubectl describe deployment/my-app

 > 2개에서 5개로 조정된 모습

 

 

 > kubectl get pod를 통해서도 5개의 pod가 존재함을 확인 가능

 

 


 

 

Deployment 배포전략 설정

Recreate RollingUpdate

 

 - 개발 시에는 Recreate, 운영 시에는 RollingUpdate

 

 


 

 

 

Deployment Rollback

 

1. Deployment 이미지 1.0 -> 2.0 배포

2. 배포 기록 Revision (상세) 조회

3. Revision을 이용해 이미지 1.0으로 롤백

4. 롤백 사유 남기기

 

 

- Revision 목록 조회

kubectl rollout history deployment/my-app

 

* CHANGE-CAUSE : Deployment 내용을 변경하여 배포를 하게 된 사유

* REVISION: 1부터 순차 증가, 숫자가 커질수록 최근 배포된 기록

 

 

 - Revision 상세조회 : 배포된 Pod Template 확인

kubectl rollout history deployment/my-app --revision=2

 

 


 

실습 진행

: Rollback

 

 

1) deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
  # 배포 사유 작성하기 "initial image 1.0"
  annotations:
    "kubernetes.io/change-cause": "initial image 1.0"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  template:
    metadata:
      labels:
        app: my-app
        project: fastcampus
        env: production
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"
 

 

 

 

2) deployment 배포

kubectl apply -f deployment.yaml

 

 

 

2-1) Deployment 배포 상태 확인

kubectl rollout status deployment/my-app

 > 배포가 완료 됨을 확인

 

 

 

3) 이미지 1.0 -> 2.0 변경 배포

kubectl set image deployment/my-app my-app=yoonjeong/my-app:2.0

 

 

 

3-1) Deployment 이미지 변경 여부 확인

kubectl get deployment -o wide

 > 이미지가 2.0으로 변경됨을 볼 수 있음

 

 

 

4) 배포 사유 작성

kubectl annotate deployment/my-app kubernetes.io/change-cause="image updated to 2.0"

 

 

 

5) Revision 목록 확인

kubectl rollout history deployment/my-app

 

 

 

6) Revision 상세조회

kubectl rollout history deployment/my-app --revision=2

 > 작성한 annotation template 정보도 확인 가능하다

 

 

 

7) 롤백

kubectl rollout undo deployment/my-app --to-revision=1

 > --to-revision을 작성하지 않으면, 이전 버전으로 롤백

 

 

 

7-1) 배포사유 작성 4)와 동일한 방식

kubectl annotate deployment/my-app kubernetes.io/change-cause="rollbacked to 1.0 for a few bugs"

 

 

 

7-2) Recision 목록 확인

kubectl rollout history deployment/my-app
사유 작성 전 사유 작성 후

 

 

 


 

요약 전문