-
[따배쿠] Label을 이용한 Canary Deploymentkubernetes 2024. 12. 10. 13:24
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
'kubernetes' 카테고리의 다른 글
[따배쿠] Secret (1) 2024.12.25 [따배쿠] ConfigMap (0) 2024.12.24 [따배쿠] Annotation (0) 2024.12.10 [따배쿠] Node Label (0) 2024.12.10 [따배쿠] Label (0) 2024.12.10 - Pod를 배포(업데이트) 하는 방법