蓝绿发布是一种零停机时间的部署策略,通过在 Kubernetes 中创建两个独立的环境(蓝色和绿色),您可以在不影响现有用户的情况下发布新版本。云效为 Istio 用户提供蓝绿发布支持。用户可以基于 Istio 的流量管理策略,更安全地发布应用。
实现原理
-
在 Kubernetes 中,Service 通过 LabelSelector 关联多个版本的 Deployment 实例,并通过 VirtualService 控制流量路由策略。
-
蓝绿发布开始时,飞流基于当前的绿环境创建一个新版本的蓝环境。
-
蓝环境创建完成后,更新 Istio 的 DestinationRule 生成路由表,并根据用户设置修改 VirtualService 确定流量权重。
-
用户可以设置灰度标,确定哪些流量进入蓝环境。
-
人工验证后,将所有流量切换到蓝环境,并移除绿环境实例。
前提
-
Service/VirtualService/DestinationRule 同名。
-
Deployment 的 labels 内包含有 Service 的全部 selector labels,如:
--- apiVersion: apps/v1 kind: Deployment metadata: labels: run: spring-boot-sample name: spring-boot-sample spec: replicas: 2 selector: matchLabels: run: spring-boot-sample template: metadata: labels: run: spring-boot-sample spec: containers: - image: ${IMAGE} name: app --- apiVersion: v1 kind: Service metadata: name: spring-boot-service labels: test: test labele2: label spec: ports: - name: http port: 8080 protocol: TCP targetPort: 8080 - name: https port: 443 protocol: TCP targetPort: 443 selector: run: spring-boot-sample sessionAffinity: None type: ClusterIP
准备 Istio 应用
在阿里云容器服务 Kubernetes 版中,创建集群后部署 Istio 组件,即可在控制台部署应用并绑定虚拟服务 (VirtualService)。在控制台创建了一个名为 sample-svc 的虚拟服务,并关联了一个 v1 版本的应用实例。
在流水线中添加蓝绿发布任务
创建流水线并完成镜像构建配置后,用户可以通过添加任务向导添加Kubernetes 蓝绿发布任务:
在选择任务组对话框左侧分类中选择部署,然后在右侧卡片列表中选择Kubernetes蓝绿发布。
在蓝绿部署配置中,您需要配置发布的集群和目标服务。在发布前,请确保目标集群已正确安装 Istio 组件,并且关联的命名空间已开启 Istio 自动注入:
在 Kubernetes 蓝绿发布 任务编辑面板中,配置 Kubectl版本(如 v1.16.4)、命名空间(如 default)、服务名称(如 sample-svc)、容器名称(如 sample)、镜像(如标签 ${DATETIME})、灰度流量Cookie标识(如 ^(.*?;)?(gray=true)(;.*)?$)及 灰度版本初始化流量权重(如 0%)。
通过设置灰度 Cookie 标,用户可以通过 Cookie 进入新版环境进行功能验证。灰度版本初始化流量权重设置可以在新版发布完成后,让部分正式流量进入新版环境。对于启动时间较长的应用,您可以设置启动等待时间,确保新版本的流量规则在应用部署完成并等待指定时间后生效。
触发蓝绿部署
通过运行流水线,用户可以触发蓝绿部署流程。
流水线运行后,依次执行阿里云镜像构建和Kubernetes 蓝绿发布两个阶段。镜像构建成功后,蓝绿发布任务进入灰度验证状态,此时单击该任务下方的更多,可展开回滚、完成、日志操作选项。
用户可以通过 Cookie 标记进入新版环境进行验证。验证完成后,点击完成切换到新版应用;若验证不通过,则回滚取消发布。
流水线包含阿里云镜像构建和Kubernetes 蓝绿发布两个阶段,运行成功后状态显示为发布完成。
在发布过程中,用户也可以通过阿里云容器服务 Kubernetes 查看当前的流量策略。
sample-svc 服务详情页的版本管理区域显示:版本 v1(工作负载 sample,实例数 1)灰度策略为流量比例 100%,新版本 v20200518172159(实例数 1)流量比例为 0%,表明蓝绿部署触发后流量仍全部指向旧版本。