본문으로 건너뛰기

Rolling Update & Rollback


경고

헷갈렸던 용어 정리

Rollout

  • 일반적으로 새로운 소프트웨어 버전, 기능, 시스템 전체를 배포하는 과정 전체를 의미하는 '포괄적인' 용어

Rolling Update

  • 서비스 중단 없이 애플리케이션의 새로운 버전을 배포하는 '특정 Rollout 전략'

Deployment Rollout 과정

최초 배포

  1. Deployment가 처음 생성되었을 때, Rollout이 트리거된다.
  2. Rollout이 새로운 ReplicaSet을 생성한다.
  3. 해당 ReplicaSet은 새로운 Revision(배포 버전)으로 기록된다.

업그레이드

  • 애플리케이션 컨테이너 버전 등을 업데이트하면 새로운 Rollout이 트리거된다.
  • Rollout이 업데이트 된 ReplicaSet을 생성한다.
  • 업데이트 된 ReplicaSet은 새로운 Revision으로 기록한다.

롤백

  • 기록된 이전 Revision으로 롤백되며, 이에 따라 이전 ReplicaSet이 생성된다.

Deployment Rollout 전략

rolling1

Recreate

상황

  • 기존에 Pod가 5개 존재하는 ReplicaSet을 가진 Deployment가 있다고 가정
  • 새로운 버전으로 업그레이드(롤백) 하는 상황

절차

  1. 기존 Pod 5개를 모두 삭제
  2. 새로운 Pod 5개 생성

문제점

  • 기본 Pod를 5개를 모두 삭제하고 새로운 Pod를 생성하는 사이에 서비스 중단 발생

Rolling Update

상황

  • 기존에 Pod가 5개 존재하는 ReplicaSet을 가진 Deployment가 있다고 가정
  • 새로운 버전으로 업그레이드(롤백) 하는 상황

절차

  1. 기존 Pod 1개를 삭제
  2. 새로운 Pod 1개 생성
  3. 위 과정 5회 반복

장점

  • 서비스가 중단되지 않고 무중단 배포 가능
  • 이러한 장점으로 인해 Deployment기본 Rollout 정책으로 Rolling Update를 사용한다.

Recreate vs Rolling Update

rolling2


업데이트 방법

yaml 수정 -> apply

# deployment-definition.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: nginx
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx:1.7.1 # 1.7.0 -> 1.7.1
replicas: 3
selector:
matchLabels:
type: front-end
kubectl apply -f deployment-definition.yaml

command

kubectl set image deployment/<deployment 이름> <contaiiner 이름>=<image 이름>

명령어

kubectl rollout status deployment/<deployment 이름>
  • 현재 rollout의 상태 확인 (몇 개의 pod가 혅재 업데이트 되었는지, rollout이 완료 되었는지 등)
kubectl rollout history deployment/<deployment 이름>
  • revision 히스토리 보기
kubectl rollout undo deployment/<deployment 이름>
  • 이전 revision으로 롤백

레퍼런스