作为Kubernetes应用部署工具,Kruise Rollouts提供金丝雀发布、蓝绿发布等多种灰度发布策略,并通过与MSE微服务治理的结合,实现对新版本应用在服务调用链路上的平滑灰度升级,确保新版本的稳定性。
全链路灰度介绍
在微服务架构场景下,传统的灰度发布模式往往不能满足交付的复杂需求,全链路灰度发布的场景也就应运而生,此时每个微服务都会有灰度环境或分组来接受灰度流量。开发者希望进入上游灰度环境的流量也能进入下游灰度环境中,确保一个请求始终在灰度环境中传递,从而形成流量泳道。在泳道内的流量链路中,即使这个调用链路上有一些微服务应用不存在灰度环境,那么这些微服务应用在请求下游的时候依然能够重新回到灰度环境中。此时可以根据服务的实际情况,控制多个服务同时进行发布变更,从而保证整个系统的稳定性,效果如下图所示:
Kruise Rollouts介绍
Kruise Rollouts是OpenKruise社区开源的渐进式交付框架。Kruise Rollouts支持配合流量和实例灰度的灰度发布、蓝绿发布和A/B Testing发布。基于Prometheus Metrics指标,Kruise Rollouts还可以实现发布过程的自动化分批与暂停,并提供旁路的无感对接,兼容已有的多种工作负载(Deployment、CloneSet、StatefulSet),更多信息,请参见Kruise Rollouts。
Kruise Rollouts是一种旁路式的工作机制。您只需配置一份Rollouts资源并将其下发到K8s集群中,后续的业务发布和升级均无需额外操作,并且可以与Helm和PaaS平台低成本无缝对接。使用Kruise Rollouts实现灰度发布架构图如下:
前提条件
创建Kubernetes托管版集群且集群版本为1.19及以上。
步骤一:准备工作
安装Kruise Rollouts组件。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击应用管理页签。
在ack-kruise卡片右下方,单击安装。
在弹出的对话框中,单击确定。
安装MSE Ingress组件。创建MseIngressConfig和IngressClass,具体操作,请参见通过MSE Ingress访问容器服务。
为应用开启微服务治理。具体操作,请参见ACK微服务应用接入MSE治理中心。
步骤二:部署Demo应用
部署业务应用(Deployment、Service和Ingress)。
使用如下内容,创建mse-demo.yaml文件。
执行如下命令,部署业务应用。
kubectl apply -f mse-demo.yaml
使用如下内容,创建mse-Ingress.yaml文件。
执行如下命令,创建Ingress规则。
kubectl apply -f mse-ingress.yaml
执行如下命令,获取外部IP。
kubectl get ingress
预期输出如下所示:
NAME CLASS HOSTS ADDRESS PORTS AGE spring-cloud-a <none> * EXTERNAL_IP 80 12m
执行如下命令,查看路由访问情况。替换以下<EXTERNAL_IP>为您上一步获取的外部IP。
curl http://<EXTERNAL_IP>/A/a
预期输出如下所示:
A[192.168.42.115][config=base] -> B[192.168.42.118] -> C[192.168.42.101]%
步骤三:通过Kruise Rollouts实现自动化的全链路灰度发布
定义Kruise Rollouts的灰度发布规则。
说明以下Rollout资源将定义灰度发布规则,发布分为三批:
A/B Testing发布,具有header[User-Agent]=xiaoming的流量将导入到新版本,其它则为老版本。
按照流量比例进行灰度,此批次将灰度50%的实例及流量。
将灰度完成所有的实例。
使用如下内容,创建rollout.yaml文件。
执行如下命令,将该Rollout资源下发到K8s集群。
kubectl apply -f rollout.yaml
执行如下命令,查看Rollout资源的状态。
kubectl get rollout
预期输出STATUS=Healthy,表明Rollout资源正常工作。
升级应用版本。
Kruise Rollouts是一个常态化的配置,将其下发到集群后,后续业务版本发布只需调整Deployment配置,无需再对Kruise Rollouts进行额外操作。例如,业务将spring-cloud-a服务跟spring-cloud-c镜像版本升级到mse-2.0.1,然后通过执行
kubectl apply -f mse-demo.yaml
命令将Deployment部署到集群。将Deployment配置下发到K8s集群时,除kubectl方式外,也可以使用Helm或Vela等方式。修改mse-demo.yaml文件,将spring-cloud-a服务跟spring-cloud-c镜像版本升级到mse-2.0.1。
执行如下命令,查看Rollout资源的状态。
kubectl get rollouts rollouts-a -n default kubectl get rollouts rollouts-c -n default
预期输出:
NAME STATUS CANARY_STEP CANARY_STATE MESSAGE AGE rollouts-a Progressing 1 StepPaused Rollout is in step(1/1), and you need manually confirm to enter the next step 41m rollouts-c Progressing 1 StepPaused Rollout is in step(1/1), and you need manually confirm to enter the next step 41m
通过预期输出的STATUS和CANARY,可以观察Rollout的过程以及步骤:
若预期输出STATUS=Progressing:表明已经在灰度发布过程中。
若预期输出CANARY_STATE=StepPaused:表明当前批次已经完成,是否需要继续,可通过人工确认。
确认灰度发布的新版本发布正常后,继续后续发布。
前面的步骤仅发布部分实例以及部分的金丝雀流量灰度,通过一些业务日志或监控确认新版本发布正常后,可通过
rollout.rollouts.kruise.io/<rollouts-demo> approved
命令继续后续发布,其中<rollouts-demo>表示Rollout资源的名称。(可选)若新版本服务异常,可进行业务回滚。
如果在Rollout过程中,发现新版本服务异常,可以通过Deployment配置恢复到之前版本。然后通过
kubectl apply -f mse-demo.yaml
命令进行部署,无需对Rollout资源做任何改动。
在微服务治理架构中,全链路灰度功能提供流量分流,极大地方便了测试和发布时的快速验证,结合Kruise Rollouts能够大幅度帮助DevOps提升线上稳定性。