Java体系-微服务治理-全链路金丝雀发布

当新版本发布的时候,我们希望能够控制一部分用户来使用新的版本,待验证通过后再发布给所有的用户进行使用。其中部分用户使用新版本的过程我们叫做“金丝雀发布”。 在微服务体系中如果一次只有部分应用发布,需要保证有且仅有目标用户访问新版本。下面我们介绍基于MSE的全链路金丝雀发布。

前提条件


  1. 创建ACK集群,请参见创建Kubernetes托管版集群
  2. 安装 ack-mse-pilot,请参见ack-mse-pilot使用说明

操作步骤


步骤一:安装Demo应用

  1. 安装helm-acr插件。
  • 如果您位于海外或访问Github比较流畅,执行以下命令安装Helm插件。
helm plugin install https://github.com/AliyunContainerService/helm-acr
  • 如果您位于国内且为Linux操作系统,执行以下命令安装Helm插件。
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
  • 如果您位于国内且为Mac操作系统,执行以下命令安装Helm插件。
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
  1. 安装demo应用。
# 添加 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 {}`

安装后的调用关系如下 应用调用关系

步骤二:配置全链路灰度的规则

  1. 登录MSE治理中心控制台,选择应用列表
  2. 单击应用mse-sc-a操作列中的金丝雀应用的金丝雀按钮
  3. 设置灰度规则。更多信息请参见金丝雀发布。 | 参数 | 描述 | | —- | —- | | 框架类型 | 即springcloud还是dubbo | | 服务方法 | 具体的接口类和方法名 | | 条件模式 | 下面条件列表里多个条件间是“与”还是“或”的关系 | | 条件列表 | 具体的条件,该例子中为参数 env 等于 gray字符串 | | 是否链路传递 | 是否把当前应用里识别出的灰度流量的标签传递下去,本例中选择继续传递下去完成全链路的金丝雀能力的验证 |

步骤三:验证全链路灰度的规则

  1. 验证灰度客户的流量和非灰度客户的流量
$ 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的规则,可以把灰度的名单都放入列表中。

  1. 将应用mse-sc-b的灰度版本sc-b-gray 副本数从1调整到0,验证在灰度版本不存在的情况下,自动访问对应的生产版本。
$ 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应用已经开始通过“生产环境”(非灰度环境)返回了。

操作总结


  1. 整个过程是无代码侵入的。
  2. 只需要在入口应用设置规则,该流量的标签是可以“传递”下去。
  3. 在每个应用的调用过程中,符合金丝雀条件的流量会优先调用对应的“金丝雀”版本,如果没有“金丝雀”版本则会自动切换回“生产”版本。