kubernetes

[따배쿠] Label을 이용한 Canary Deployment

bbiyak2da 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