Kubernetes 蓝绿发布

对于 Istio 用户,云效提供了蓝绿发布的能力支持。从而让用户可以更安全的基于 Istio 的流量管理策略实现应用的安全发布。

实现原理

  • 在 Kubernetes 中 Service 与多个版本的 Deployment 实例直接通过 LabelSelector 进行关联。通过 VirtualService 可以进一步控制流量与特定版本Deployment实例之间的路由策略。

  • 蓝绿发布开始,飞流会基于当前的 Deployment 实例(绿环境)创建一个新版本的应用 Deployment 实例(蓝环境)。

  • 等待蓝环境创建完成后通过更新 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 查看当前的流量策略。