Kubernetes 蓝绿发布

蓝绿发布是一种零停机时间的部署策略,通过在 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 查看当前的流量策略。