灰度发布、蓝绿部署、金丝雀都是啥?( 四 )


无论我们使用一个或者两个部署,使用 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/#灰度发布
参考