
# 基于Kubernetes原生Service的场景完成微服务蓝绿发布
#### 方案概述
**应用场景**
在进行服务发布的时候，通常会碰到这样的问题：
- 直接在生产环境发布后再进行测试，可能会带来较大风险，对线上用户造成影响。
- 测试环境虽然和生产环境高度一致，然而实际情况下，由于资源配置、网络环境等，测试环境和生产环境之间总会存在差异，因此难以在测试环境覆盖验证所有场景。
通过灰度发布可以实现在不引发风险的同时，在生产环境进行发布及验证。
**方案优势**
灰度发布是在生产环境中创建与当前线上服务完全一致的工作负载（灰度负载），仅对其中的包版本（业务代码和配置）进行更新，但是新创建的工作负载不承接任何现网流量，对线上用户没有任何影响，就可以在没有风险的情况下，在生产环境进行测试了。在灰度环境验证无问题之后，就可以逐渐将线上用户的真实访问引流到灰度负载，直至完全引流后，新创建的灰度负载承接所有现网流量，原先的线上负载不承接任何流量，此时就可以安全地删除旧负载，保留新负载，完成一次发布。
按照引流方式的不同，当前常用的灰度发布方式包括：快速完成100%流量切换的蓝绿发布和按流量比例或线上请求内容引流的金丝雀发布。通常情况，蓝绿发布已经足以降低发布风险，蓝绿发布有如下优势：
- 不需要集群安装额外的插件。
- 无风险的进行生产环境灰度验证。
- 快速进行流量切换（从旧负载切换新负载，或从新负载切回旧负载）。
- 在验证阶段发现问题后，可以快速将线上服务恢复（回滚）至发布前的状态。
 
#### 约束与限制
在发布完成后的任何时间发现线上服务出现问题，可以随时单击右上角"回滚"，恢复至此次发布之前的状态。
#### 操作流程
本文介绍在不需要占用集群额外资源安装插件的情况下，基于Kubernetes原生Service的场景完成微服务蓝绿发布，基本操作流程如下：
表1操作流程说明 
| **流程**                                                         | **说明**                       |
|:---|:---|
| [新建发布管理环境]        | 新建一个用于蓝绿发布的测试环境，并配置好资源集群等信息。 |
| [配置发布管理策略]     | 为发布环境配置发布策略，编排配置发布流程及插件。     |
| [通过云原生发布插件进行发布] | 通过流水线云原生发布插件，发布环境。           |
   
 #### 准备工作
- 已[开通并授权使用CodeArts Pipeline](https://support.huaweicloud.com/usermanual-pipeline/pipeline_01_0033.html)。
- [新建项目](https://support.huaweicloud.com/qs-projectman/projectman_06_1000.html)（选择"Scrum"模板，命名为"Project_Test"）。
- [新建空仓库空模板流水线](https://support.huaweicloud.com/usermanual-pipeline/pipeline_01_0015.html)（命名为"Pipeline-Test"）。
- 具有创建部署应用的权限，可参考部署服务[编辑权限管理](https://support.huaweicloud.com/usermanual-deployman/deployman_hlp_0035.html)添加权限。
- 开通购买CCE服务，并在CCE集群中创建服务相关Service和Deployment：[创建Service和Deployment](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)。
  - Service和Deployment资源相关参考：[服务（Service）](https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/)、[Deployments](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/)。
  
  - Service需要配置为关联至Deployment而非Pod，并且有且仅有一个Deployment与之关联。
   
 
- 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
  ```
  
![](https://support.huaweicloud.com/bestpractice-pipeline/public_sys-resources/note_3.0-zh-cn.png)
通常默认创建的资源即可满足要求，若有问题，请检查Deployment的spec.selector.matchLabels配置（如上示例加粗部分）和Service的spec.selector配置（如上示例加粗部分），确保标签值一致。
 #### 步骤1：新建发布管理环境
1. [登录华为云码道](https://support.huaweicloud.com/usermanual-devcloud/devcloud_01_0000.html)。
2. 搜索[准备工作]中已创建的项目，单击项目名称，进入项目。
3. 在左侧导航栏选择"持续交付 \> 发布管理"，进入环境列表页面。
4. 单击"新建环境"，弹出"新建环境"对话框，配置以下信息。 
   表2新建环境 
   | 参数项  | 说明                                                                   |
   |:---|:---|
   | 环境名称 | 项目下环境唯一标识，创建后不可修改，输入"灰度发布demo"。                                      |
   | 资源类型 | 承载服务的资源类型，选择"CCE"。                                                   |
   | 发布用户 | 选择"当前用户"。                                                            |
   | 区域   | 选择[准备工作]中已购买的集群所在的区域。 |
   | 集群   | 选择[准备工作]中已购买的集群。      |
   | 环境级别 | 环境类型，选择"测试环境"。                                                       |
   | 描述   | 可选。输入"这是一个灰度发布测试环境"。                                                 |
      
   
   
5. 单击"确定"，完成灰度发布测试环境的创建。
 
 #### 步骤2：配置发布管理策略
1. 在环境列表页面，单击刚创建的环境名称，进入"环境信息"页面。
2. 单击"发布策略"页签，切换到"发布策略"页面。
3. 单击"自定义策略"旁的![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001944543553.png)，弹出"新建策略"对话框，选择系统提供的"灰度升级模板"。
4. 单击"确定"，然后逐步完成插件配置。 
   图1配置发布策略   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001911415698.png "点击放大")
   1. **灰度起负载**
      表3灰度起负载参数说明 
      | 参数项      | 说明                                                                       |
      |:---|:---|
      | 部署方式     | 选择"镜像创建"，将创建与线上配置完全一致的工作负载，仅更新镜像包版本（业务代码及配置）。                            |
      | 命名空间     | 选择待升级的服务所在的命名空间。                                                         |
      | 服务       | 待升级的服务，选择[准备工作]中已创建的服务。   |
      | 自定义灰度版本号 | 开关关闭，系统将自动随机生成灰度版本号；开关开启，用户可以按需配置灰度版本号。这里选择开启开关。                         |
      | 灰度版本号    | 灰度版本号将作为新旧负载的引流标识，输入"${TIMESTAMP}"，引用系统时间戳环境变量作为灰度版本号，例如：20230401095436。 |
         
      - 基于所选Service关联的Deployment替换新镜像，创建新负载（灰度负载）。
      
      - 新负载内所有配置，如CPU、内存、副本数等，与旧负载（线上负载）完全一致。
      
      - 新负载不承接任何流量，可供开发人员进行测试，且对旧负载（线上负载）没有任何影响。
      
      - 新负载名称为"旧负载名称-灰度版本号"。
       
   
   2. **灰度引流**
      选择"Service蓝绿引流"，基于Service将所有流量切换至新负载，完成引流后，旧负载不承接任何流量。
      
   
   3. **灰度下线**
      默认删除线上的旧负载，无需配置。
      
   
   4. **人工卡点**
      为了降低引流过程中的风险，并给运维、测试人员预留充足的测试时间，可以在灰度引流、灰度下线等较高危操作前，添加人工卡点进行验证。
      图2配置人工卡点   
      ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001944771945.png "点击放大")
      表4人工卡点参数说明 
      | 参数项  | 说明                                      |
      |:---|:---|
      | 超时处理 | 卡点超时后处理方式，选择"卡点失败，发布流终止执行"，即超时未处理则终止执行。 |
      | 卡点时长 | 卡点处理时长，可选择最长时间1分钟至12小时。                 |
      | 卡点说明 | 自定义描述，如：引流前对灰度负载执行手工验证。                 |
         
      
   
   
   
   
5. 单击"保存并应用"，即可将该策略设置为"使用中"策略，至此完成策略配置。
 
 #### 步骤3：通过云原生发布插件进行发布
1. 单击顶部导航栏"首页"，返回华为云码道首页。 
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002279518512.png "点击放大")
   
   
   
2. 找到[准备工作]中已创建的项目，单击项目名称，进入项目。
3. 在左侧导航栏选择"持续交付 \> 流水线"，进入项目下流水线列表页面。
4. 搜索[准备工作]中已创建的流水线，单击"操作"列![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001944782153.png)，选择"编辑"，进入"任务编排"页面。
5. 在"阶段_1"单击默认任务，添加"云原生发布"插件并配置相关参数。 
   图3配置云原生发布插件   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001945628361.png "点击放大")
   表5云原生发布插件参数说明 
   | 参数项  | 说明                                                                                     |
   |:---|:---|
   | 名称   | 插件的名称，保持默认即可。                                                                          |
   | 环境级别 | 任务发布的环境级别，选择"测试环境"。                                                                    |
   | 环境   | 需要发布的环境，选择[步骤1：新建发布管理环境]中创建的环境"灰度发布demo"。 |
   | 产物地址 | 部署时使用的镜像地址，可以使用"${变量名}"通过环境变量引用构建产物，也可以直接输入产物地址。这里直接填写镜像中心提供的开源nginx镜像"nginx:latest"。  |
      
   
   
6. 配置完成后，单击"保存并执行"，开始执行流水线。
7. 单击运行中的"云原生发布"任务，切换至"任务结果"页签，可以查看当前发布策略执行过程。 
   图4查看执行过程   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001911649734.png "点击放大")
   
   
8. 单击右上角"查看详情"，可以跳转到发布策略执行详情。 
   如下图所示，"灰度起负载"步骤执行成功，可以看到新旧负载的名称、状态、副本数量、集群事件等信息。此时新负载（灰度负载）已启动成功，但线上用户不感知，对线上服务无任何影响，可以在人工卡点的时限内，无风险地对灰度负载进行测试。
   图5查看执行详情   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000002247230173.png "点击放大")
   
   
9. 进入"人工卡点"确认阶段，进行人工确认。 
   - 若灰度验证发现问题，可单击"驳回"中断发布，并按实际情况决定是否需要回滚，恢复至发布前状态。
   
   - 若验证无问题，可单击"批准"，执行下一步灰度引流。
   
   
   图6人工卡点确认   
   ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001947341229.png "点击放大")
   
   
10. 灰度引流完成后，所有流量都将被转发至新负载，旧负载不承接任何流量，进入旧负载下线前卡点确认阶段。 
    - 若验证发现问题，可单击"驳回"中断发布并单击"回滚"，快速将流量切换至旧负载，恢复服务状态。
    
    - 若线上新负载验证无误，可单击"批准"，继续执行"灰度下线"阶段，删除旧负载。
    
    
    
    
11. 查看执行结果，执行完成后，旧负载的副本数量变为0，新负载正常对外提供服务。 
    图7查看执行结果   
    ![](https://support.huaweicloud.com/bestpractice-pipeline/zh-cn_image_0000001947373193.png "点击放大")
    至此，基于Kubernetes原生Service的灰度蓝绿发布相关操作执行完成。
    
    
 
