
# 灰度服务配置
本章介绍通过IaC进行灰度服务配置的管理，包括灰度规则的管理及灰度阶段切换。对应的资源类型为WiseCloud::LoadBalancer::GrayConfig。
灰度比例转换为pod个数是通过向下取整法，例如：共6个pod，如果灰度比例配置为10%，灰度pod个数则为6 \* 0.1 = 0.6，向下取整 = 0，但是必须保持1个的副本数，所以仍要置为1；如果灰度比例配置为20%，灰度pod个数则为6 \* 0.2 = 1.2，向下取整 = 1。
#### 使用限制
- 如果灰度集群（bindSlb.grayStatus配置为2）想要使用多阶段灰度升级，要求bindSlb.grayStatus在灰度期间保持配置为2。
- 首次部署时不要配置grayStage，因为要进行灰度升级首先要保证有一个正常运行的版本作为生产，而如果首次部署是满足不了这个条件的，所以要至少正确部署过一次之后才能进行灰度升级。
- 配置了grayInstances即代表要进入多阶段灰度升级，且百分比只能配置为1%\~100%（字符串）；但是如果第一阶段就直接配置为100%，则仍然执行普通升级模式。
- 灰度升级期间（包括进入灰度时），IaC配置中不允许修改grayStage.grayStatus、min_instances、max_instances和SLB相关配置，其他配置可以修改。
- 灰度升级过程中，如果grayInstances的比例达到了100%，grayProcess为INGRAY时，再进行比例缩小时，该场景只允许修改灰度比例。
- 灰度升级过程中，如果发现灰度版本配置错误，可以修改IaC配置将灰度集群进行重新部署，但是这时不允许修改grayInstances，即IaC配置和灰度比例只能修改其中一个。
- 多阶段灰度升级中，业务将grayInstances配置为100%（未配置grayProcess字段）或grayInstances配置为100%、grayProcess为FINISHED并部署成功后，才算灰度结束了；中间一个阶段部署成功了不算结束灰度，只算这一阶段部署成功了，此时仍然算在灰度升级过程中。
- 灰度过程中，不允许业务再执行普通部署，不允许在管理台上修改配置，只能通过IaC部署修改。
- 多阶段灰度升级和滚动升级同时使用时，maxUnavailable值必须配为0。
 
#### 配置字段说明
灰度服务类型如[表1]所示，灰度服务配置字段说明请参见[表2]，各类型灰度路由引擎配置样例请参见[配置样例]，灰度升级配置demo请参见[灰度升级配置demo](https://support.huaweicloud.com/devg-appstage/appstage_06_0092.html)。
 表1灰度服务类型说明 
| 灰度路由引擎        | 对应ruleType   |
|:---|:---|
| SLB(\>1.3.11) | SLB          |
| 微服务           | MicroService |
| DMQ           | DMQ          |
| 分布式Job        | Job          |
| 函数            | Function     |
   
 表2灰度服务配置字段说明 
| 参数名               | 类型                                                         | 是否必选 | 说明                                                                                                         |
|:---|:---|:---|:---|
| ruleType          | String                                                     | 是    | 类型：SLB、MicroService、Job、DMQ、Function。                                                                      |
| currentStage      | int                                                        | 否    | 当前阶段，1=\<currentStage\<=sizeOf(Stages)，默认为1。                                                               |
| currentStatus     | String                                                     | 否    | 当前状态，取值为Processing、Pause、Complete，默认为Complete。                                                             |
| functionName      | String                                                     | 否    | ruleType为Function时必填，否则无效，长度\<=200。                                                                        |
| functionAliasName | String                                                     | 否    | ruleType为Function时必填，否则无效，长度\<=255。 functionAliasName别名不能重复，一个别名只能有一条记录。 |
| routeFlag         | String                                                     | 否    | 取值为Default/Special，默认为Default。                                                                             |
| Stages            | List\<[GrayStage]\> | 是    | 灰度阶段                                                                                                       |
   
 表3GrayStage 
| 参数名                   | 类型                                                             | 是否必选 | 说明                                                                     |
|:---|:---|:---|:---|
| stageIndex            | int                                                            | 否    | 阶段编号，最好按照顺序填写1 ， 2 ， 3 ， 4... ，缺省为0 ，后台会排序后，按顺序赋值为1.2.3.4....。         |
| greyRuleRelation      | String                                                         | 否    | 取值为or或and RouteType为SLB时必选，不为SLB时无效。 |
| rules                 | List\<[GrayRule]\>       | 否    | RouteType为SLB时必选，不为SLB时无效。                                             |
| groupRelation         | String                                                         | 否    | 取值为or或and RouteType不为SLB时必选，为SLB时无效。  |
| userExtendedParameter | String                                                         | 否    | RouteType为Job时有意义，非必选，不为job时无效，必须是json字符串格式。                           |
| groups                | List\<[GrayRuleGroup]\> | 否    | RouteType为非SLB时必选，为SLB时无效。                                             |
   
 表4GrayRule 
| 参数名      | 类型     | 是否必选 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|:---|
| param    | String | 是    | 参数名variable为percent时可以为空，否则不能为空，长度\<=50。 - Position为header 时， \[a-zA-Z0-9_\\-\]+  - Position不为header且RuleType不为Function时， \[.a-zA-Z0-9_\\-\]+  - Position不为header且RuleType为Function时， \[.a-zA-Z0-9_\\-\\\[\\\]\]+                                                                                                                                                                                                                             |
| variable | String | 是    | - RuleType为SLB时，传输类型："province"、"city"、"countryArea"、"custom"、"advance"、"path"、"CLIENT-IP"、"REAL-IP"  - RuleType非SLB时，传输类型： "province"、"city"、"countryArea"、"custom"、"percent"、"CLIENT-IP"、"REAL-IP"                                                                                                                                                                                                                                                                                                                                          |
| position | String | 否    | 位置 - RuleType非SLB时，不传  - variable为 "CLIENT-IP"、"REAL-IP" 时，为 "NA"  - variable为其他时，为"url"、"body-json"、"body-form"、"header"、"locale"、"resource"、"localeCountryArea"、"NA"、"path"、"percent"                                                                                                                                                                                                                                        |
| match    | String | 是    | 匹配方法 - RuleType为SLB时： "pattern"、"sha256"、"equal"、"rangeIP"、"locateIn"、"tailEqual"、"locateInCountryArea"、"NA"  - RuleType非SLB时： "pattern"、"sha256"、"equal"、"rangeIP"、"locateIn"、"tailEqual"、"locateInCountryArea"、"NA"、"gt"、"ge"、"lt"、"le"、"notEqual"、"percent"  - variable为 "CLIENT-IP"、"REAL-IP" 时，为 "sha256"、"rangeIP"  - variable为 " path " 时，为 "pattern"、"equal"   |
| values   | String | 是    | 匹配值列表，多个值逗号分隔 - match为 "tailEqual" 时，每个长度小于4  - match为 " rangeIP " 时，样例xx.xx.xx.x-xx.xx.xx.xx                                                                                                                                                                                                                                                                                                                                                                                                                 |
   
 表5GrayRuleGroup 
| 参数名                 | 类型                                                       | 是否必选 | 说明                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| groupIndex          | Int                                                      | 否    | 建议按照顺序填写0，1，2，3，4... 不写默认从0开始排序，按顺序赋值为0，1，2，3，4....。                                                                                                                                    |
| greyRuleRelation    | String                                                   | 是    | 取值为and或or                                                                                                                                                                                                                 |
| microServiceVersion | String                                                   | 否    | 微服务版本号，MicroServiceVersion和useInstanceProperty二选一。 Function类型可以两个都不选，DMQ类型只支持版本号。 如果配置组之间关系为与，各个配置组的版本号相同。 长度\<=50 |
| useInstanceProperty | String                                                   | 否    | 微服务自定义灰度参数，MicroServiceVersion和useInstanceProperty二选一。 Function类型可以两个都不选，DMQ类型只支持版本号。 长度\<=50                                                         |
| rules               | List\<[GrayRule]\> | 是    | 灰度规则列表                                                                                                                                                                                                                    |
   
 #### 配置样例
SLB类型样例：
```
- name: clf_iac3.0_example_gray_SLB            // name+type唯一定位到一个灰度服务资源
  type: 'WiseCloud::LoadBalancer::GrayConfig'  //资源类型为灰度服务配置
  properties:
    ruleType: SLB
    stages:
      - stageIndex: 1
        rules:
          - param: path
            values: '5555'
            match: equal
            variable: path
            position: path
        greyRuleRelation: or
```
微服务类型样例：
```
- name: clf_iac3.0_example_gray_MicroService
  type: 'WiseCloud::LoadBalancer::GrayConfig'
  properties:
    currentStatus: Processing
    ruleType: MicroService
    stages:
      - stageIndex: 1
        groupRelation: or
        groups:
          - microServiceVersion: latest
            rules:
              - param: aaa
                values: '111'
                match: equal
                variable: custom
            groupIndex: 1
            greyRuleRelation: or
```
DMQ类型样例：
```
- name: clf_iac3.0_example_gray_DMQ
  type: 'WiseCloud::LoadBalancer::GrayConfig'
  properties:
    ruleType: DMQ
    stages:
      - stageIndex: 1
        groupRelation: and
        groups:
          - microServiceVersion: gray_1
            rules:
              - param: aaa
                values: '2222'
                match: pattern
                variable: custom
              - param: bbb
                values: '1111'
                match: equal
                variable: custom
            groupIndex: 1
            greyRuleRelation: or
```
Job类型样例：
```
- name: clf_iac3.0_example_gray_Job
  type: 'WiseCloud::LoadBalancer::GrayConfig'
  properties:
    ruleType: Job
    stages:
      - stageIndex: 1
        groupRelation: or
        groups:
          - microServiceVersion: last
            rules:
              - param: ccc
                values: ccc
                match: equal
                variable: custom
                position: ''
            groupIndex: 1
            greyRuleRelation: or
      - stageIndex: 2
        groupRelation: or
        groups:
          - microServiceVersion: last
            rules:
              - param: ddd
                values: ddd
                match: tailEqual
                variable: custom
            groupIndex: 1
            greyRuleRelation: or
```
Function类型样例：
```
- name: clf_iac3.0_example_gray_Function
  type: 'WiseCloud::LoadBalancer::GrayConfig'
  properties:
    functionAliasName: >-
      wisefunction:222cn:iot:mcb1fbf087634f199f3a4251c5b8a91e:function:pyd:quanzhong2wisefunction:cn:iot:mcb1fbf087634f199f3a4251c5b8a91e:function:pyd:quanzhong2wisefunction:cn:iot:mcb1fbf087634f199f3a4251c5b8a91e:function:pyd:quanzhong2
    functionName: pyd
    ruleType: Function
    stages:
      - stageIndex: 1
        groupRelation: or
        groups:
          - rules:
              - param: appid
                values: '123456,22222'
                match: equal
                variable: custom
            groupIndex: 1
            greyRuleRelation: or
```
