Canary Version Up

jaeyeon ha·2026년 3월 7일

[교육] Kubernetes

목록 보기
31/34

version

  • stable : 안정화 버전
  • beta : 미완성 버전
  • canary : 사용자 반응 보기 위한 버전

mainui-stable pod 생성

[root@master ~/kube/10/canary]# vi mainui-stable.yaml
[root@master ~/kube/10/canary]# cat 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: nginx-container
        image: nginx:1.14
        ports:
        - containerPort: 80
[root@master ~/kube/10/canary]# kubectl create -f mainui-stable.yaml
deployment.apps/mainui-stable created
[root@master ~/kube/10/canary]# kubectl get pod --show-labels
NAME                             READY   STATUS    RESTARTS   AGE   LABELS
mainui-stable-647d7d99d8-lg9q5   1/1     Running   0          8s    app=mainui,pod-template-hash=647d7d99d8,version=stable
mainui-stable-647d7d99d8-v5clr   1/1     Running   0          8s    app=mainui,pod-template-hash=647d7d99d8,version=stable

mainui-stable service 생성

[root@master ~/kube/10/canary]# vi mainui-service.yaml
[root@master ~/kube/10/canary]# cat mainui-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mainui-svc
spec:
  type: ClusterIP
  clusterIP: 10.233.10.10
  selector:
    app: mainui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
[root@master ~/kube/10/canary]# kubectl create -f mainui-service.yaml
service/mainui-svc created
[root@master ~/kube/10/canary]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.233.0.1     <none>        443/TCP   6d2h
mainui-svc   ClusterIP   10.233.10.10   <none>        80/TCP    5s
[root@master ~/kube/10/canary]# kubectl get svc,ep
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.233.0.1     <none>        443/TCP   6d2h
service/mainui-svc   ClusterIP   10.233.10.10   <none>        80/TCP    16s

NAME                   ENDPOINTS                          AGE
endpoints/kubernetes   192.168.2.60:6443                  6d2h
endpoints/mainui-svc   10.233.102.180:80,10.233.75.6:80   16s

[root@master ~/kube/10/canary]# kubectl get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
mainui-stable-647d7d99d8-lg9q5   1/1     Running   0          7m12s   10.233.102.180   node1   <none>           <none>
mainui-stable-647d7d99d8-v5clr   1/1     Running   0          7m12s   10.233.75.6      node2   <none>           <none>
[root@master ~/kube/10/canary]# kubectl describe svc 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.233.10.10
IPs:               10.233.10.10
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.233.102.180:80,10.233.75.6:80
Session Affinity:  None
Events:            <none>

canary deployment 생성

[root@master ~/kube/10/canary]# vi mainui-canary.yaml
[root@master ~/kube/10/canary]# cat 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: nginx-container
        image: nginx:1.15
        ports:
        - containerPort: 80
[root@master ~/kube/10/canary]# kubectl apply -f mainui-canary.yaml
deployment.apps/mainui-canary created
[root@master ~/kube/10/canary]# kubectl get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
mainui-canary-5f6c9dcdf8-8r2hp   1/1     Running   0          6s      10.233.71.45     node3   <none>           <none>
mainui-stable-647d7d99d8-lg9q5   1/1     Running   0          7m53s   10.233.102.180   node1   <none>           <none>
mainui-stable-647d7d99d8-v5clr   1/1     Running   0          7m53s   10.233.75.6      node2   <none>           <none>
[root@master ~/kube/10/canary]# kubectl describe svc 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.233.10.10
IPs:               10.233.10.10
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.233.102.180:80,10.233.71.45:80,10.233.75.6:80
Session Affinity:  None
Events:            <none>

▶ 새로 버전 출시 이전 canary 버전을 통해 사용자의 반응 살필 수 있음

  1. svc에서 label을 통해 app:mainui 에 대해 하나의 canary 버전을 추가하여 제공

  2. 사용자들의 반응에 이상이 없을 경우, canary 버전 pod를 늘리고 기존 pod를 점차 줄여나가는 방식으로 진행

    [root@master ~/kube/10/canary]# kubectl scale deployment mainui-canary --replicas 2
    deployment.apps/mainui-canary scaled
    [root@master ~/kube/10/canary]# kubectl scale deployment mainui-stable --replicas 1
    deployment.apps/mainui-stable scaled
    [root@master ~/kube/10/canary]# kubectl get pod -o wide
    NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
    mainui-canary-5f6c9dcdf8-8r2hp   1/1     Running   0          95s     10.233.71.45     node3   <none>           <none>
    mainui-canary-5f6c9dcdf8-blh5m   1/1     Running   0          15s     10.233.75.5      node2   <none>           <none>
    mainui-stable-647d7d99d8-lg9q5   1/1     Running   0          9m22s   10.233.102.180   node1   <none>           <none>
  3. 결과적으로 canary 버전으로 전체 전환

    [root@master ~/kube/10/canary]# kubectl scale deployment mainui-canary --replicas 3
    deployment.apps/mainui-canary scaled
    [root@master ~/kube/10/canary]# kubectl delete -f mainui-stable.yaml
    deployment.apps "mainui-stable" deleted
    [root@master ~/kube/10/canary]# kubectl get pod -o wide
    NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
    mainui-canary-5f6c9dcdf8-8r2hp   1/1     Running   0          4m32s   10.233.71.45     node3   <none>           <none>
    mainui-canary-5f6c9dcdf8-blh5m   1/1     Running   0          3m12s   10.233.75.5      node2   <none>           <none>
    mainui-canary-5f6c9dcdf8-dklfb   1/1     Running   0          20s     10.233.102.181   node1   <none>           <none>

0개의 댓글