无论我们使用一个或者两个部署,使用 Docker,Mesos/Marathon 或 Kubernetes 等容器编排平台进行的金丝雀发布管理都存在一个根本问题:使用实例扩容来管理流量;版本流量分发和副本部署在上述平台中并独立 。所有 pod 副本,无论版本如何,在 kube-proxy 循环池中都被一视同仁地对待,因此管理特定版本接收的流量的唯一方法是控制副本比例 。以小百分比维持金丝雀流量需要许多副本(例如,1% 将需要至少 100 个副本) 。即使我们可以忽略这个问题,部署方式功能仍然非常有限,因为它只支持简单(随机百分比)金丝雀部署 。如果我们想根据某些特定规则将请求路由到金丝雀版本上,我们仍然需要另一种解决方案 。
使用 Istio,流量路由和副本部署是两个完全独立的功能 。服务的 pod 数量可以根据流量负载灵活伸缩,与版本流量路由的控制完全正交 。这在自动缩放的情况下能够更加简单地管理金丝雀版本 。事实上,自动缩放管理器仍然独立运行,其在响应因流量路由导致的负载变化与其他原因导致负载变化的行为上没有区别 。
Istio 的[路由规则]也带来了其他的便利;你可以轻松实现细粒度控制流量百分比(例如,路由 1% 的流量而不需要 100 个 pod),当然也可以使用其他规则来控制流量(例如,将特定用户的流量路由到金丝雀版本) 。作为展示,让我们看一下采用这种方式部署 helloworld 服务的简单便捷 。
首先我们定义 helloworld 服务,和普通 Kubernetes 服务一样,如下所示:
apiVersion: v1kind: Servicemetadata:name: helloworldlabels:App: helloworldspec:selector:app: helloworld... 然后我们添加 2 个 Deployment,分别为版本 v1 和 v2,这两个版本都包含服务选择标签 app:helloworld
kind: Deploymentmetadata:name: helloworld-v1spec:replicas: 1template:metadata:labels:app: helloworldversion: v1spec:containers:- image: helloworld-v1...---apiVersion: extensions/v1beta1kind: Deploymentmetadata:name: helloworld-v2spec:replicas: 1template:metadata:labels:app: helloworldversion: v2spec:containers:- image: helloworld-v2...需要注意的是,这与使用普通 Kubernetes 进行[金丝雀部署]的方式完全相同,但是在 Kubernetes 方式下控制流量分配需要调整每个 Deployment 的副本数目 。例如,将 10% 的流量发送到金丝雀版本(v2),v1 和 v2 的副本可以分别设置为 9 和 1 。
但是在[启用 Istio] 的集群中,我们可以通过设置路由规则来控制流量分配 。如将 10% 的流量发送到金丝雀版本本,我们可以使用 kubectl 来设置以下的路由规则:
kubectl apply -f - <<EOFapiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: helloworldspec:hosts:- helloworldhttp:- route:- destination:host: helloworldsubset: v1weight: 90- destination:host: helloworldsubset: v2weight: 10---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: helloworldspec:host: helloworldsubsets:- name: v1labels:version: v1- name: v2labels:version: v2EOF 当规则设置生效后,Istio 将确保只有 10% 的请求发送到金丝雀版本,无论每个版本的运行副本数量是多少 。
以上是使用istio 进行的金丝雀部署,当然蓝绿也是类似的 。
spring cloudspring cloud gateway也可以实现灰度发布,另外还有一款 spring cloud 的增强组件,可以实现灰度、蓝绿等功能(Discovery: https://github.com/Nepxion/Discovery)
网关利用云原生网关比如 APISIX :
- https://apisix.Apache.org/zh/docs/apisix/plugins/traffic-split/#蓝绿发布
- https://apisix.apache.org/zh/docs/apisix/plugins/traffic-split/#灰度发布
- https://cloud.tencent.com/developer/article/1835861
- https://www.infoq.cn/article/lei4vsfpiw5a6en-aso4
- https://zhuanlan.zhihu.com/p/42671353
- https://www.cnblogs.com/fulu/p/15648351.html
- https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/](https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/
- https://cloud.tencent.com/developer/article/1835861](https://cloud.tencent.com/developer/article/1835861
- https://istio.io/latest/zh/blog/2017/0.1-canary/
- https://www.zerchin.xyz/2020/08/10/K8s-1-18-6版本基于-ingress-nginx-实现金丝雀发布(灰度发布)
- https://www.cnblogs.com/Courage129/p/14498788.html
- https://cloud.tencent.com/developer/article/1620795
推荐阅读
- 乐视|乐视发布九大声明 调侃:活到今天“何止是奇迹简直不科学”
- 女子|女子违法开车发视频求举报:天天走、我很怕吗?
- 联想|联想用户谨慎更新!新BIOS可能导致笔记本启动失败、蓝屏等故障
- 一套BS架构,支持PC、H5端的开源知识管理系统、知识库系统
- PS中图层、通道的概念和作用?
- Linux:文件解压、复制和移动的若干坑
- 红茶喝几泡,红茶干茶的色泽
- 了解路由器的寻址转发,学习默认路由、静态路由的配置部署
- 一步步教你虚拟机安装Linux
- 无线路由器|双频14天线!新华三NX15000万兆路由发布:首发999元
