
# 为ELB Ingress配置灰度发布
独享型ELB Ingress支持使用以下方式设置灰度发布：
- 支持按比例的方式发布灰度Ingress
- 支持按HTTP请求头的方式发布灰度Ingress
- 支持按Cookie发布的方式发布灰度Ingress
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
Ingress的灰度发布功能依赖ELB能力，使用该功能前请提交工单申请开通ELB灰度发布能力（需要ELB支持配置后端服务器组权重和基于Cookie的高级转发策略）。
#### 前提条件
- 已创建一个CCE Standard或CCE Turbo集群，且集群版本满足以下要求：
  - v1.23集群：v1.23.14-r0 及以上版本
  
  - v1.25集群：v1.25.9-r0 及以上版本
  
  - v1.27集群：v1.27.6-r0 及以上版本
  
  - v1.28集群：v1.28.4-r0 及以上版本
  
  - 其他更高版本的集群
   
 
#### 约束与限制
- 创建灰度Ingress后，不应删除原Ingress。
- 单个ELB下的监听器，如果关联的多个Ingress配置了多个灰度策略，按HTTP请求头的灰度策略优先级最高，按Cookie的灰度策略次之，按比例的灰度策略优先级最低。
- 该特性依赖ELB高级转发策略，开启后将不再根据域名/路径匹配确定优先级，请您根据实际需要[自定义转发策略优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_0939.html)。关于转发策略优先级详情请参见[ELB Ingress转发策略优先级说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。
- 同一监听器下配置多个灰度策略时，默认优先级依次为：HTTP请求头 \> Cookie \> 权重。 如果该监听器下的任意Ingress配置了"自定义转发策略优先级"，上述默认排序将失效。此时，您必须根据实际需要，手动调整灰度Ingress的"自定义转发策略优先级"。
  
 
#### 通过控制台配置灰度发布服务
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 部署原服务。 
   1. 在左侧导航栏中选择"工作负载"，单击右上角"创建工作负载"，部署名为origin-server的工作负载。配置参数说明请参见[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)。
   
   2. 在左侧导航栏中选择"服务"，切换至"服务"页签，单击右上角"创建服务"，创建名为origin-service的Service，并关联刚创建的origin-server工作负载（CCE Standard集群创建nodeport类型Service，Turbo集群创建ClusterIP类型Service）。
   
   3. 在左侧导航栏中选择"服务"，切换至"路由"页签，单击右上角"创建路由"，创建名为origin-ingress的Ingress，并关联刚创建的origin-service服务。参数配置说明请参见[通过控制台创建ELB Ingress](https://support.huaweicloud.com/usermanual-cce/cce_10_0251.html)。
   
   
   
   
3. 灰度发布新版本服务。 
   1. 在左侧导航栏中选择"服务"，切换至"路由"页签，选择需要设置灰度发布的路由，在操作列单击"更多\>创建灰度发布"。
   
   2. 设置灰度发布参数。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002040130798.png "点击放大")
      表1关键参数说明 
      | 参数       | 配置说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 示例                                                                                                                                                                                                                                                                                                                                                                                                                         |
      |:---|:---|:---|
      | 灰度发布     | - 按HTTP请求头：当HTTP请求的header键值对匹配时，访问灰度发布服务。 - 如果Ingress转发策略配置了域名和路径，最多支持配置8个Values值。  - 如果Ingress转发策略仅配置了路径，最多支持配置9个Values值。    - 按Cookie发布：当请求的Cookie键值对匹配时，访问灰度发布服务。  - 按比例发布：按访问灰度发布服务的请求比例。                                                                                                                                                      | 按HTTP请求头 - 键：a  - 值：b                                                                                                                                                                                                                  |
      | 灰度转发策略配置 | - 域名：实际访问的域名地址，不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案，一旦配置了域名规则后，必须使用域名访问。  - 开启灰度：开启灰度后，集群外部访问流量将按此规则转发至目标服务。  - 灰度规则：支持按HTTP请求头、按Cookie发布、按比例（灰度服务请求比例），请按需选择。  - 目标服务名称：请选择已有Service，页面列表中的查询结果已自动过滤不符合要求的Service。如果没有满足要求的Service请根据[Ingress支持的Service类型](https://support.huaweicloud.com/usermanual-cce/cce_10_0094.html#cce_10_0094__section1674954315446)新建。  - 目标服务访问端口：可选择目标Service的访问端口。   | - 域名：无需填写  - 开启灰度：开启  - 灰度规则：按HTTP请求头  - 目标服务名称：nginx  - 目标服务访问端口：80   |
         
      
   
   3. 单击"确定"，创建灰度发布服务。
   
   4. 查看灰度发布新版本服务是否成功。 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002076292089.png "点击放大")
      
      
   
   
   
   
4. 老版本服务下线。 
   新版本服务运行稳定后，需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service，使流量都路由到新版本服务上，然后删除灰度Ingress。
   
   
 
#### 通过kubectl命令行配置灰度发布服务
1. 部署原服务。 
   1. 部署名为origin-server的工作负载。
   
   2. 部署名为origin-service的service，关联刚创建的origin-server工作负载。（CCE Standard集群创建nodeport类型Service，Turbo集群创建ClusterIP类型Service）
   
   3. 部署名为origin-ingress的Ingress，关联刚创建的origin-service服务。
      Ingress的配置如下：
      ```
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: origin-ingress
        namespace: default
        annotations:
          kubernetes.io/elb.port: '81'
          kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
          kubernetes.io/elb.class: performance
      spec:
        rules:
          - host: example.com
            http:
              paths:
                - path: /
                  backend:
                    service:
                      name: origin-service
                      port:
                        number: 81
                  property:
                    ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                  pathType: ImplementationSpecific
        ingressClassName: cce
      ```
      
   
   
   
   
2. 灰度发布新版本服务。 
   部署新版本工作负载、服务和Ingress，使得流量能够通过权重或者头域导流到新版本服务上。
   1. 部署名为canary-server的工作负载。
   
   2. 部署名为canary-service的服务，关联刚创建的canary-server工作负载。（CCE Standard集群创建nodeport类型Service，Turbo集群创建ClusterIP类型Service）
   
   3. 创建灰度发布的Ingress。关于灰度发布的参数说明请参见[参数说明]。
      1. **场景一** ：按HTTP请求头，表示当HTTP请求的header键值对匹配时，访问灰度发布服务。
         部署名为canary-header-ingress的Ingress，关联刚创建的canary-service服务，实现Header灰度发布。
         Ingress的配置如下：
         ```
         apiVersion: networking.k8s.io/v1
         kind: Ingress
         metadata:
           name: canary-header-ingress
           namespace: default
           annotations:
             kubernetes.io/elb.ingress-order: '1'     # 设置转发策略优先级为1
             kubernetes.io/elb.canary: 'true'                        #设置为true，表示启用canary注解功能
             kubernetes.io/elb.canary-by-header: 'location'          # header的key值设置为location
             kubernetes.io/elb.canary-by-header-value: '{"values":["hz","sz","sh"]}'  #header的value值设置为hz、sz、sh
             kubernetes.io/elb.class: performance         #仅独享型ELB支持灰度发布
             kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
             kubernetes.io/elb.port: '81'
         spec:
           ingressClassName: cce
           rules:
             - host: example.com
               http:
                 paths:
                   - path: /
                     pathType: ImplementationSpecific
                     backend:
                       service:
                         name: canary-service
                         port:
                           number: 80
                     property:
                       ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
         ```
         
      
      2. **场景二** ：按比例，即设置访问灰度发布服务的请求比例。
         部署名为canary-weight-ingress的Ingress，关联刚创建的canary-service服务，实现权重灰度发布。
         Ingress的配置如下：
         ```
         apiVersion: networking.k8s.io/v1
         kind: Ingress
         metadata:
           name: canary-weight-ingress
           namespace: default
           annotations:
             kubernetes.io/elb.ingress-order: '1'     # 设置转发策略优先级为1
             kubernetes.io/elb.canary: 'true'             #设置为true，表示启用canary注解功能
             kubernetes.io/elb.canary-weight: '40'        #权重值设置，表示对应请求40%的流量将被导流到新版本服务上
             kubernetes.io/elb.class: performance         #仅独享型ELB支持灰度发布
             kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
             kubernetes.io/elb.port: '81'
         spec:
           ingressClassName: cce
           rules:
             - host: example.com
               http:
                 paths:
                   - path: /
                     pathType: ImplementationSpecific
                     backend:
                       service:
                         name: canary-service
                         port:
                           number: 81
                     property:
                       ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
         ```
         
      
      3. **场景三** ：按Cookie，表示当请求的Cookie键值对匹配时，访问灰度发布服务。
         部署名为canary-cookie-ingress的Ingress，关联刚创建的canary-service服务，实现按Cookie灰度发布。
         Ingress的配置如下：
         ```
         apiVersion: networking.k8s.io/v1
         kind: Ingress
         metadata:
           name: canary-cookie-ingress
           namespace: default
           annotations:
             kubernetes.io/elb.ingress-order: '1'     # 设置转发策略优先级为1
             kubernetes.io/elb.canary: 'true'                   #设置为true，表示启用canary注解功能
             kubernetes.io/elb.canary-by-cookie: 'location'     # header的key值设置为location
             kubernetes.io/elb.canary-by-cookie-value: '{"values":["hz","sz","sh"]}'  # header的value值设置为hz、sz、sh
             kubernetes.io/elb.class: performance                  #仅独享型ELB支持灰度发布
             kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
             kubernetes.io/elb.port: '81'
         spec:
           ingressClassName: cce
           rules:
             - host: example.com
               http:
                 paths:
                   - path: /
                     pathType: ImplementationSpecific
                     backend:
                       service:
                         name: canary-service
                         port:
                           number: 81
                     property:
                       ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
         ```
         
       
   
   4. 查看灰度发布新版本服务是否成功。
      1. 查看Ingress创建：
         ```
         kubectl get ingress
         ```
         回显如下：
         ```
         NAME                    CLASS   HOSTS        ADDRESS        PORTS   AGE
         canary-cookie-ingress   cce     example.com   88.88.88.165   80      16s
         canary-header-ingress   cce     example.com   88.88.88.165   80      46s
         canary-weight-ingress   cce     example.com   88.88.88.165   80      117s
         origin-ingress          cce     example.com   88.88.88.165   80      2m25s
         ```
         
      
      2. 服务请求返回结果：
         1. 使用location：hz请求头的请求访问服务：
            ```
            curl -H "Host: example.com" -H "location: hz" http://88.88.88.165:81/
            ```
            预期结果：
            ```
            new
            ```
            多次访问，返回结果均为new。
            
         
         2. 不使用请求头的请求访问服务：
            ```
            curl -H "Host: example.com" http://88.88.88.165:81/
            ```
            预期结果：返回值40%为new，60%为old。
            
          
       
   
   
   
   
3. 老版本服务下线。 
   新版本服务运行稳定后，需要下线老版本服务。下线流程将原服务Ingress中的Service修改为新版本服务的Service，使流量都路由到新版本服务上，然后删除灰度Ingress。
   1. 将原服务Ingress关联的Service更新为新版本Service。
      ```
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: origin-ingress
        namespace: default
        annotations:
          kubernetes.io/elb.port: '81'
          kubernetes.io/elb.id: e491f4e7-2351-4984-ad0a-8569e5e964a3
          kubernetes.io/elb.class: performance
      spec:
        rules:
          - host: example.com
            http:
              paths:
                - path: /
                  backend:
                    service:
                      name: canary-service
                      port:
                        number: 81
                  property:
                    ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                  pathType: ImplementationSpecific
        ingressClassName: cce
      ```
      
   
   2. 验证老版本服务是否下线完成。
      使用带header和不带header的请求，多次访问。
      ```
      curl -H "Host: example.com" -H "location: hz" http://88.88.88.165:81/
      curl -H "Host: example.com" http://88.88.88.165:81/
      ```
      预期结果：输出均为new，无old返回。
      
   
   3. 确认老版本服务下线完成后，删除灰度发布Ingress。
      ```
      kubectl delete ingress canary-cookie-ingress canary-weight-ingress canary-header-ingress
      ```
      
   
   
   
   
 
 #### 参数说明
表2灰度发布参数说明 
| 参数                                                                      | 是否必填 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| kubernetes.io/elb.canary                                                | 否    | string | 设置Ingress灰度发布的开关。设置为true后，配合不同的注解，可以实现不同的灰度发布功能。 取值范围：true - 独享型负载均衡器生效。  - 设置为true后，不允许删除或修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| kubernetes.io/elb.canary-weight                                         | 否    | string | 权重灰度发布权重值，设置后Ingress以权重灰度形式发布。 - 取值为0-100的整数，为灰度流量分配的百分比。  - 发布成权重灰度Ingress时，该参数必填。  - 不能与其他灰度发布功能同时设置。                                                                                                                                                                                                                                                                                                                                                                                                                 |
| kubernetes.io/elb.session-affinity-mode                                 | 否    | string | 开启权重灰度发布后，配置会话保持能力。 灰度发布仅支持设置为 "HTTP_COOKIE"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| kubernetes.io/ elb.session-affinity-option | 否    | string | 开启权重灰度发布会话保持能力后，会话保持的超时时间。 参数值为json字符串，格式如下： ``` {"persistence_timeout": "1440"} ``` 参数说明： - 超时时间范围为1-1440。  - 默认值为1440。                                                                                                                                                                                                                                                                                                                                                                                                   |
| kubernetes.io/elb.canary-by-header                                      | 否    | string | header灰度发布的Key值，表示请求头参数的名称。需要与kubernetes.io/elb.canary-by-header-value成对使用。 参数说明： 长度限制1-40字符，只允许包含字母、数字、中划线（-）和下划线（_）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| kubernetes.io/elb.canary-by-header-value                                | 否    | string | header灰度发布的Values值，需要与kubernetes.io/elb.canary-by-header成对使用。 参数值为json格式的数组，例如： ``` '{"values":["a","b"]}' ``` 参数说明： - Values数组长度：至少需要配置1个Values值。 - 如果Ingress转发策略配置了域名和路径，最多支持配置8个Values值。  - 如果Ingress转发策略仅配置了路径，最多支持配置9个Values值。    - Values数组取值：长度限制1-128字符，不支持空格，双引号，支持以下通配符：\*（匹配0个或更多字符）和？（正好匹配1个字符）。                                                   |
| kubernetes.io/elb.canary-by-cookie                                      | 否    | string | cookie灰度发布的key值，表示请求cookie参数的名称。需要与kubernetes.io/elb.canary-by-cookie-value成对使用。 参数说明： 长度限制1-100字符，支持包含字母、数字、以及 !%'"()\*+,./:=?@\^\\\\-_\`\~ 等字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| kubernetes.io/elb.canary-by-cookie-value                                | 否    | string | cookie灰度发布的values值，需要与kubernetes.io/elb.canary-by-cookie成对使用。 参数值为json格式的数组，例如： ``` '{"values":["a","b"]}' ``` 参数说明： - Values数组长度：至少需要配置1个Values值。 - 如果Ingress转发策略配置了域名和路径，最多支持配置8个Values值。  - 如果Ingress转发策略仅配置了路径，最多支持配置9个Values值。      - Values数组取值：长度限制1-100字符，不支持空格，支持包含字母、数字、以及 !%'"()\*+,./:=?@\^\\\\-_\`\~ 等字符。   |
| kubernetes.io/elb.canary-related-ingress-uid                            | 否    | string | 灰度发布Ingress关联的原始Ingress的uid信息，用于前端展示原始Ingress和灰度发布的Ingress的关联关系。 ● 参数格式：字符串 ● 取值：原始Ingress的metadata.uid字段                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   
