蓝绿发布是一种零停机时间的部署策略,通过在 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 蓝绿发布任务,如下所示:
在蓝绿部署配置中,您需要配置发布的集群和目标服务。在发布前,请确保目标集群已正确安装 Istio 组件,并且关联的命名空间已开启 Istio 自动注入,如下所示:
通过设置灰度 Cookie 标,用户可以通过 Cookie 进入新版环境进行功能验证。灰度版本初始化流量权重设置可以在新版发布完成后,让部分正式流量进入新版环境。对于启动时间较长的应用,您可以设置启动等待时间,确保新版本的流量规则在应用部署完成并等待指定时间后生效。
触发蓝绿部署
通过运行流水线,用户可以触发蓝绿部署流程。
用户可以通过 Cookie 标记进入新版环境进行验证。验证完成后,点击完成切换到新版应用;若验证不通过,则回滚取消发布。
在发布过程中,用户也可以通过阿里云容器服务 Kubernetes 查看当前的流量策略。