1 분 소요

카나리 배포란, 소프트웨어를 테스팅을 할 때, 프로그래밍 코드가 조금 바뀐 소프트웨어를 작은 유저 집단에 제공하는 것을 말합니다.

하지만 그 소프트웨어를 받은 유저 집단은 자신들이, 바뀐 소프트웨어를 받았는지 모르고 그냥 사용합니다.

예를 들어 제가 만든 앱을 사용하는 유저가 100명이라고 가정할 때

95명에게는 안정적인 버전의 앱을 제공하고 나머지 5명에게는 조금 실험적인 코드가 담긴 앱을 제공하는 겁니다.

이 카나리 테스트는 바뀐 코드가 어떤 버그를 유발하는지 빨리 잡아낼 수 있게 해주고 코드 업데이트를 할 때의 경고등이 되어줍니다.

이 카나리 테스트는 대개 sandbox 환경에서의 테스트가 끝나면 시행됩니다.

Stable version 정의

# 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

kubectl create -f mainui-stable.yaml

kubectl get pods --show-labels

NAME                             READY   STATUS    RESTARTS   AGE    LABELS
mainui-stable-6ffd65b847-9fsm6   1/1     Running   0          2m3s   app=mainui,pod-template-hash=6ffd65b847,version=stable
mainui-stable-6ffd65b847-zwtfd   1/1     Running   0          2m3s   app=mainui,pod-template-hash=6ffd65b847,version=stable
# mainui-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mainui-svc
spec:
  selector:
    app: mainui
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080

__service__를 이용해 두개의 replicas에 단일 진입점을 만들어주면,

cluster-ip로 접속하면 Stable 버전의 nginx 2개가 나란히 실행된다.

controlplane $ kubectl get svc

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    27m
mainui-svc   ClusterIP   10.98.252.157   <none>        8080/TCP   40s

controlplane $ kubectl describe svc mainui-svc

endpoint가 2개가 설정되있는 것을 볼 수 있다.

Name:              mainui-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=mainui
Type:              ClusterIP
IP:                10.98.252.157
Port:              <unset>  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.1.4:80,10.244.1.5:80

카나리 버전 정의

# mainui-canary.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mainui-canary
spec:
  replicas: 1 # 레플리카 수 1개
  selector:
    matchLabels:
      app: mainui
      version: canary 
  template:
    metadata:
      labels:
        app: mainui
        version: canary # 레이블 버전 : canary
    spec:
      containers:
      - name: mainui
        image: nginx:1.15 # 컨테이너 버전 1.14 -> 1.15
        ports:
          - containerPort: 80

카나리 버전을 배포하면

현재 ServiceSelectorapp: mainui로 설정 되어있기 때문에,

카나리 버전을 배포하면 바로 같은 클러스터 ip에서 실행된다.

따라서 현재는 3개의 endpoint가 존재

controlplane $ kubectl describe svc mainui-svc 
Name:              mainui-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=mainui
Type:              ClusterIP
IP:                10.98.252.157
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.4:80,10.244.1.5:80,10.244.1.6:80
Session Affinity:  None
Events:            <none>

$ kubectl get deployments

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
mainui-canary   1/1     1            1           95s
mainui-stable   2/2     2            2           10m

카나리 배포판 테스트에 문제가 없는 것이 확인되었다.

지금 당장은 카나리 버전을 사용하지 않기에 삭제

kubectl delete deployments.apps mainui-canary

다시 old version 2개로 돌아가는 중…

댓글남기기