有时候,我们需要多个标签来区分相同微服务的不同版本。对于上线新版微服务,需要经过线上测试(灰度发布)。一般做法是通过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