持续部署 + TKE Mesh 灰度发布实践
灰度发布(又名金丝雀发布)可实现业务从老版本到新版本的平滑过渡,并且避免升级过程中出现的问题对用户造成的影响。在云原生的背景下,像 Kubernetes 这样的平台可实现简单的灰度发布,但其功能非常有限,只能通过控制 pod 副本比例管理流量,并且不支持根据特定规则将请求路由到灰度版本。
但使用 isito,副本部署和流量管理是两个完全独立的功能,服务的 pod 数量可以根据流量负载灵活伸缩,与版本流量路由的控制完全正交;基于 istio,可以轻松实现细粒度控制流量百分比(例如,路由 1% 的流量到灰度版本),当然也可以使用其他规则(如:url、headers 等)来控制流量。
TKE Mesh(腾讯云服务网格) 基于 istio,在开源版本的基础上优化了 envoy 的转发性能,并实现控制面托管/多活以及多集群网格产品化。灰度发布流程涉及多个微服务部署、人工审核、灰度比例控制等步骤,基于 CODING CD(持续部署),可以实现灰度发布流程的灵活编排,在关键节点进行人工审核、动态指定灰度比例,使用表达式控制分支流程等特性。
接下来我们将结合 CODING CD 和 TKE Mesh 演示灰度发布流程。
灰度发布 Bookinfo 应用演示
我们以 istio 官方的 Bookinfo 示例项目作为 demo,并在它的基础上做了 yaml 配置优化,更符合 CODING + TKE Mesh 灰度发布的 Demo 演示。对于不熟悉 istio 的同学,有必要对 Bookinfo 应用做简单的介绍。
Bookinfo 应用由四个单独的微服务构成。 这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
Bookinfo 应用分为四个单独的微服务:
-
productpage
. 这个微服务会调用details
和reviews
两个微服务,用来生成页面。 -
details
. 这个微服务中包含了书籍的信息。 -
reviews
. 这个微服务中包含了书籍相关的评论。它还会调用ratings
微服务。 -
ratings
. 这个微服务中包含了由书籍评价组成的评级信息。
reviews
微服务有 3 个版本:
- v1 版本不会调用
ratings
服务。 - v2 版本会调用
ratings
服务,并使用 1 到 5 个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings
服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。
Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews
服务具有多个版本。
阅读更多:Bookinfo 应用
基于 Bookinfo 应用,我们将演示如下的灰度发布效果:
- 部署 bookinfo 应用的基准版本(v1),即四个微服务
productpage
、details
、reviews
和ratings
都是 v1 版本 - 腾讯云 TKE Mesh(服务网格) 控制台查看网格拓扑
- 部署 reviews 服务的灰度版本(v2)
- 设置灰度比例
- 人工确认是否全量发布
- 将所有流量切换到灰度版本(v2)
部署基准版本(v1)
在 CODING 持续部署(CD)提交发布单,部署基准版本(v1)。配置制品
处分别选择应用、Ingress Gateway、Destination Rule 和 VirtualServices 对应的 yaml 文件。
部署完成后,在 TKE Mesh(服务网格)控制台查看生成的网络拓扑(网格拓扑中看不到 ratings-v1
是因为reviews-v1
没有调用ratings-v1
)。
查看 Gateway 的信息,根据外网 IP 访问 bookinfo 服务。
浏览器打开示例网址浏览 bookinfo 应用的 Web 页面,无论怎么刷新页面都发现 reviews 服务只有 v1 版本的效果(没有红色或黑色的星形)。
灰度发布(v2)
在 CODING CD 提交发布单,执行灰度发布流程。
配置制品
处填写 reviews v2
yaml 文件的路径(platform/kube/bookinfo-reviews-v2.yaml
)和分支;reviews
服务增加灰度版本后,需要更新 Destination Rule(包含 v1 和 v2 的配置),填写 Destination Rule 的路径(networking/destination-rule-v1-v2.yaml
)和分支。
启动参数
指定基准版本和灰度版本(即 v1 和 v2)。
设置灰度比例为 50% 。
在 TKE Mesh 控制台查看网络拓扑已更新(productpage-v1
的请求会被转发到 reviews-v1
或 reviews-v2
)。
执行完下一阶段,灰度比例生效后,访问 http://49.233.239.50/productpage
会发现 reviews
服务的 v1 和 v2 版本流量各占 50%(黑色星形和没有星形交替出现)。
当确认灰度版本(v2)版本稳定后,选择全量发布,将所有流量切换到灰度版本(v2)。
在 TKE Mesh 控制台查看网络拓扑已更新(没有 reviews-v1)。
访问 http://49.233.239.50/productpage
会发现 reviews
服务所有流量都发送到 v2 版本。即无论怎么刷新页面都发现 reviews 服务只有 v2 版本的效果(只显示黑色星形)。
配置过程
具体是如何实现上述的灰度发布效果呢,接下来跟着本教程动手实践。
TKE 集群
使用腾讯云 TKE 创建一个 Kubernetes 集群
TKE Mesh
在 TKE 控制台创建服务网格实例,在服务发现
处选择上一步骤创建的 TKE 集群;并开启 default
命名空间的 sidecar 自动注入功能。
CODING DevOps
如果你没有 CODING DevOps 账号,请在腾讯云控制台访问 CODING DevOps,根据提示开通即可。
代码仓库
克隆源代码并推送到自己的 CODING 代码库。
git clone https://ci-cd.coding.net/public/bookinfo/bookinfo/git
git remote remove origin
git remote add origin 你的 CODING 代码库地址
git push origin master
添加云账号
在 CODING 持续部署添加 TKE 集群。
创建应用并配置部署流程
进入 CODING 持续部署控制台创建名为 bookinfo
的应用,然后配置部署流程。
部署基准版本(v1)
配置了 4 个启动所需制品分别是:
-
platform/kube/bookinfo-reviews-v1.yaml
:部署 bookinfo 四个微服务的 v1 版本。 -
networking/bookinfo-gateway.yaml
:部署具有外网 IP 的 Ingress Gateway,通过此 Gateway 访问 bookinfo 应用的 Web 页面。 -
networking/destination-rule-all-reviews-v1.yaml
:部署四个微服务 v1 版本的 Destination Rule。 -
networking/virtual-service-all-v1.yaml
:部署四个微服务 v1 版本的 Virtual Services。
在第二个阶段部署 Ingress 网关
执行完成后,就可以通过 Gateway 的外网 IP 访问 bookinfo 应用。后续两个阶段的作用是使用 Tke Mesh 对 bookinfo 进行流量管理。
reviews 灰度发布
配置了两个启动所需制品分别是:
-
canary-reviews-deployment
:reviews 服务灰度版本的 Deployment 内容,在此 demo 中将会使用文件platform/kube/bookinfo-reviews-v2.yaml
。 -
canary-reviews-destination-rule
:包含 v1 和 v2 的 subset 配置,在此 demo 中将会使用文件networking/destination-rule-v1-v2.yaml
。
「设置灰度比例」是一个人工确认阶段,通过参数 canary-ratio
指定灰度比例。
「灰度比例生效」是一个 Virtual Service 模板,可根据部署流程启动参数和上一阶段的 canary-ratio
参数对 reviews 服务的流量进行动态管理。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: '${parameters.base_version}'
weight: >-
${100 -
#toInt(#stage("设置灰度比例")["context"]["customParams"]["canary_ratio"])}
- destination:
host: reviews
subset: '${parameters.canary_version}'
weight: >-
${#toInt(#stage("设置灰度比例")["context"]["customParams"]["canary_ratio"])}
最后两个阶段可以根据「是否全量发布」阶段的确认选项(通过「#judgment(‘是否全量发布’)」表达式获取上一阶段的确认选项),判断全量发布灰度版本或直接结束部署流程。
以上两个部署流程的 json 配置存放在 bookinfo 代码仓库的 coding-cd-template
目录中,可直接导入 CODING CD 快速创建部署流程。
将应用关联到项目(在项目内提交发布单)
部署流程配置完成后,将应用关联到项目,即可在项目内提交发布单,实现「reviews」服务的灰度发布。
小结
本文主要聚焦基于 CODING CD + TKE Mesh 的灰度发布实践,没有涉及更多 CODING DevOps 的能力。除了以上的灰度发布 Demo,你可以基于 CODING 平台实现一站式 DevOps 研发实践。具体来说,上述的灰度发布 Demo 可以结合 CODING 持续集成、制品库;实现代码提交后,自动构建 bookinfo 各微服务的 Docker 镜像上传到制品库,推送完成后自动触发灰度发布的流水线执行。
此外,结合 CODING CD + TKE Mesh,还可以拓展更多的微服务治理和发布能力,比如:
- 通过全链路跟踪系统进行服务性能分析。
- 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
- 基于 TKE Mesh(istio) 的熔断和限流能力,通过 CODING CD 联动监控系统(如腾讯云监控),实现业务系统压力较大时自动触发熔断和限流的部署流程,保证业务稳定。
公开资源和参考资料
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。