2021.08.07 - Rolling Updates & Rollbacks in Deployments
위의 이전 글에서 Deployment의 update 전략 중 recreate 전략과 rolling update 전략을 정리했었다. 그 내용을 간단하게 요약하면 아래와 같다.
Deployment Strategy - Recreate
기존 버전의 Pod를 모두 삭제한 후, 새 버전의 Pod를 한꺼번에 생성하는 방법
기존 버전을 중지하고 새 버전이 정상적으로 동작할 때까지 서비스 중단이 발생한다.
Deployment Strategy - Rolling Update
기존 버전의 Pod 하나를 삭제한 후, 새 버전의 Pod 생성을 반복하는 방법
서비스 중단이 발생하지 않으며 Deployment Upgrade Startegy 기본값이다.
이 글에서는 이 두 방법처럼 옵션에서 지정할 수 있는 전략은 아니지만 구현할 수 있는 Deployment 업그레이드 전략을 정리한다.
Deployment Strategy - Blue/Green
기존 버전의 Deployment이 동작하고 있는 환경에 새 버전의 Deployment을 배포한다. 이때 기존 버전의 Deployment를 Blue, 새 버전의 Deployment를 Green이라고 한다.
이후 Green에 대한 테스트가 완료되면 Blue로 라우팅 되던 트래픽을 한 번에 Green으로 변경한다.
쿠버네티스의 Deployments와 Services를 이용해 구현할 수 있다.
구현 방법
1. 애플리케이션을 배포한다. 이를 blue라고 하자.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-blue
labels:
app: myapp
type: front-end
spec:
templete:
metadata:
name: myapp-pod
labels:
version: v1 # 서비스 연결용 Label
spec: containers
- name: app-container
image: myapp-image:1.0
replicas: 5
selector:
matchLabels:
type: front-end
2. blue로 트래픽을 라우팅 하는 서비스를 생성한다. 서비스를 포드와 연결하기 위해 version=v1 Label과 Selector를 이용한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
version: v1 # 포드 연결용 Selector
3. 새 버전의 애플리케이션을 배포한다. 이를 green이라고 하자. Label은 version=v2로 설정한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-green
labels:
app: myapp
type: front-end
spec:
templete:
metadata:
name: myapp-pod
labels:
version: v2
spec: containers
- name: app-container
image: myapp-image:2.0
replicas: 5
selector:
matchLabels:
type: front-end
그리고 배포한 애플리케이션 테스트를 수행한다.
3. 테스트가 완료되면 서비스의 Selector를 version=v2로 변경한다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
version: v2
참고 문서
https://faun.pub/rest-and-grpc-load-generation-in-flagger-for-blue-green-deployments-7459b0a8014d