[k8s] 9-3. label을 이용한 Canary 배포
카나리 배포란, 소프트웨어를 테스팅을 할 때, 프로그래밍 코드가 조금 바뀐 소프트웨어를 작은 유저 집단에 제공하는 것을 말합니다.
하지만 그 소프트웨어를 받은 유저 집단은 자신들이, 바뀐 소프트웨어를 받았는지 모르고 그냥 사용합니다.
예를 들어 제가 만든 앱을 사용하는 유저가 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
카나리 버전을 배포하면
현재 Service의 Selector가 app: 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개로 돌아가는 중…
댓글남기기