[k8s] Deployment를 이용한 배포전략
배포-시작-구동까지 서비스 중단이 있었던
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 (롤링 업데이트)
> 새로운 버전을 배포하면서 이전 버전을 종료
> 서비스 다운 타임 최소화
> 동시 실행 Pod가 replicas를 넘으므로 더 많은 컴퓨팅 리소스 요구
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 | |
사유 작성 전 | 사유 작성 후 |
![]() |
![]() |
요약 전문