Canary deployment
有時候,我們需要多個標籤來區分相同微服務的不同版本。對於上線新版微服務,需要經過線上測試(灰度發佈)。一般做法是通過service
將一部分線上流量調度到新版本的pod
,確定運行無誤後,在對所有的pod
進行rolling update
。
首先創建2兩個Deployment,主體內容如下:
#Deployment 1
name: apigw
replicas: 1
...
labels:
app: apigw
track: stable
...
image: 172.16.18.5:30088/admin/centos7.1-v1-apigw:880
對於生成的pod實例,會擁有 app:apigw
和 track: stable
兩個標籤
# Deployment 2
name: apigw-test
replicas: 1
...
labels:
app: apigw
track: canary
...
image: 172.16.18.5:30088/admin/centos7.1-v1-apigw:883
兩個pod實例中,擁有相同的 app:apigw
標籤。通過 track
對應不同的值來標稱應用的正式和測試版本
對於前端的 service
,需要在 selector 字段通過標籤來篩選後端 pod
selector:
app: apaigw
track: stable
此時後端只對應同時擁有 app: apigw
和 track: stable
標籤的pod
[root@k8s-master test]# kubectl describe svc apigw-test --namespace=walker
Name: apigw-test
Namespace: walker
Labels: app=apigw-test
Selector: app=apigw,track=stable
Type: ClusterIP
IP: 10.109.195.90
Port: apigw 80/TCP
Endpoints: 192.168.169.135:80
Session Affinity: None
No events.
當以 app: apigw
爲篩選條件時,service會分別對應兩個 pod
。
[root@k8s-master test]# kubectl describe svc apigw-test --namespace=walker
Name: apigw-test
Namespace: walker
Labels: app=apigw-test
Selector: app=apigw
Type: ClusterIP
IP: 10.109.195.90
Port: apigw 80/TCP
Endpoints: 192.168.169.135:80,192.168.236.32:80
Session Affinity: None
No events.
通過 service
將部分請求分流到測試版本上去,由此可實現測試版本的線上測試。待新版本線上驗證後哦,可通過 rolling update
的方式正式上線。
參考鏈接
https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments