文档首页> 流水线 CodeArts Pipeline> 最佳实践> 基于K8S原生Service的场景完成微服务蓝绿发布
更新时间:2024-06-11 GMT+08:00
分享

基于K8S原生Service的场景完成微服务蓝绿发布

在进行服务发布的时候,通常会碰到这样的问题:

  • 直接在生产环境发布后再继续进行测试,可能带来较大风险,对线上用户造成影响。
  • 测试环境虽然和生产环境高度一致,然而实际情况下,由于资源配置、网络环境等,测试环境和生产环境之间总会存在差异,因此难以在测试环境覆盖验证所有场景。

通过灰度发布可以实现在不引发风险的同时,在生产环境进行发布及验证。

灰度发布是在生产环境中创建与当前线上服务完全一致的工作负载(灰度负载),仅对其中的包版本(业务代码和配置)进行更新,但是新创建的工作负载不承接任何现网流量,对线上用户没有任何影响。此时,就可以在没有风险的情况下,在生产环境放心地进行测试了。在灰度环境验证无问题之后,就可以逐渐将线上用户的真实访问引流到灰度负载,直至完全引流之后,新创建的灰度负载承接所有现网流量,原先的线上负载不承接任何流量,此时就可以安全地删除旧负载,保留新负载,完成一次发布。

按照引流方式的不同,当前常用的灰度发布方式有:快速完成100%流量切换的蓝绿发布和按流量比例或线上请求内容引流的金丝雀发布。通常情况,蓝绿发布已经足以降低发布风险,蓝绿发布有如下优势:

  • 不需要集群安装额外的插件。
  • 无风险的进行生产环境灰度验证。
  • 快速进行流量切换(从旧负载切换新负载,或从新负载切回旧负载)。
  • 在验证阶段发现问题后,可以快速将线上服务恢复(回滚)至发布前的状态。

操作流程

本文介绍在不需要占用集群额外资源安装插件的情况下,基于K8S原生Service的场景完成微服务蓝绿发布,基本操作流程如下:

步骤1:新建环境

步骤2:编辑发布策略

步骤3:运行流水线

准备工作

  • 新建项目
  • 新建空仓库空模板流水线
  • 具有创建部署应用的权限,可参考部署服务编辑权限管理添加权限。
  • 开通购买CCE服务,并在CCE集群中创建服务相关Service和Deployment:创建Service和Deployment
    • Service和Deployment资源相关参考:服务(Service)Deployments
    • Service需要配置为关联至Deployment而非Pod,并且有且仅有一个Deployment与之关联。

    通常默认创建的资源即可满足要求,若有问题,可检查Service的spec.selector配置与Deployment的spec.selector.matchLabels配置是否相匹配。

  • Deployment示例配置,以下示例将创建名为nginx的工作负载:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
        version: v1
    spec:
      replicas: 1
      minReadySeconds: 10
      progressDeadlineSeconds: 60
      strategy:
        rollingUpdate:
          maxSurge: 20%
          maxUnavailable: 20%
      selector:
        matchLabels:
          app: my-nginx
          version: v1
      template:
        metadata:
          labels:
            app: my-nginx
            version: v1
        spec:
          containers:
            - name: nginx
              image: nginx
              imagePullPolicy: IfNotPresent
              startupProbe:
                tcpSocket:
                  port: 80
              livenessProbe:
                tcpSocket:
                  port: 80
              readinessProbe:
                tcpSocket:
                  port: 80
  • Service示例配置,以下示例将创建名为nginx-service的Service资源:
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      labels:
        app: nginx-service
    spec:
      type: NodePort
      selector:
        app: my-nginx
        version: v1
      ports:
        - port: 8000
          targetPort: 80
          nodePort: 32500

步骤1:新建环境

  1. 登录软件开发生产线
  2. 搜索准备工作中已创建的项目,单击项目名称,进入项目。
  3. 单击左侧导航“持续交付 > 发布管理”,进入环境列表页面。
  4. 单击“新建环境”,弹出“新建环境”对话框,配置以下信息。

    表1 新建集群

    参数项

    说明

    环境名称

    项目下环境唯一标识,创建后不可修改,输入“灰度发布demo”。

    资源类型

    承载服务的资源类型,选择“CCE”。

    发布用户

    选择“当前用户”。

    区域

    选择准备工作中已购买的集群所在的区域。

    集群

    选择准备工作中已购买的集群。

    环境级别

    环境类型,选择“测试环境”,环境资源的权限可参考项目级权限进行配置。

    描述

    可选。输入“这是一个灰度发布测试环境”。

  5. 单击“确定”,完成灰度发布测试环境的创建。

步骤2:编辑发布策略

  1. 在环境列表页面,单击刚创建的环境名称,进入“环境信息”页面。
  2. 单击“发布策略”页签,切换到“发布策略”页面。
  3. 单击“自定义策略”旁的,弹出“新建策略”对话框,选择系统提供的“灰度升级模板”。
  4. 单击“确定”,然后逐步完成插件配置。

    灰度起负载

    参数项

    说明

    部署方式

    选择“镜像创建”,将创建与线上配置完全一致的工作负载,仅更新镜像包版本(业务代码及配置)。

    命名空间

    选择待升级的服务所在的命名空间。

    服务

    待升级的服务,选择准备工作中已创建的服务。

    自定义灰度版本号

    打开开关。

    灰度版本号

    灰度版本号将作为新旧负载的引流标识,输入“${TIMESTAMP}”,引用系统时间戳环境变量作为灰度版本号。

    • 将基于所选Service关联的Deployment替换新镜像,创建新负载(灰度负载)。
    • 新负载内所有配置,如CPU、内存、副本数等,与旧负载(线上负载)完全一致。
    • 新负载不承接任何流量,可供开发人员进行测试,且对旧负载(线上负载)没有任何影响。
    • 新负载名称为“旧负载名称-灰度版本号”。

    灰度引流

    选择“Service蓝绿引流”,基于Service将所有流量切换至新负载,完成引流后,旧负载不承接任何流量。

    灰度下线

    默认删除线上的旧负载,无需配置。

    人工卡点

    为了降低引流过程中的风险,并给运维、测试人员预留充足的测试时间,可以在灰度引流、灰度下线等较高危操作前,添加人工卡点进行验证。

    参数项

    说明

    超时处理

    卡点超时后处理方式,选择“卡点失败,发布流终止执行”,即超时未处理则终止执行。

    卡点时长

    卡点处理时长,可选择最长时间12小时。

    卡点说明

    自定义描述,如:引流前对灰度负载执行手工验证。

  5. 单击“保存并应用”,即可将该策略设置为“使用中”策略,至此完成策略配置。

步骤3:运行流水线

  1. 单击顶部导航“首页”,返回软件开发生产线首页。
  2. 找到准备工作中已创建的项目,单击项目名称,进入项目。
  3. 单击左侧导航“持续交付 > 流水线”,进入项目下流水线列表页面。
  4. 搜索准备工作中已创建的流水线,单击“操作”列,选择“编辑”,进入“任务编排”页面。
  5. 在“阶段_1”单击默认任务,添加“云原生插件”并配置相关参数。

    参数项

    说明

    名称

    插件的名称,保持默认即可。

    环境级别

    任务发布的环境级别,选择“测试环境”。

    环境

    需要发布的环境,选择步骤1:新建环境中创建的环境“灰度发布demo”。

    产物地址

    部署时使用的镜像地址,可以使用“${变量名}”通过环境变量引用构建产物,也可以直接输入产物地址。这里直接填写镜像中心提供的开源nginx镜像“nginx:latest”。

  6. 配置完成后,单击“保存并执行”,开始执行流水线。
  7. 单击运行中的“云原生发布”任务,切换至“任务结果”页签,可以查看当前发布策略执行过程。

  8. 单击右上角“查看详情”,可以跳转到发布策略执行详情。

    如下图所示,“灰度起负载”步骤执行成功,可以看到新旧负载的名称、状态、副本数量、集群事件等信息。此时新负载(灰度负载)已启动成功,但线上用户不感知,对线上服务无任何影响,可以在人工卡点的时限内,无风险地对灰度负载进行测试。

  9. 执行“灰度引流”前,进入“人工卡点”确认阶段。

    • 若灰度验证发现问题,可单击“驳回”中断发布,并按实际情况决定是否需要回滚,恢复至发布前状态。
    • 若验证无问题,可单击“批准”,执行下一步灰度引流。

  10. 灰度引流完成后,所有流量都将被转发至新负载,旧负载不承接任何流量,进入旧负载下线前卡点确认阶段。

    • 若验证发现问题,可单击“驳回”中断发布并单击“回滚”,快速将流量切换至旧负载,恢复服务状态。
    • 若线上新负载验证无误,可单击“批准”,继续执行“灰度下线”阶段,删除旧负载。

  11. 执行完成后,旧负载的副本数量变为0,新负载正常对外提供服务。

    在发布完成后的任何时间发现线上服务出现问题,可以随时单击右上角“回滚”,恢复至此次发布之前的状态。

    至此,基于K8S原生Service的灰度蓝绿发布相关操作执行完成。

分享:

    相关文档

    相关产品