当新版本发布的时候,我们希望能够控制一部分用户来使用新的版本,待验证通过后再发布给所有的用户进行使用。其中部分用户使用新版本的过程我们叫做“金丝雀发布”。 在微服务体系中如果一次只有部分应用发布,需要保证有且仅有目标用户访问新版本。下面我们介绍基于MSE的全链路金丝雀发布。
helm plugin install https://github.com/AliyunContainerService/helm-acr
git clone https://github.com/AliyunContainerService/helm-acr.git
sed -i 's/github.com/helm-acr-releases.oss-cn-hangzhou.aliyuncs.com/g' helm-acr/scripts/install_plugin.sh
helm plugin install helm-acr
git clone https://github.com/AliyunContainerService/helm-acr.git
sed -i '' 's/github.com/helm-acr-releases.oss-cn-hangzhou.aliyuncs.com/g' helm-acr/scripts/install_plugin.sh
helm plugin install helm-acr
# 添加 helm repo
export HELM_REPO_USERNAME='edas_common_test@aliyun-inner.com';
export HELM_REPO_PASSWORD='Hello1234';
helm repo add mse acr://microservice-repo-chart.cn-hangzhou.cr.aliyuncs.com/ms/canary --username ${HELM_REPO_USERNAME} --password ${HELM_REPO_PASSWORD}
# 部署 MSE-Samples
helm install mse-samples mse/mse-samples --namespace default
安装成功后,示例如下:
$ kubectl get svc,deploy,ing
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/nacos-server 1/1 1 1 84m
deployment.extensions/sc-a-gray 1/1 1 1 84m
deployment.extensions/sc-a-normal 4/4 4 4 84m
deployment.extensions/sc-a-normal-without-shutdown 4/4 4 4 84m
deployment.extensions/sc-b-gray 1/1 1 1 84m
deployment.extensions/sc-b-normal 1/1 1 1 84m
deployment.extensions/sc-c 1/1 1 1 84m
deployment.extensions/zuul-gateway 1/1 1 1 84m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 464d
service/nacos-server ClusterIP 172.21.15.186 <none> 8848/TCP 84m
service/zuul-gateway-svc LoadBalancer 172.21.15.231 10.1.243.254 80:32266/TCP 84m
NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/zuul-ingress * 39.106.233.48 80 84m
# 获取ingress的ip
export INGRESS_IP=`kubectl get ing zuul-ingress -n default --output jsonpath="{.status.loadBalancer.ingress[*].ip}"|xargs -I {} echo {}`
安装后的调用关系如下
$ export INGRESS_IP=`kubectl get ing zuul-ingress -n default --output jsonpath="{.status.loadBalancer.ingress[*].ip}"|xargs -I {} echo {}`
$ curl http://${INGRESS_IP}/A/a
A[10.5.21.157] -> B[10.5.21.111] -> C[10.5.21.145]#
$ curl http://${INGRESS_IP}/A/a?env=gray
A1[10.5.23.164] -> B1[10.5.23.174] -> C[10.5.23.172]#
如上所示, 当不添加参数的时候,流量默认通过“生产环境”(非灰度)版本提供服务,对应的字符串是 A[] ->B[] ->C[] 当添加参数之后,流量在应用A、应用B上优先走灰度版本,对应的字符串是 A1[] ->B1[] ->C[]
说明: 例子里面演示的是通过参数来做的,方便大家观察,其他支持的参数包括cookie、header、content body等,而且规则还支持类似于in的规则,可以把灰度的名单都放入列表中。
$ kubectl scale deployment sc-b-gray --replicas=0
$ curl http://${INGRESS_IP}/A/a?env=gray
A1[10.5.23.164] -> B[10.5.23.155] -> C[10.5.23.172]#
如上所示,只有A应用依然通过灰度环境返回,B应用已经开始通过“生产环境”(非灰度环境)返回了。