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 버전을 통해 사용자의 반응 살필 수 있음
svc에서 label을 통해 app:mainui 에 대해 하나의 canary 버전을 추가하여 제공
사용자들의 반응에 이상이 없을 경우, 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>
결과적으로 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>