Search

Rolling Updates and Rollbacks

Created
2023/10/02 01:57
Tags
k8s
CKA
Mumshad Mannambeth
Application Lifecycle Management

1) About

어플리케이션을 배포하게 되면 롤 아웃이 발생하는데, 롤 아웃은 새로운 배포를 생성하게 됨
예를 들어 기존 버전이 리비전1 이었고, 새롭게 배포하는 버전이 리비전2 라고 한다면, 이와 같은 롤 아웃은 배포 상에서의 변화를 추적하고 필요 시에 롤 백이 가능하도록 도움
롤 아웃을 수행한다는 것은 업데이트를 의미하는데, 이는 어플리케이션 버전, Docker 버전, 라벨 등의 변경을 의미
이와 같은 변경은 배포 객체의 정의 파일을 통해 이뤄내고, 변경점의 적용은 apply 명령어로 이뤄냄
리비전을 통해 새로운 배포가 생성될 때 내부적으로 Replica Set을 새롭게 구성하게 되는데, 이전 버전의 Replica Set은 롤 백을 위해 삭제 되지는 않음
** 롤 백을 해도 새롭게 생성된 Replica Set 역시 삭제 되지 않음

2) Strategy

롤 아웃에는 몇 가지 전략이 존재하는데, 각 리비전의 인스턴스가 5개 있다고 가정
롤 아웃의 전략을 지정하지 않으면, 기본 옵션은 Rolling Update로 동작
** 두 방식을 kubectl describe deploy로 확인해보면, 명확한 차이를 볼 수 있음
** 아래의 동작 방식을 kubectl get rs를 통해 과정을 확인할 수 있음

1. Recreate

Recreate 전략은 리비전1의 인스턴스를 모두 내리고, 리비전2의 인스턴스들을 생성하는 전략
기존 인스턴스가 모두 내려간 다음에서야 새로운 인스턴스가 생성되므로, 어플리케이션 접근에서의 다운 타임이 발생

2. Rolling Update

리비전1의 인스턴스 1개를 내리고, 리비전2의 인스턴스 1개를 올리는 식으로 동작
어플리케이션의 다운 타임은 발생하지 않음

3) YAML

1. Recreate

apiVersion: apps/v1 kind: Deployment metadata: labels: app: deploy-sample name: deploy-sample spec: replicas: 5 selector: matchLabels: app: deploy-sample strategy: type: Recreate template: metadata: labels: app: deploy-sample spec: containers: - image: deploy-sample name: deploy-sample
YAML
복사

2. Rolling Update

apiVersion: apps/v1 kind: Deployment metadata: labels: app: deploy-sample name: deploy-sample spec: replicas: 5 selector: matchLabels: app: deploy-sample strategy: type: RollingUpdate template: metadata: labels: app: deploy-sample spec: containers: - image: deploy-sample name: deploy-sample
YAML
복사

4) Rollback

새로운 리비전으로 업데이트를 했는데, 어플리케이션이 잘못된 것을 깨달았다면 이전 버전으로 돌려야 할 수 있음
쿠버네티스가 없다면 이전 버전으로 변경하는 것을 수작업으로 해야되지만, 쿠버네티스에서는 롤 백을 지원함
별도의 롤 백 명령어가 있는 것은 아니고, 롤 아웃 명령어의 트리거 명령어를 이용
** kubectl get rs를 통해 롤 백 과정을 자세히 확인 가능

5) Commands

kubectl set image deployment/${DEPLOYMENT_NAME} ${CONTAINER_NAME}=${IMAGE_NAME}
배포 내의 컨테이너 이미지를 업데이트
** 정의 파일 내에 이미지를 수정 후 apply로 롤 아웃을 수행해도 무방
kubectl rollout status deployment/${DEPLOYMENT_NAME}
롤 아웃을 상태를 확인
kubectl rollout history
롤 아웃 내역을 확인
kubectl rollout undo deployment/${DEPLOYMENT_NAME}
롤 백 수행