Deployment 란?
- Deployment는 계층 구조 상 Replica Set 보다 상위에 위치한다.
- k8s환경에서 여러 개의 인스턴스로 작동하는 웹서비스가 있다고 할 때 Deployment 기능을 통해 아래와 같이 관리 할 수 있다.
- 인스턴스 업그레이드
- 인스턴스 이미지 버전, 리소스 등을 업그레이드 시킨다.
- Roll-back(롤백)
- 업데이트에 문제가 발생 한 경우 업데이트를 진행했던 인스턴스들의 버전을 업데이트 전으로 되돌린다.
- Roll-out(롤아웃)
- 실행중인 인스턴스를 종료하고, 환경, 리소스 등 주요 사항을 변경 후 다시 시작하여 반영한다.
YAML 파일을 통해 Deployment 관리하기
- YAML 파일 정의
apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment labels: tier: frontend spec: selector: matchLabels: app: myapp replicas: 3 template: metadata: name: nginx-2 labels: app: myapp spec: containers: - name: nginx image: nginx - Deployment의 yaml 파일 내용은 Replica Set과 유사하다.
- YAML파일을 통해 Deployment 생성하기
kubectl create -f deployment-definition.yml —-history
--history 옵션을 부여하면 deployment history에서 Change-CAUSE 부분을 확인할 수 있다.
- Deployment 상태 확인하기
kubectl get replicaset``kubectl get pods
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp-deployment 3/3 3 3 23h
NAME READY STATUS RESTARTS AGE pod/myapp-deployment-67945b9c79-65qs9 1/1 Running 1 (7m16s ago) 23h pod/myapp-deployment-67945b9c79-77dcm 1/1 Running 1 (7m16s ago) 23h pod/myapp-deployment-67945b9c79-sfd4t 1/1 Running 1 (7m16s ago) 23h
NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-deployment-67945b9c79 3 3 3 23h
kubectl get deployments
Update & Roll-back
Deployment를 통해 최초 배포 시 Rollout이 진행된다, 이를 Revision1 이라고 가정하고, 추 후 이미지의 버전이 업데이트 되어 새로운 버전으로 업데이트 되면 Rollout되며 Revision2라는 이름으로 배포하게 된다.
결론적으로 Deployment는 최초 배포, 업데이트 시점에 Rollout을 진행하며 Revision1, Revision2와 같이 버전을 관리하여 배포 변경사항을 추적하고, 이전 버전으로 롤백 시킬 수 있게 한다.
✅ 롤아웃 이력 확인 명령어
kubectl rollout status deployment/{deployment-name}
kubectl rollout history deployment/{deployment-name}
5개의 App:1.0 Pod가 실행중인 Deployment 환경에서 Update시 아래와 같은 방식으로 진행할 수 있다.
- Recreate
- 5개의 App:1.0 Pod를 순차적으로 모두 종료시킴
- 5개의 App:1.1 Pod를 순차적으로 실행 시킴
- 이러한 배포 방식은 서비스 중단 상태를 발생시킬 수 있다.
- Rolling Update
- 5개 중 1개의 App:1.0 Pod를 중지 시킴
- App:1.0 Pod중지 후 1개의 App:1.1 Pod를 실행시킴
- 다머지 4개의 Pod를 위와 같은 절차를 통해 Update 진행
- 서비스 중단 상태를 발생시키지 않기 때문에 일반적으로 Rolling Update 방식을 사용함
Deployment Update시 방식을 별도로 지정하지 않으면 Rolling Update 방식을 사용하여 진행한다. 즉, Rolling Update가 기본 배포 전략인 것이다.
Update 진행 하기
- Update(Rolling Update)
- Edit 명령어
kubectl edit deployment myapp-deployment --record
- image : nginx → nginx:1.18 변경하기
- Set 명령어
kubectl set image deployment/myapp-deployment nginx=nginx:1.18-perl
- 확인하기
- 최초 생성 REVISION 1 이후 이미지 업데이트 순서에 따라 2, 3이 생긴 걸 확인할 수 있다.
- 배포는 업데이트되는 동안 특정 수의 Pod만 다운되도록 한다. 기본적으로 원하는 포드 수의 최소 75%가 가동되도록 한다.(최대 25%는 사용할 수 없음)
```bash
kubectl rollout history deployment/myapp-deployment deployment.apps/myapp-deployment
##출력##
REVISION CHANGE-CAUSE
1 kubectl create --cluster=minikube --filename=deployment.yaml --record=true
2 kubectl edit deployment myapp-deployment --cluster=minikube --record=true
3 kubectl set image deployment myapp-deployment myapp-deployment nginx=nginx:1.18-perl --cluster=minikube --record=true
```
Roll-back 하기
- Roll-back 하기해당 명령은 바로 이전 버전으로 Roll-back하는 방식이다.특정 버전으로 Rollback하려면
--to-revision={REVISION-Ver}
옵션을 명령 줄 마지막에 부여한다. kubectl rollout undo deployment/myapp-deployment --to-revision=1
kubectl rollout undo deployment/myapp-deployment
- Roll-back 후 Deployment Image Version 확인하기Deployment의 history를 확인해보면 REVISION 2가 사라지고 REVISION 4가 생성된 것을 확인할 수 있다. 이는 사실상 REVISION 2 와 내용이 동일하기 때문이다.
kubectl describe deployment myapp-deployment | grep Image ###출력### Image: nginx:1.18
- REVISION 3(nginx:1.18-perl) → REVISION 2(nginx:1.18)로 Rollback된 것을 확인 할 수 있다.
- 잘못된 이미지로 배포 후 Roll-back 해보기image : nginx:1.18 → nginx:1.18-dose-not-exist 변경하기Deployment Image Version을 확인해 보자. 아래와 같이 REVISION 5가 생성된 것을 확인할 수 있다.아래와 같은 명령어를 통해 rollback 시키고 pod, REVISION, Image를 확인해보자
kubectl get pod #3개의 pod가 작동 중임을 확인할 수 있다. NAME READY STATUS RESTARTS AGE myapp-deployment-7bd7dfbd85-sllvr 1/1 Running 0 20m myapp-deployment-7bd7dfbd85-w9kdq 1/1 Running 0 20m myapp-deployment-7bd7dfbd85-zsl8l 1/1 Running 0 20m
REVISION CHANGE-CAUSE 1 kubectl create --cluster=minikube --filename=deployment.yaml --record=true 3 kubectl set image deployment myapp-deployment myapp-deployment nginx=nginx:1.18-perl --cluster=minikube --record=true 4 kubectl edit deployment myapp-deployment --cluster=minikube --record=true 5 kubectl edit deployment myapp-deployment --cluster=minikube --record=true
k get pods ###출력### NAME READY STATUS RESTARTS AGE myapp-deployment-7bd7dfbd85-sllvr 1/1 Running 0 11m myapp-deployment-7bd7dfbd85-w9kdq 1/1 Running 0 11m myapp-deployment-7bd7dfbd85-zsl8l 1/1 Running 0 11m myapp-deployment-85d789b4c6-gmf9d 0/1 ImagePullBackOff 0 2m58s
kubectl rollout undo deployment/myapp-deployment
kubectl rollout history deployment/myapp-deployment
- 아래 명령어를 통해 Rolling Update 방식을 통해 1개의 새로운 pod 가 구성 되었지만 이미지를 받지 못해 실행 중이던 pod는 종료되지 않고 배포상태를 유지 중인 것을 확인할 수 있다.
kubectl edit deployment myapp-deployment --record
'클라우드' 카테고리의 다른 글
[EKS] Amazon EKS 설치하기 (0) | 2023.06.22 |
---|---|
kubeadm으로 고가용성 클러스터 생성-1 (0) | 2023.04.03 |
[k8s]Replication Controller & Replicaset (0) | 2023.03.08 |
[docker]쉘 스크립트를 사용하여 도커 오토스케일링 구현하기 (0) | 2023.03.08 |
[k8s] Kubectl 명령어 자동완성 설정하기 (0) | 2023.03.08 |