• 沒有找到結果。

利用Kubernetes原生的特性可以实现简单的灰度发布或蓝绿发布,比如:通过修改 Service的selector中决定服务版本的label的值来改变Service后端对应的Pod,实现让服 务从一个版本直接切换到另一个版本,从而实现蓝绿发布。如果您的灰度或蓝绿发布 需求较复杂,可以向集群额外部署其他开源工具,例如Nginx Ingress、Traefik,或将 业务部署至应用服务网格(Application Service Mesh,简称ASM),利用开源工具和 服务网格的能力实现。这三种方式分别对应本文如下内容:

● 使用Service实现简单的灰度发布和蓝绿发布

● 使用Nginx Ingress实现灰度发布和蓝绿发布

● 使用ASM实现灰度发布和蓝绿发布

6-1 三种实现方式对比

实现方式 适用场景 特点 缺点

Service 发布需求简单,

小规模测试场景

无需引入过多插件或复杂的用 法

纯手工操作,自动 化程度差

Nginx

Ingress 无特殊要求 ● 配置Nginx Ingress所支持的 Annotation即可实现灰度发 布或蓝绿发布,无需关注内 部原理

● 支持基于Header、Cookie 和服务权重三种流量切分的 策略

集群需要安装 nginx-ingress插 件,存在资源消耗

实现方式 适用场景 特点 缺点 ASM 商用场景 ● 无需修改应用的服务代码,

非侵入式治理

● 界面可视化,灰度发布或蓝 绿发布过程中的流量变化可 通过拓扑图、曲线图等直观 查看

● 可配置的灰度策略更全面,

包括基于流量比例、基于请 求内容(Header、

Cookie、操作系统、浏览 器)

需要为集群启用 Istio,占用额外资 源

Service和Nginx Ingress方式均利用Kubernetes开源能力实现灰度发布和蓝绿发布,在 这个过程中,华为云CCE也提供了很多便捷性,例如:

● 所有资源的创建、查看、修改均可以在管理控制台实现,相比kubectl命令行工具 更为直观。

● LoadBalancer类型的Service由华为云ELB服务实现,在创建Service时,可以使用 已有ELB实例,也可以新建一个ELB实例。

● 支持一键式安装nginx-ingress插件,并且在安装过程中实现ELB的创建与对接。

6.2 使用 Service 实现简单的灰度发布和蓝绿发布

CCE集群实现灰度发布通常需要向集群额外部署其他开源工具,例如Nginx Ingress,

或将业务部署至服务网格,利用服务网格的能力实现。这些方案均有一些难度,如果 您的灰度发布需求比较简单,且不希望引入过多的插件或复杂的用法,则可以参考本 文利用Kubernetes原生的特性实现简单的灰度发布和蓝绿发布。

原理介绍

用户通常使用无状态负载 Deployment、有状态负载 StatefulSet等Kubernetes对象来 部署业务,每个工作负载管理一组Pod。以Deployment为例,示意图如下:

通常还会为每个工作负载创建对应的Service,Service使用selector来匹配后端Pod,其 他服务或者集群外部通过访问Service即可访问到后端Pod提供的服务。如需对外暴露 可直接设置Service类型为LoadBalancer,弹性负载均衡ELB将作为流量入口。

● 灰度发布原理

以Deployment为例,用户通常会为每个Deployment创建一个Service,但

Kubernetes并未限制Service需与Deployment一一对应。Service通过selector匹配 后端Pod,若不同Deployment的Pod被同一selector选中,即可实现一个Service对 应多个版本Deployment。调整不同版本Deployment的副本数,即可调整不同版 本服务的权重,实现灰度发布。示意图如下:

● 蓝绿发布原理

以Deployment为例,集群中已部署两个不同版本的Deployment,其Pod拥有共 同的label。但有一个label值不同,用于区分不同的版本。Service使用selector选 中了其中一个版本的Deployment的Pod,此时通过修改Service的selector中决定 服务版本的label的值来改变Service后端对应的Pod,即可实现让服务从一个版本 直接切换到另一个版本。示意图如下:

前提条件

已上传Nginx镜像至容器镜像服务。为方便观测流量切分效果,Nginx镜像包含v1和v2 两个版本,欢迎页分别为“Nginx-v1”和“Nginx-v2”。