ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Label을 이용한 Canary Deployment
    kubernetes 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
Designed by Tistory.