[따배쿠] Label을 이용한 Canary Deployment
Canary Deployment
- Pod를 배포(업데이트) 하는 방법
- 블루 그린 업데이트
- 카나리 업데이트
- 롤링 업데이트
- Canary 배포
- 기존 버전을 유지한 채로, 일부 버전만 신규 버전으로 올려서 신규 버전에 버그 및 이상이 없는지 확인
- Label을 이용!
예시
[mainui-stable] # blue (구 버전 1.14)
# mainui-stable.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/9# vi mainui-stable.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mainui-stable
spec:
replicas: 2
selector:
matchLabels:
app: mainui
version: stable
template:
metadata:
labels:
app: mainui
version: stable
spec:
containers:
- name: mainui
image: nginx:1.14
ports:
- containerPort: 80
# 생성
root@master:~/Getting-Start-Kubernetes/9# kubectl create -f mainui-stable.yaml
deployment.apps/mainui-canary created
[mainui-svc]
# mainui-service.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/9# cat mainui-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mainui-svc
spec:
selector:
app: mainui
ports:
- port: 80
protocol: TCP
targetPort: 80
# 생성
root@master:~/Getting-Start-Kubernetes/9# kubectl create -f mainui-service.yaml
service/mainui-svc created
mainui-stable, mainui-canary의 pod들의 단일 진입점인 Service를 생성한다.
현재는 mainui-stable만 배포 되어있으므로 해당 Service에는 mainui-stable의 pod 그룹들만 연결되어있다.
[mainui-canary] # Green (새 버전 1.15)
# mainui-canary.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/9# vi mainui-canary.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mainui-canary
spec:
replicas: 1
selector:
matchLabels:
app: mainui
version: canary
template:
metadata:
labels:
app: mainui
version: canary
spec:
containers:
- name: mainui
image: nginx:1.15
ports:
- containerPort: 80
# 생성
root@master:~/Getting-Start-Kubernetes/9# kubectl create -f mainui-canary.yaml
deployment.apps/mainui-canary created
root@master:~/Getting-Start-Kubernetes/9# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30h
mainui-svc ClusterIP 10.97.156.116 <none> 80/TCP 14m
root@master:~/Getting-Start-Kubernetes/9# kubectl describe service mainui-svc
Name: mainui-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=mainui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.97.156.116
IPs: 10.97.156.116
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 192.168.104.35:80,192.168.104.36:80,192.168.166.179:80
Session Affinity: None
Events: <none>
Green이 배포됨과 동시에 Service와 연결된다.
Serivice에는 mainui-stable과 mainui-canary가 연결되어있다.
즉, mainui-svc의 IP인 10.98.29.132:80로 진입하면 mainui-stable(Blue)의 pod들이나 mainui-canary(Green)의 pod들에 연결된다. (이는 label selector에 app:mainui 를 할당해서 가능하다.)
# 확인
root@master:~/Getting-Start-Kubernetes/9# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
mainui-canary 1/1 1 1 20m
mainui-stable 2/2 2 2 19m
stable과 canary가 잘 배포되어 있는 것을 확인 가능
root@master:~/Getting-Start-Kubernetes/9# kubectl scale deployment mainui-canary --replicas=2
deployment.apps/mainui-canary scaled
새 버전인 canary는 늘리고
root@master:~/Getting-Start-Kubernetes/9# kubectl scale deployment mainui-stable --replicas=1
deployment.apps/mainui-stable scaled
구 버전인 stable을 줄이고 확인
root@master:~/Getting-Start-Kubernetes/9# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
mainui-canary 2/2 2 2 22m
mainui-stable 1/1 1 1 21m
이렇게 해도 고객은 똑같은 서비스를 사용할 수 있다.
curl 10.97.156.116(Service IP)시, 정상적으로 접근이 가능하고
내가 mainui-stable의 Pod에 접근해 있는지, mainui-canary의 Pod에 접근해 있는지 확인은 불가능하다.
그냥 정상적으로 접속은 되는거니~~ 됐당
# stable 버전 완전 삭제
root@master:~/Getting-Start-Kubernetes/9# kubectl delete deployments.apps mainui-stable
deployment.apps "mainui-stable" deleted
안정성도 확인 했고, stable pod 그룹들을 삭제하면
이제 canary pod들만 운영하게 된다!
참고 영상
https://www.youtube.com/watch?v=u588KXtBoKU