[C181] 디플로이먼트가 지원하는 배포 전략에서 블루/그린이나 카나리는 찾아볼 수 없습니다. 어떻게 블루/그린이나 카나리 배포를 할 수 있을까요?
최신버전에서 업데이트 된 기능이 있는지 확인하였다. ( 기준 날짜 : 2022.06.30 )
그림 출처 - https://itnext.io/kubectl-plugin-for-blue-green-deployment-strategy-cc5b40a87817
쿠버네티스 디플로이먼트가 정식으로 지원하지 않는다.
디플로이먼트를 블루(v1)/그린(v2) 각각 생성하여 서비스의 셀렉터를 이용하여 버전을 적용한다.
블루에 해당하는 ReplicaSet 생성
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica1
spec:
replicas: 2
selector:
matchLabels:
ver: v1
template:
metadata:
name: pod1
labels:
ver: v1
spec:
containers:
- name: container
image: kubetm/app:v1
terminationGracePeriodSeconds: 0
selector에 ver:v1을 지정하여 ReplicaSet의 Label과 동일하게 구성(ReplicaSet의 Pod와 연결)
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
ver: v1
ports:
- port: 8080
protocol: TCP
targetPort: 8080
v2의 ReplicaSet을 생성(green)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica2
spec:
replicas: 2
selector:
matchLabels:
ver: v2
template:
metadata:
name: pod1
labels:
ver: v2
spec:
containers:
- name: container
image: kubetm/app:v2
terminationGracePeriodSeconds: 0
...
kind: Service
metadata:
name: svc-3
spec:
selector:
ver: v2
ports:
- port: 8080
protocol: TCP
targetPort: 8080
...
여러 레이블이 필요한 또 다른 시나리오는 동일한 컴포넌트의 다른 릴리스 또는 구성의 디플로이먼트를 구별하는 것이다. 새 릴리스가 완전히 롤아웃되기 전에 실제 운영 트래픽을 수신할 수 있도록 새로운 애플리케이션 릴리스(파드 템플리트의 이미지 태그를 통해 지정됨)의 카나리 를 이전 릴리스와 나란히 배포하는 것이 일반적이다.
예를 들어, track
레이블을 사용하여 다른 릴리스를 구별할 수 있다.
기본(primary), 안정(stable) 릴리스에는 값이 stable
인 track
레이블이 있다.
name: frontend
replicas: 3
...
labels:
app: guestbook
tier: frontend
track: stable
...
image**: gb-frontend:v3
그런 다음 서로 다른 값(예: canary
)으로 track
레이블을 전달하는 방명록 프론트엔드의 새 릴리스를 생성하여, 두 세트의 파드가 겹치지 않도록 할 수 있다.
name: frontend-canary
replicas: 1
...
labels:
app: guestbook
tier: frontend
track: canary
...
image: gb-frontend:v4
프론트엔드 서비스는 레이블의 공통 서브셋을 선택하여(즉, track
레이블 생략) 두 레플리카 세트에 걸쳐 있으므로, 트래픽이 두 애플리케이션으로 리디렉션된다.
selector:
app: guestbook
tier: frontend
안정 및 카나리 릴리스의 레플리카 수를 조정하여 실제 운영 트래픽을 수신할 각 릴리스의 비율을 결정한다(이 경우, 3:1).
확신이 들면, 안정 릴리스의 track을 새로운 애플리케이션 릴리스로 업데이트하고 카나리를 제거할 수 있다.
보다 구체적인 예시는, Ghost 배포에 대한 튜토리얼을 확인한다.
kind:RouteRule
를 이용한 가중치 설정RouteRule을 적용하여 v1과 v2의 가중치를 부여하여 카나리 배포를 구현한다.
Example:...
kind:Deployment
metadata:
name: shasr-app-v1
spec:
replicas: 5
template:
labels:
app: shasr-app
version: v1.0.0
...
...
kind:Deployment
metadata:
name: shasr-app-v2
spec:
replicas: 1
template:
labels:
app: shasr-app
version: v2.0.0
...
...
kind:Service
metadata:
name: shasr-app
spec:
selector:
app: shasr-app
...
...
kind:RouteRule
metadata:
name: shasr-app
spec:
destination:
name: shasr-app
route:
- labels:
version: v1.0.0
weight:95 # 95% traffic
- labels:
version: v2.0.0
weight:5# 5% traffic
...
https://kubernetes.io/ko/docs/concepts/cluster-administration/manage-deployment/#카나리-canary-디플로이먼트
https://medium.com/nerd-for-tech/kubernetes-k8s-deployment-strategies-1ef4c1dc1c6c