
# 为ELB Ingress配置高级转发策略
在CCE集群中创建ELB Ingress后，系统会自动在ELB上创建对应的监听器并配置转发策略，Ingress默认根据域名、路径匹配客户端请求，然后通过监听器转发至对应的后端服务器（节点或Pod）进行处理。在创建ELB Ingress时，您可以配置多样化的转发规则和转发动作，满足自定义的业务需求、灵活分配流量。
图1高级转发策略示意图   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002516364119.png "点击放大")
高级转发策略的实现分为以下四个步骤：
1. 客户端访问ELB Ingress，发送请求至ELB。
2. ELB首先根据高级转发策略中的转发规则匹配访问请求，匹配成功后继续执行转发动作。
3. ELB再根据已设置的转发动作，将客户端请求转发至对应的后端服务器进行处理。
4. 最后返回响应至客户端。
高级转发策略支持的转发规则与转发动作请参见[高级转发规则索引]和[高级转发动作索引]。
#### 前提条件
- 已创建一个集群版本满足要求的CCE Standard或CCE Turbo集群。
- 您需要使用kubectl连接到集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
- 集群中需提前部署可用的工作负载用于对外提供访问。若您无可用工作负载，可参见[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)、[创建有状态负载（StatefulSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0048.html)或[创建守护进程集（DaemonSet）](https://support.huaweicloud.com/usermanual-cce/cce_10_0216.html)部署工作负载。
- 为提供对外访问的工作负载配置Service，ELB Ingress支持的Service类型请参见[ELB Ingress支持的Service类型](https://support.huaweicloud.com/usermanual-cce/cce_10_0094.html#cce_10_0094__section3565202819276)。
 
#### 约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 该特性依赖ELB高级转发策略，开启后将不再根据域名/路径匹配确定优先级，请您根据实际需要[自定义转发策略优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_0939.html)。关于转发策略优先级详情请参见[ELB Ingress转发策略优先级说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。

- 配置转发规则和转发动作的注解字段时，不同的设置会导致不同的行为，最终的处理结果也会存在差异。具体如下表：
  
  | 转发规则和转发动作注解的设置情况                                    | 行为结果                                                                                                                                                                                                                                                                                                                              |
  |:---|:---|
  | **未配置**转发规则和转发动作的注解                                 | CCE不对ELB侧已有的高级转发规则/动作进行任何处理，这样做的原因是为了防止已经在ELB侧配置的高级转发规则/动作被误删。                                                                                                                                                                                                                                                                    |
  | 配置转发规则和转发动作的注解，且参数值**为空（参数值为"\[\]"）**               | - 转发规则（conditions）配置为空时表示删除所有CCE已支持的高级转发规则  - 转发动作（actions）配置为空时表示删除所有CCE已支持的高级转发动作                                                                                   |
  | 配置转发规则和转发动作的注解，且参数值**不为空（参数值不为"\[\]"）**             | 对于CCE注解中支持配置的高级转发规则/动作，ELB侧会根据注解中的配置生成高级转发规则/动作。例如，如果在ELB已存在部分高级转发规则/动作，但对应的CCE注解中未配置，则ELB会以注解配置为准，同步删除这些未在注解中定义的规则/动作。CCE注解中不支持配置的高级转发规则/动作不受影响，不会被删除或修改。                                                                                                                                                                        |
  | 配置转发规则和转发动作的注解，但存在部分目标Service**未匹配**注解中指定的Service名称 | 注解中对应的高级转发规则或者高级转发动作仅对已匹配的Service生效。 对于未匹配的Service来说，该场景和未配置注解的场景结果一致，即CCE不对该Service原有的高级转发策略进行任何处理。例如已经为ServiceA配置了高级转发策略，更新为ServiceB后丢失了匹配关系，ELB侧仍然使用ServiceA的高级转发策略。关于该场景的更多说明，请参见[常见问题]。 **建议在更新目标Service时，同步为其配置相应的高级转发策略注解**。 |
     
  
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
ELB Ingress配置重写、写入/删除Header、限速功能依赖ELB[高级转发策略能力](https://support.huaweicloud.com/usermanual-elb/elb_ug_jt_060301.html)，当前陆续上线中，已发布区域请以实际开放为准。如果您有使用需求，请提交[工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)申请开通ELB相关能力。
 #### 高级转发规则索引
ELB Ingress支持在"kubernetes.io/elb.conditions.\<svc-name\>"注解中配置转发规则，根据不同的规则匹配满足条件的访问请求，然后进行流量转发。
如果在一个注解中为同一个Service配置不同的转发规则，不同的规则是"与"关系，但同一个规则块中的值是"或"关系。假设你配置了 Method和QueryString 两种转发规则，需要同时满足Method和QueryString的条件，才能实现目标流量分发；如果Method值为GET和 POST，则只需要满足Method为GET或POST，且QueryString满足条件即可。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
最多支持添加10个高级转发条件（包括域名和路径），同一转发规则类型的每个value值都算作一个转发条件。
例如，某个Ingress配置了域名和路径，则最多支持再添加8个高级转发条件；如果再配置根据HTTP请求方法转发，如GET、POST，则继续占用2个转发条件。
表1ELB高级转发规则 
| 转发规则     | 说明                                                                                                                                                                                                                                                                                                                 | 操作指导                                                                                   | 集群版本要求                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|:---|
| HTTP请求方法 | 根据HTTP请求的类型（如GET、POST等）进行匹配，匹配成功后再执行转发动作。 注解示例如下： ``` kubernetes.io/elb.conditions.<svc-name>: | [{ "type": "Method", "methodConfig": { "values": [ "GET", "POST" ] } }] ```                                                                          | 关于高级转发规则的具体配置示例及参数说明，请参见[场景一：为ELB Ingress配置高级转发规则] | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群   |
| HTTP请求头  | 根据HTTP请求头中的特定信息（如User-Agent、Content-Type等）进行匹配，匹配成功后再执行转发动作。 注解示例如下： ``` kubernetes.io/elb.conditions.<svc-name>: | [{ "type": "Header", "headerConfig": { "key": "gray-hello", "values": [ "value1", "value2" ] } }] ```                               | 关于高级转发规则的具体配置示例及参数说明，请参见[场景一：为ELB Ingress配置高级转发规则] | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群   |
| Cookie   | 根据Cookie中的指定键值进行匹配，匹配成功后再执行转发动作。 注解示例如下： ``` kubernetes.io/elb.conditions.<svc-name>: | [{ "type": "Cookie", "cookieConfig": { "values": [ { "key": "cookiekey1", "value": "cookievalue1" }, { "key": "cookiekey2", "value": "cookievalue2" } ] } }] ``` | 关于高级转发规则的具体配置示例及参数说明，请参见[场景一：为ELB Ingress配置高级转发规则] | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群   |
| 查询字符串    | 根据URL中查询字符串的特定参数和值进行匹配，匹配成功后再执行转发动作。 注解示例如下： ``` kubernetes.io/elb.conditions.<svc-name>: | [{ "type": "QueryString", "queryStringConfig": { "key": "querykey", "values": [ "queryvalue" ] } }] ```                                                    | 关于高级转发规则的具体配置示例及参数说明，请参见[场景一：为ELB Ingress配置高级转发规则] | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群   |
| 网段       | 根据请求来源的IP地址所属的网段进行匹配，匹配成功后再执行转发动作。 注解示例如下： ``` kubernetes.io/elb.conditions.<svc-name>: | [{ "type": "SourceIp", "sourceIpConfig": { "values": [ "192.168.0.0/16", "172.16.0.0/16" ] } }] ```                                                            | 关于高级转发规则的具体配置示例及参数说明，请参见[场景一：为ELB Ingress配置高级转发规则] | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群   |
   
 #### 高级转发动作索引
ELB Ingress支持在注解中配置多种转发动作，您可以使用这些转发动作灵活地管理访问请求以满足业务需求。
- 转发至后端服务器组（ELB Ingress默认转发动作）：支持重写、跨域访问、写入/删除Header、限速等额外转发动作，ELB将首先执行额外的转发动作，然后再将请求转发至对应的后端服务器组。额外转发动作中，限速的优先级最高。
- 重定向至监听器：支持HTTP协议重定向至HTTPS协议。
- 返回固定响应：支持配置限速等额外转发动作。
- 转发至自定义后端服务器组：不可与灰度发布、返回固定响应、重定向到URL同时使用。
 表2ELB高级转发动作 
| 转发动作                         | 额外转发动作      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 操作指导                                                                                                          | 集群版本要求                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|:---|:---|
| 转发至后端服务器组（ELB Ingress默认转发动作） | 重写          | 该转发动作可以重写请求的路径信息。 注解示例如下： ``` kubernetes.io/elb.rewrite-target: /rewritepath ```                                                                                                                                                                                                                                                                                                                                   | 具体配置示例及参数说明，请参见[为ELB Ingress配置Rewrite重写](https://support.huaweicloud.com/usermanual-cce/cce_10_0770.html)     | - v1.23集群：v1.23.14-r0及以上  - v1.25集群：v1.25.9-r0及以上  - v1.27集群：v1.27.6-r0及以上  - v1.28集群：v1.28.4-r0及以上  - 其他更高版本的集群                                                                                                                                                                                                                                             |
| 转发至后端服务器组（ELB Ingress默认转发动作） | 跨域访问        | 该转发动作可以支持资源的跨域访问。 注解示例如下： ``` kubernetes.io/elb.cors-allow-origin: 'http://example.com'  # 允许访问的域 kubernetes.io/elb.cors-allow-headers: 'fake-header-1' # 允许的请求头 kubernetes.io/elb.cors-expose-headers: 'fake-header-2' # 需要公开的响应头 kubernetes.io/elb.cors-allow-methods: 'GET,POST' # 允许的HTTP请求方法 kubernetes.io/elb.cors-allow-credentials: 'true' # 允许发送凭据 kubernetes.io/elb.cors-max-age: '3600' # 预检请求的缓存时长 ``` | 具体配置示例及参数说明，请参见[为ELB Ingress配置跨域访问](https://support.huaweicloud.com/usermanual-cce/cce_10_0931.html)          | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群                                                                                              |
| 转发至后端服务器组（ELB Ingress默认转发动作） | 写入/删除Header | 该转发动作可以在请求中写入或删除配置的Header后再访问后端服务器。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "InsertHeader", "InsertHeaderConfig": { "key": "insertkey", "value_type": "USER_DEFINED", "value": "insertvalue" } }, { "type": "RemoveHeader", "RemoveHeaderConfig": { "key": "removekey" } } }] ```                                                                                                           | 具体配置示例及参数说明，请参见[示例一：为ELB Ingress配置写入/删除Header]                             | - v1.23集群：v1.23.18-r10及以上  - v1.25集群：v1.25.16-r0及以上  - v1.27集群：v1.27.16-r0及以上  - v1.28集群：v1.28.13-r0及以上  - v1.29集群：v1.29.8-r0及以上  - v1.30集群：v1.30.4-r0及以上  - 其他更高版本的集群                                                                                              |
| 转发至后端服务器组（ELB Ingress默认转发动作） | 限速          | 该转发动作支持对请求设置限速。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "TrafficLimit", "trafficLimitConfig": { "QPS": 4, "perSourceIpQps": 2, "burst": 2 } }] ```                                                                                                                                                                                                                                            | 具体配置示例及参数说明，请参见[示例三：为ELB Ingress配置限速]                                     | - v1.27集群：v1.27.16-r10及以上  - v1.28集群：v1.28.15-r0及以上  - v1.29集群：v1.29.10-r0及以上  - v1.30集群：v1.30.6-r0及以上  - 其他更高版本的集群                                                                                                                                                                                                                                                                     |
| 重定向至监听器（HTTP重定向至HTTPS）       | 无可额外添加的转发动作 | 该转发动作可以将HTTP协议的访问请求转发至HTTPS协议的监听器上。 注解示例如下： ``` kubernetes.io/elb.ssl-redirect: 'true' kubernetes.io/elb.listen-ports: '[{"HTTP":80},{"HTTPS":443}]' # HTTP转发至HTTPS端口 ```                                                                                                                                                                                                                                            | 具体配置示例及参数说明，请参见[为ELB Ingress配置HTTP重定向到HTTPS](https://support.huaweicloud.com/usermanual-cce/cce_10_0771.html) | - v1.23集群：v1.23.14-r0及以上  - v1.25集群：v1.25.9-r0及以上  - v1.27集群：v1.27.6-r0及以上  - v1.28集群：v1.28.4-r0及以上  - 其他更高版本的集群                                                                                                                                                                                                                                                                      |
| 重定向至URL                      | 无可额外添加的转发动作 | 该转发动作可以将特定的访问请求重定向至指定的URL，并返回3xx返回码。 注解示例如下： ``` kubernetes.io/elb.redirect-url: https://example.com/testa   # 重定向URL的信息 kubernetes.io/elb.redirect-url-code: '301' # 重定向URL后的返回码 ```                                                                                                                                                                                                                               | 具体配置示例及参数说明，请参见[为ELB Ingress配置URL重定向](https://support.huaweicloud.com/usermanual-cce/cce_10_0690.html)        | - v1.23集群：v1.23.14-r0及以上  - v1.25集群：v1.25.9-r0及以上  - v1.27集群：v1.27.6-r0及以上  - v1.28集群：v1.28.4-r0及以上  - 其他更高版本的集群                                                                                                                                                                                                                                                                      |
| 返回固定响应                       | 不额外添加转发动作   | 该转发动作可以直接返回固定响应，不向后端服务器继续转发。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "FixedResponse", "fixedResponseConfig": { "contentType": "text/plain", "statusCode": "503", "messageBody": "503 error text" } }] ```                                                                                                                                                                                    | 具体配置示例及参数说明，请参见[示例二：为ELB Ingress配置返回固定响应]                                 | - v1.25集群：v1.25.16-r10及以上  - v1.27集群：v1.27.16-r10及以上  - v1.28集群：v1.28.15-r0及以上  - v1.29集群：v1.29.10-r0及以上  - v1.30集群：v1.30.6-r0及以上  - 其他更高版本的集群                                                                                                                                                                                          |
| 返回固定响应                       | 限速          | 该转发动作支持对请求设置限速。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "FixedResponse", "fixedResponseConfig": { "contentType": "text/plain", "statusCode": "503", "messageBody": "503 error text" } }, { "type": "TrafficLimit", "trafficLimitConfig": { "QPS": 4, "perSourceIpQps": 2, "burst": 2 } }] ```                                                                                              | 具体配置示例及参数说明，请参见[示例三：为ELB Ingress配置限速]                                     | - v1.27集群：v1.27.16-r10及以上  - v1.28集群：v1.28.15-r0及以上  - v1.29集群：v1.29.10-r0及以上  - v1.30集群：v1.30.6-r0及以上  - 其他更高版本的集群                                                                                                                                                                                                                                                                             |
| 转发到自定义后端服务器组                              || 该转发动作支持将ELB Ingress请求同时转发至CCE集群内Pod（默认后端服务器组）及集群外ECS服务器组（自定义后端服务器组）。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "ForwardPool", "forwardConfig": [{ "serviceName": "test", "servicePort": 80, "weight": 90, "type": "service" },{ "poolID": "53d8516e-xxxx-xxxx-xxxx-b15ffd6b3cca", "weight": 70, "type": "pool" }] }] ```                                                                    | 具体配置示例及参数说明，请参见[示例四：为ELB Ingress配置自定义后端服务器组]                                 | - v1.25集群：v1.25.16-r20及以上  - v1.27集群：v1.27.16-r20及以上  - v1.28集群：v1.28.15-r10及以上  - v1.29集群：v1.29.10-r10及以上  - v1.30集群：v1.30.6-r10及以上  - v1.31集群：v1.31.4-r0及以上  - 其他更高版本的集群                                                                                   |
| 流量镜像至后端服务器组                               || 将转发至后端服务器组的流量请求镜像到选择的后端服务器组，适用于网络流量检查、审计分析以及问题定位等场景。 添加的其他可选转发动作也会对镜像到后端服务器组中的流量请求生效。 注解示例如下： ``` kubernetes.io/elb.actions.<svc-name>: | [{ "type": "TrafficMirror", "trafficMirrorConfig": { "mirrorRequestBodyEnable" : true, "targetIDs": ["fb1fbd39-xxxx-xxxx-xxxx-9da37704a4e7"] } }] ```                                                                                         | 具体配置示例及参数说明，请参见[示例五：为ELB Ingress配置流量镜像至后端服务器组]                            | - v1.28集群：v1.28.15-r70及以上  - v1.29集群：v1.29.15-r30及以上  - v1.30集群：v1.30.14-r30及以上  - v1.31集群：v1.31.10-r30及以上  - v1.32集群：v1.32.6-r30及以上  - v1.33集群：v1.33.5-r20及以上  - v1.34集群：v1.34.1-r0及以上  - 其他更高版本的集群   |
   
 #### 场景一：为ELB Ingress配置高级转发规则
ELB Ingress支持根据自定义的HTTP请求方法、HTTP请求头、Cookie、查询字符串和网段进行流量转发。以下示例中，当请求路径是**/hello1** ，且同时满足以下高级转发规则时才会将流量转发至**svc-hello1**服务：
- HTTP请求方法为**GET** 或**POST**
- HTTP请求头中包含键为**gray-hello** ，值为**value1** 或**value2**
- Cookie的键为**cookiekey1** ，值为**cookievalue1** 或键为**cookie** **key2** ，值为**cookievalue2**
- 查询字符串的键为**querykey** ，值为**queryvalue**
- 网段为**192.168.0.0/16** 或**172.16.0.0/16**
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1 
   kind: Ingress 
   metadata: 
     annotations: 
       kubernetes.io/elb.class: performance      # ELB类型 
       kubernetes.io/elb.id: ab53c3b2-xxxx-xxxx-xxxx-5ac3eb2887be   # ELB ID，请替换为实际值
       kubernetes.io/elb.port: '80'        # ELB 端口，请替换为实际值
       # 以下表示为svc-hello1服务时配置高级转发规则，该服务名称必须和backend字段下的服务名称一致
       kubernetes.io/elb.conditions.svc-hello1: |  
           [ 
             { 
               "type": "Method", 
               "methodConfig": { 
                 "values": [ 
                   "GET", 
                   "POST" 
                 ] 
               } 
             }, 
             { 
               "type": "Header", 
               "headerConfig": { 
                 "key": "gray-hello", 
                 "values": [ 
                   "value1", 
                   "value2" 
                 ] 
               } 
             }, 
             { 
               "type": "Cookie", 
               "cookieConfig": { 
                 "values": [ 
                   { 
                     "key": "cookiekey1", 
                     "value": "cookievalue1" 
                   }, 
                   { 
                     "key": "cookiekey2", 
                     "value": "cookievalue2" 
                   } 
                 ] 
               } 
             }, 
             { 
               "type": "QueryString", 
               "queryStringConfig": { 
                 "key": "querykey", 
                 "values": [ 
                   "queryvalue" 
                 ] 
               } 
             }, 
             { 
               "type": "SourceIp", 
               "sourceIpConfig": { 
                 "values": [ 
                   "192.168.0.0/16", 
                   "172.16.0.0/16" 
                 ] 
               } 
             } 
           ] 
     name: ingress-test 
   spec: 
     ingressClassName: cce 
     rules: 
      - http: 
         paths: 
         - path: /hello1 
           pathType: ImplementationSpecific 
           backend: 
             service: 
               name: svc-hello1 
               port: 
                 number: 80
   ```
   表3高级转发规则注解 
   | 参数                                         | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   |:---|:---|:---|
   | kubernetes.io/elb.conditions.*${svc_name}* | String | 配置高级转发规则，*${svc_name}*即对应的Service名称，其最大长度为48个字符。 如果该annotation值配置成*\[\]*则表示删除相应的高级转发规则。 注解值格式为Json字符串数组，具体格式请参见[表4]。 注意： 一条conditions中的数组中不同的规则是"与"关系，但同一个规则块中的值是"或"关系。例如，Method和QueryString两种转发规则都配置时，需要同时满足，才能实现目标流量分发。但如果Method值为GET，POST，即只需要满足Method为GET或POST，且QueryString满足条件即可。 |
      
    表4数组结构 
   | 参数                | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 示例                                                                                                                                                                                                                                                                   |
   |:---|:---|:---|
   | type              | 匹配类型，支持设置以下几种参数值： - Method：根据匹配的HTTP请求方法进行转发，需要与methodConfig字段搭配使用。Method仅可配置一次。  - Header：根据匹配的HTTP请求头进行转发，需要与headerConfig字段搭配使用。  - Cookie：根据匹配的Cookie进行转发，需要与cookieConfig字段搭配使用。  - QueryString：根据请求中匹配的字符串进行转发，需要与queryStringConfig字段搭配使用。  - SourceIp：根据匹配的请求网段进行转发，需要与sourceIpConfig字段搭配使用。SourceIp仅可配置一次。   | -                                                                                                                                                                                                                                                                    |
   | methodConfig      | 触发转发的HTTP请求方法，仅当type参数值为Method时使用。 可以并列设置多个请求方法，支持以下几种请求方法：GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | methodConfig无需设置key，仅设置values即可，values为数组。 ``` { "type": "Method", "methodConfig": { "values": [ "GET", "POST" ] } } ```                                                                                                   |
   | headerConfig      | 触发转发的HTTP请求头，仅当type参数值为Header时使用。 - 键（key）：只能由英文字母、数字、下划线和中划线组成。 HTTP请求头User-agent和Connection仅支持首字母大写的形式。   - 值（value）一个键下可以配置多个值。只能包含英文字母、数字和特殊字符!#$%\&'()\*+,.\\/:;\<=\>?@\[\]\^-_'{\|}\~。还支持\*和?两种通配符。                                                                                                                                                                                                                                                                                                            | 一个headerConfig结构体中仅能设置一个Key，如需设置多个Key，请配置多组HeaderConfig规则块。 ``` { "type": "Header", "headerConfig": { "key": "gray-hello", "values": [ "value1", "value2" ] } } ```                                                        |
   | cookieConfig      | 触发转发的Cookie，仅当type参数值为Cookie时使用。Cookie是键值对的形式，需要分别设置值： - 键（key）：键的长度为1\~100个字符，且首尾字符不能为空格。  - 值（value）：一个键下配置一个值，值的长度为1\~100个字符。   支持输入多个Cookie键值对，键值对支持英文字母、数字和特殊字符!%'"()\*+,./:=?@\^-_\`\~。                                                                                                                                                                                                                                                                                                                                                                                          | 设置cookieConfig时，values字段中支持设置多个key，value对数组，多个数组之间为或关系。 ``` { "type": "Cookie", "cookieConfig": { "values": [ { "key": "cookiekey1", "value": "cookievalue1" }, { "key": "cookiekey2", "value": "cookievalue2" } ] } } ``` |
   | queryStringConfig | 当请求中的字符串与设置好的转发规则中的字符串相匹配时，触发转发，仅当type参数值为QueryString时使用。 查询字符串是键值对的形式，需要分别设置值： - 键（key）：只能包含英文字母、数字和特殊字符!$'()\*+,./:;=?@\^-_'。  - 值（value）：一个键下可以配置多个值。只能包含英文字母、数字和特殊字符!$'()\*+,./:;=?@\^-_'。还支持\*和?两种通配符。                                                                                                                                                                                                                                                                                                                        | queryStringConfig仅能设置一个Key，如需设置多个Key，请配置多组QueryStringConfig规则块。 ``` { "type": "QueryString", "queryStringConfig": { "key": "querykey", "values": [ "queryvalue" ] } } ```                                                  |
   | sourceIpConfig    | 触发转发的请求网段，仅当type参数值为SourceIp时使用。 网段示例： 192.168.1.0/24或2001:db8::/64                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | sourceIpConfig无需设置key，仅设置values即可，values为数组。 ``` { "type": "SourceIp", "sourceIpConfig": { "values": [ "192.168.0.0/16", "172.16.0.0/16" ] } } ```                                                                          |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS     ADDRESS          PORTS   AGE
   ingress-test  cce      *         121.**.**.**     80      10s
   ```
   
   
 
#### 场景二：为ELB Ingress配置高级转发动作
以下示例将为您介绍如何为ELB Ingress配置写入/删除请求头、返回固定响应、限速、转发至自定义后端服务器组。
#### 示例一：为ELB Ingress配置写入/删除Header
您可以对请求中指定的Header进行修改或删除。以下示例中，当用户访问该Ingress时，会同时写入/删除部分Header：
- 写入用户自定义Header（**aa:aa** ）、系统定义的Header（**bb:ELB-ID** ）和用户引用的Header（**cc:cc**）
- 删除键为**dd** 和**ee**的Header
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.id: *****
       kubernetes.io/elb.port: "80"
       # 以下注解对名为test-service的Service生效，为其配置写入/删除Header的转发动作
       kubernetes.io/elb.actions.test-service: |
         [{
             "type": "InsertHeader",
             "InsertHeaderConfig": {
                 "key": "aa",
                 "value_type": "USER_DEFINED",
                 "value": "aa"
             }
         },
         {
             "type": "InsertHeader",
             "InsertHeaderConfig": {
                 "key": "bb",
                 "value_type": "SYSTEM_DEFINED",
                 "value": "ELB-ID"
             }
         },
         {
             "type": "InsertHeader",
             "InsertHeaderConfig": {
                 "key": "cc",
                 "value_type": "REFERENCE_HEADER",
                 "value": "cc"
             }
         },
         {
             "type": "RemoveHeader",
             "RemoveHeaderConfig": {
                 "key": "dd"
             }
         },
         {
             "type": "RemoveHeader",
             "RemoveHeaderConfig": {
                 "key": "ee"
             }
         }]      
     name: ingress-test
     namespace: default
   spec:
     ingressClassName: cce
     rules:
       - http:
           paths:
             - backend:
                 service:
                   name: test-service
                   port:
                     number: 80
               path: /
               pathType: ImplementationSpecific
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
   ```
   表5高级转发动作注解 
   | 参数                                      | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|
   | kubernetes.io/elb.actions.*${svc_name}* | String | 为Ingress配置高级转发动作，*${svc_name}*即对应的Service名称，其最大长度为51个字符。 如果该注解值配置成*\[\]*则表示删除所有高级转发动作。 配置写入/删除Header的注解值格式为JSON字符串数组，具体参数请参见[表6]，例如： ``` [{"type":"InsertHeader","InsertHeaderConfig":{"key":"aa","value_type":"USER_DEFINED","value":"aa"}}] ``` |
      
    表6重写Header参数配置说明 
   | 参数                 | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 示例                                                                                                                     |
   |:---|:---|:---|
   | type               | 表示重写Header的类型，支持设置以下几种参数值： - InsertHeader：表示写入Header，需要与InsertHeaderConfig字段搭配使用。  - RemoveHeader：表示删除Header，需要与RemoveHeaderConfig字段搭配使用。   说明： 高级转发动作注解中最多添加5条写入Header或删除Header配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | -                                                                                                                      |
   | InsertHeaderConfig | 表示写入Header，仅当type参数值为InsertHeader时使用。 - key：重写Header的Key值，长度限制1-40字符, 只能由英文字母、数字、下划线和中划线组成。不能是以下字符中的一种（不区分大小写）： connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority、x-forwarded-host、x-forwarded-for、x-forwarded-for-port、x-forwarded-tls-certificate-id、x-forwarded-tls-protocol、x-forwarded-tls-cipher、x-forwarded-elb-ip、x-forwarded-port、x-forwarded-elb-id、x-forwarded-elb-vip、x-real-ip、x-forwarded-proto、x-nuwa-trace-ne-in、x-nuwa-trace-ne-out   - value_type：写入Header的类型（删除Header时该字段配置无效）。仅支持以下字段： - USER_DEFINED：表示用户自定义的Header。  - REFERENCE_HEADER：表示用户引用的Header。  - SYSTEM_DEFINED：表示系统定义的Header。    - value：写入Header的value值（删除Header时该字段配置无效）。取值范围为1-128个字符，支持ASCII码值32\<=ch\<=127范围内可打印字符，\*和英文问号?。不能以空格开头或结尾。 value_type为SYSTEM_DEFINED时，value只可从CLIENT-PORT、CLIENT-IP、ELB-PROTOCOL、ELB-ID、ELB-PORT、ELB-EIP、ELB-VIP中取值。    | ``` { "type": "InsertHeader", "InsertHeaderConfig": { "key": "aa", "value_type": "USER_DEFINED", "value": "aa" } } ``` |
   | RemoveHeaderConfig | 表示删除Header，仅当type参数值为RemoveHeader时使用。 - key：删除Header的Key值，长度限制1-40字符, 只能由英文字母、数字、下划线和中划线组成。不能是以下字符中的一种（不区分大小写）： connection、upgrade、content-length、transfer-encoding、keep-alive、te、host、cookie、remoteip、authority、x-forwarded-host、x-forwarded-for、x-forwarded-for-port、x-forwarded-tls-certificate-id、x-forwarded-tls-protocol、x-forwarded-tls-cipher、x-forwarded-elb-ip、x-forwarded-port、x-forwarded-elb-id、x-forwarded-elb-vip、x-real-ip、x-forwarded-proto、x-nuwa-trace-ne-in、x-nuwa-trace-ne-out                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | ``` { "type": "RemoveHeader", "RemoveHeaderConfig": { "key": "ee" } } ```                                              |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS     ADDRESS          PORTS   AGE
   ingress-test  cce      *         121.**.**.**     80      10s
   ```
   
   
 
#### 示例二：为ELB Ingress配置返回固定响应
您可以为ELB Ingress配置固定的响应状态码及内容。以下示例中，当用户访问该Ingress时，会返回固定响应503状态码和**"503 error text"**的内容。
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.id: *****
       kubernetes.io/elb.port: "80"
       # 以下注解对名为test-service的Service生效，为其配置返回固定响应的转发动作
       kubernetes.io/elb.actions.test-service: |
        [{ 
          "type": "FixedResponse", 
          "fixedResponseConfig": { 
              "contentType": "text/plain", 
              "statusCode": "503",
              "messageBody": "503 error text"  
          } 
        }]
     name: ingress-test
     namespace: default
   spec:
     ingressClassName: cce
     rules:
       - http:
           paths:
             - backend:
                 service:
                   name: test-service
                   port:
                     number: 80
               path: /
               pathType: ImplementationSpecific
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
   ```
   表7高级转发动作注解 
   | 参数                                      | 类型     | 描述                                                                                                                                                                                                                         |
   |:---|:---|:---|
   | kubernetes.io/elb.actions.*${svc_name}* | String | 为Ingress配置高级转发动作，*${svc_name}*即对应的Service名称，其最大长度为51个字符。 如果该注解值配置成*\[\]*则表示删除所有高级转发动作。 配置返回固定响应的注解值格式为JSON字符串数组，具体参数请参见[表8]。 |
      
    表8返回固定响应参数配置说明 
   | 参数                  | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 示例                                                                                                                                                |
   |:---|:---|:---|
   | type                | 固定值为"FixedResponse"，表示返回固定响应。 说明： 高级转发动作注解中最多添加1条返回固定响应配置。                                                                                                                                                                                                                                                                                                                                                                          | -                                                                                                                                                 |
   | fixedResponseConfig | - contentType：返回内容格式，可以选择"text/plain"、"text/css"、"text/html"、"application/javascript"、"application/json"。  - statusCode：返回码，默认支持2XX、4XX、5XX系列状态码。  - messageBody：取值范围是0\~1024个字符。 须知： 同时[配置限速]时，该字段不允许为空值。    | ``` { "type": "FixedResponse", "fixedResponseConfig": { "contentType": "text/plain", "statusCode": "503", "messageBody": "503 error text" } } ``` |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS     ADDRESS          PORTS   AGE
   ingress-test  cce      *         121.**.**.**     80      10s
   ```
   
   
 
#### 示例三：为ELB Ingress配置限速
ELB Ingress支持配置访问限速。以下示例中，当用户访问该Ingress时，会对访问进行限速，每秒查询速率（QPS）为4，并设置每个客户端源IP的QPS为2，允许短时间超过限制的缓冲区大小为2。
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.id: *****
       kubernetes.io/elb.port: "80"
       # 以下注解对名为test-service的Service生效，为其配置访问限速
       kubernetes.io/elb.actions.test-service: |
        [{ 
          "type": "TrafficLimit", 
          "trafficLimitConfig": { 
              "QPS": 4,
              "perSourceIpQps": 2,
              "burst": 2
          } 
        }]
     name: ingress-test
     namespace: default
   spec:
     ingressClassName: cce
     rules:
       - http:
           paths:
             - backend:
                 service:
                   name: test-service
                   port:
                     number: 80
               path: /
               pathType: ImplementationSpecific
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
   ```
   表9高级转发动作注解 
   | 参数                                      | 类型     | 描述                                                                                                                                                                                                                       |
   |:---|:---|:---|
   | kubernetes.io/elb.actions.*${svc_name}* | String | 为Ingress配置高级转发动作，*${svc_name}*即对应的Service名称，其最大长度为51个字符。 如果该注解值配置成*\[\]*则表示删除所有高级转发动作。 配置限速的注解值格式为JSON字符串数组，具体参数请参见[表10]。 |
      
    表10限速参数配置说明 
   | 参数                 | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 示例                                                                                                            |
   |:---|:---|:---|
   | type               | 固定值为"TrafficLimit"，表示为ELB配置限速。 说明： 高级转发动作注解中最多添加1条限速配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | -                                                                                                             |
   | trafficLimitConfig | - QPS：总限速，每秒查询速率，支持的取值范围为0\~100000，0表示不限速。请求速率超过设置的限速后，新建连接请求将被丢弃，并会返回给客户端503状态码。  - perSourceIpQps：可选参数，基于客户端源IP进行限速，支持的取值范围为0\~100000，0表示不限速。 同时配置QPS（总限速）和perSourceIpQps（基于客户端源IP限速）时，基于客户端源IP限速值要小于总限速值。请求速率超过设置的限速后，新建连接请求将被丢弃，并会返回给客户端503状态码。   - burst：可选参数，限速缓冲区大小，支持的取值范围为0\~100000。限速burst允许短时间内超过设置的平均速率，以应对突发请求。例如，如果限速值是5，但是burst是10，那么1s内，可以访问超过5个请求，如果达到10个请求，又会回落到5。   注意： 配置trafficLimitConfig后，在CCE侧删除其中的字段不会在ELB生效，您可以通过指定参数值为0值来定义不限速，也可以通过删除整个trafficLimitConfig字段删除限速配置。 | ``` { "type": "TrafficLimit", "trafficLimitConfig": { "QPS": "4", "perSourceIpQps": "2", "burst": "2" } } ``` |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS     ADDRESS          PORTS   AGE
   ingress-test  cce      *         121.**.**.**     80      10s
   ```
   
   
 
#### 示例四：为ELB Ingress配置自定义后端服务器组
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
- ELB Ingress配置自定义后端服务器组的功能依赖ELB能力，使用该功能前请提交工单申请开通ELB相关能力。
- 配置自定义后端服务器组不可与灰度发布、返回固定响应、重定向到URL同时使用。
- ELB Ingress配置自定义后端服务器组时，定义Ingress后端Service时的number字段失效，且必须指定Service端口名为use-annotation，详情请参见以下示例。
- ELB Ingress配置自定义后端服务器组时，不可配置重复的Service名称和重复的后端服务器组ID。
- ELB Ingress配置自定义后端服务器组时，如果同时配置kubernetes.io/elb.slowstart或kubernetes.io/elb.pool-protocol注解，上述注解仅对CCE自动创建的默认后端服务器组生效，将不会对ELB侧的自定义后端服务器组生效。
 
您可以将Ingress的访问请求转发到多个自定义的后端服务器组，不同的后端服务器组间通过权重分配流量。以下示例中，当用户通过**example.com** 域名访问时，流量会被分配至两个后端服务器组：一部分流量分配至集群中名为**test** 的Service，权重为**90** ；另一部分流量分配至**ELB后端服务器组** ，权重为**70**。
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.id: *****
       kubernetes.io/elb.port: "80"
       # 以下注解为该Ingress同时配置一个Service和一个ELB后端服务器组，其中forward-demo为下文backend字段中的服务名称
       kubernetes.io/elb.actions.forward-demo: |
        [{ 
          "type": "ForwardPool", 
          "forwardConfig": [{ 
             "serviceName": "test",
             "servicePort": 80,
             "weight": 90,
             "type": "service"
             },{ 
             "poolID": "*****", 
             "weight": 70,
             "type": "pool"
          }]
        }] 
     name: ingress-test
     namespace: default
   spec:
     ingressClassName: cce
     rules:
       - host: example.com
         http:
           paths:
             - backend:
                 service:
                   name: forward-demo   # 配置自定义后端服务器组时，annotation中指定的Service名称需要与之对应，本示例中为forward-demo
                   port:
                     name: use-annotation   # 配置自定义后端服务器组时，原有的port.number字段失效，必须指定port.name参数且参数值固定为use-annotation
               path: /
               pathType: ImplementationSpecific
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
   ```
   表11高级转发动作注解 
   | 参数                                      | 类型     | 描述                                                                                                                                                                                                                           |
   |:---|:---|:---|
   | kubernetes.io/elb.actions.*${svc_name}* | String | 为Ingress配置高级转发动作，*${svc_name}*即对应的Service名称，其最大长度为51个字符。 如果该注解值配置成*\[\]*则表示删除所有高级转发动作。 配置自定义后端服务器组的注解值格式为JSON字符串数组，具体参数请参见[表12]。 |
      
    表12自定义后端服务器组参数配置说明 
   | 参数            | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 示例                                                                                                                                                                                                                     |
   |:---|:---|:---|
   | type          | 固定值为"ForwardPool"，表示为ELB配置自定义后端服务器组。 说明： 高级转发动作注解中最多添加1条自定义后端服务器组配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | -                                                                                                                                                                                                                      |
   | forwardConfig | 说明： forwardConfig中最多添加5条自定义后端服务器组配置。 - type：自定义转发的后端服务器组，可指定"service"和"pool"。 - service：转发的对象为Service类型，将由CCE自动创建Service对应的后端服务器组，并负责维护其生命周期。  - pool：转发的对象为自定义后端服务器组，您需要在ELB侧自行创建并维护。    - poolID：type指定为"pool"时填写。 后端服务器组的ID，需填写Ingress对应ELB下的后端服务器组，且不可重复配置相同的后端服务器组ID。 您可以前往[后端服务器组控制台](https://console.huaweicloud.com/vpc/#/elb/elbPool/list)，通过Ingress对应ELB的名称或ELB ID查询该ELB下的后端服务器组，并获取后端服务器组ID。   - serviceName：type指定为"service"时填写。 Service名称，您需要确认该Service在集群中真实存在，且不可重复配置相同的Service名称。   - servicePort：type指定为"service"时填写。 Service端口。   - weight：不同后端服务器组的流量分配权重，流量将根据权重的比值进行分配，权重取值范围为0-100。   | ``` { "type": "ForwardPool", "forwardConfig": [{ "serviceName": "test", "servicePort": 80, "weight": 90, "type": "service" },{ "poolID": "53d8516e-xxxx-xxxx-xxxx-b15ffd6b3cca", "weight": 70, "type": "pool" }] } ``` |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS         ADDRESS          PORTS   AGE
   ingress-test  cce      example.com   121.**.**.**     80      10s
   ```
   
   
 
#### 示例五：为ELB Ingress配置流量镜像至后端服务器组
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
- ELB Ingress配置流量镜像至后端服务器组的功能依赖ELB能力，使用该功能前请提交工单申请开通ELB相关能力。
- ELB Ingress配置流量镜像至后端服务器组时，不可配置重复的后端服务器组ID。
 
您可以将转发至后端服务器组的流量请求镜像到选择的后端服务器组，适用于网络流量检查、审计分析以及问题定位等场景。以下示例中，当用户通过example.com域名访问时，流量会被分配至两个后端服务器组：一个是集群中名为*traffic-mirror-demo* 的Service，另一个是ID为*fb1fbd39-xxxx-xxxx-xxxx-9da37704a4e7*的ELB后端服务器组，两者流量完全一致。
具体操作及参数配置说明如下：
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB创建Ingress的场景为例，YAML配置如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.id: *****
       kubernetes.io/elb.port: "80"
       # 以下注解对名为traffic-mirror-demo的Service生效，为其配置流量镜像至后端服务器组
       kubernetes.io/elb.actions.traffic-mirror-demo: |
        [{ 
          "type": "TrafficMirror",
          "trafficMirrorConfig": {
               "mirrorRequestBodyEnable" : true,
               "targetIDs": ["fb1fbd39-xxxx-xxxx-xxxx-9da37704a4e7"]
           }
        }] 
     name: ingress-test
     namespace: default
   spec:
     ingressClassName: cce
     rules:
       - host: example.com
         http:
           paths:
             - backend:
                 service:
                   name: traffic-mirror-demo   # 配置流量镜像至后端服务器组时，annotation中指定的Service名称需要与之对应，本示例中为traffic-mirror-demo
                   port:
                     number: 80
               path: /
               pathType: ImplementationSpecific
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
   ```
   表13高级转发动作注解 
   | 参数                                      | 类型     | 描述                                                                                                                                                                                                                             |
   |:---|:---|:---|
   | kubernetes.io/elb.actions.*${svc_name}* | String | 为Ingress配置高级转发动作，*${svc_name}*即对应的Service名称，其最大长度为51个字符。 如果该注解值配置成*\[\]*则表示删除所有高级转发动作。 配置流量镜像至后端服务器组的注解值格式为JSON字符串数组，具体参数请参见[表14]。 |
      
    表14流量镜像至后端服务器组参数配置说明 
   | 参数                  | 使用说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 示例                                                                                                                                                       |
   |:---|:---|:---|
   | type                | 固定值为"TrafficMirror"，表示为ELB配置流量镜像至后端服务器组。 说明： 高级转发动作注解中最多添加1条流量镜像至后端服务器组配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | -                                                                                                                                                        |
   | trafficMirrorConfig | - mirrorRequestBodyEnable：镜像请求是否携带请求体，默认为true。  - targetIDs：流量镜像的目的后端服务器组ID。目的后端服务器组需要满足以下条件才可使用： - 目的后端服务器组需要与集群使用同一个VPC。  - 监听器前端协议为HTTP协议时，后端服务器协议需要是HTTP。  - 监听器前端协议为HTTPS协议时，后端服务器协议可以是HTTP、HTTPS、GRPC。后端服务器协议为GRPC时，需要开启HTTP2，即添加注解*kubernetes.io/elb.http2-enable: 'true'* 。  - 共享型负载均衡器使用中的后端服务器组不能作为目的后端服务器组。  - 指定的后端服务器组的个数与ELB服务支持的特性能力有关，请以ELB侧为准。如果ELB侧不支持指定多个后端服务器组，则会返回相应的错误信息。     | ``` { "type": "TrafficMirror", "trafficMirrorConfig": { "mirrorRequestBodyEnable":  true, "targetIDs":  ["fb1fbd39-xxxx-xxxx-xxxx-9da37704a4e7"] } } ``` |
      
   
   
3. 创建Ingress。 
   ```
   kubectl create -f ingress-test.yaml
   ```
   回显类似如下，表示Ingress服务已创建。
   ```
   ingress.networking.k8s.io/ingress-test created
   ```
   
   
4. 查看已创建的Ingress。 
   ```
   kubectl get ingress
   ```
   回显如下，表示Ingress服务创建成功。
   ```
   NAME          CLASS    HOSTS         ADDRESS          PORTS   AGE
   ingress-test  cce      example.com   121.**.**.**     80      10s
   ```
   
   
 
#### 组合使用场景
高级转发规则与转发动作组合使用，可以满足各种多样化的需求，例如：
| 1.当访问Ingress时，满足以下转发规则                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 2.将执行以下转发动作                                                                                                                                                                                                                                                                                                                                                                       | 3.访问的目标Service（后端服务） |
|:---|:---|:---|
| - 域名为example.com  - 路径为/path1  - 且同时满足多种高级转发规则： - 请求方法为GET、POST  - 请求头为gray-hello:value1或gray-hello:value2  - 请求Cookie为cookiekey1:cookievalue1或cookiekey2:cookievalue2  - 请求Query字符串为querykey:queryvalue  - 请求源IP网段为：192.168.0.0/16或172.16.0.0/16     | 转发时执行以下动作： - 添加用户自定义的请求头aa:aa  - 删除键为dd的请求头                                                                                                                                           | test                 |
| - 域名为example.com  - 路径为/path2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 转发时执行以下动作： - 返回固定响应：返回状态码为503，内容为"503 error text"。  - 设置限速：总QPS（每秒查询速率）为67，基于客户端源IP的QPS为3                                                                                               | test2                |
| - 域名为example.com  - 路径为/path3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 转发时执行以下动作： - 同时转发到test和test2的Service，其中test权重为90，test2权重为10  - 设置限速：总QPS（每秒查询速率）为67，基于客户端源IP的QPS为3  - 添加用户自定义的请求头aa:aa   | test和test2           |
   
上述场景对应的示例如下：
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo
  namespace: default
  annotations:
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.id: *****
    kubernetes.io/elb.listener-master-ingress: default/ingress-demo
    kubernetes.io/elb.port: '80' 
    # 以下注解作用于名为test的Service，为其同时添加多种ELB转发匹配条件
    kubernetes.io/elb.conditions.test: |  
        [ 
          { 
            "type": "Method", 
            "methodConfig": { 
              "values": [ 
                "GET", 
                "POST" 
              ] 
            } 
          }, 
          { 
            "type": "Header", 
            "headerConfig": { 
              "key": "gray-hello", 
              "values": [ 
                "value1", 
                "value2" 
              ] 
            } 
          }, 
          { 
            "type": "Cookie", 
            "cookieConfig": { 
              "values": [ 
                { 
                  "key": "cookiekey1", 
                  "value": "cookievalue1" 
                }, 
                { 
                  "key": "cookiekey2", 
                  "value": "cookievalue2" 
                } 
              ] 
            } 
          }, 
          { 
            "type": "QueryString", 
            "queryStringConfig": { 
              "key": "querykey", 
              "values": [ 
                "queryvalue" 
              ] 
            } 
          }, 
          { 
            "type": "SourceIp", 
            "sourceIpConfig": { 
              "values": [ 
                "192.168.0.0/16", 
                "172.16.0.0/16" 
              ] 
            } 
          } 
        ]  
    # 以下注解作用于名为test的Service，配置写入和删除Header的转发动作
    kubernetes.io/elb.actions.test: |
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "aa",
              "value_type": "USER_DEFINED",
              "value": "aa"
          }
      },{
          "type": "RemoveHeader",
          "RemoveHeaderConfig": {
              "key": "dd"
          }
      }]   
    # 以下注解作用于名为test2的Service，返回固定响应并同时设置限速
    kubernetes.io/elb.actions.test2: |
        [{ 
          "type": "FixedResponse", 
          "fixedResponseConfig": { 
              "contentType": "text/plain", 
              "statusCode": "503",
              "messageBody": "503 error text"  
          }},{
         "type": "TrafficLimit",
         "TrafficLimItConfig": {
             "perSourceIpQps": 3,
             "qps": 67
                }}
         ]
    # 以下注解作用于名为test3的Service，将请求转发到自定义后端服务器组（test和test2），同时写入Header并配置限速
    kubernetes.io/elb.actions.test3: | 
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "aa",
              "value_type": "USER_DEFINED",
              "value": "aa"
          }
      },{
       "type": "ForwardPool",
       "forwardConfig": [{
            "serviceName": "test",
            "servicePort": 80,
            "weight": 90,
            "type": "service"
         },{
            "serviceName": "test2",
            "servicePort": 80,
            "weight": 10,
            "type": "service"
         }]
       },{
       "type": "TrafficLimit",
       "TrafficLimItConfig": {
           "perSourceIpQps": 3,
           "qps": 67
           }}
       ]
spec:
  ingressClassName: cce
  rules:
    - host: example.com
      http:
        paths:
          - path: /path1
            pathType: ImplementationSpecific
            backend:
              service:
                name: test
                port:
                  number: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
          - path: /path2
            pathType: ImplementationSpecific
            backend:
              service:
                name: test2
                port:
                  number: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
          - path: /path3
            pathType: ImplementationSpecific
            backend:
              service:
                name: test3
                port:
                  name: use-annotation  # 高级转发动作中指定了转发到自定义后端服务器组时（"type": "ForwardPool"），需要指定port.name=use-annotation
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
```
 #### 常见问题
如果您在使用过程中遇到了问题，以下内容可能可以帮助您解决。
#### 更新ELB中的目标Service后，ELB侧的高级转发策略仍然保留
这是因为在更新ELB中的目标Service时，未同步修改配置高级转发策略的注解，出现存在部分目标Service**未匹配**注解中指定的Service名称。对于未匹配的Service来说，该场景等效于未配置高级转发策略注解，即CCE不对该Service原有的高级转发策略进行任何处理。
例如在以下配置中，会生成两条转发策略并分别为其配置写入Header的转发动作。
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.id: *****
    kubernetes.io/elb.port: "80"
    # 以下注解对所有名为test-service的Service生效，为其配置写入Header的转发动作
    kubernetes.io/elb.actions.test-service: |
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "aa",
              "value_type": "USER_DEFINED",
              "value": "aa"
          }
      }]      
  name: ingress-test
  namespace: default
spec:
  ingressClassName: cce
  rules:
    - http:
        paths:
          - path: /aa
            backend:
              service:
                name: test-service
                port:
                  number: 8080
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: /bb
            backend:
              service:
                name: test-service
                port:
                  number: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
```
如果将其中某个路径下的后端服务修改成其他服务，比如，将/aa路径的后端服务修改为test-service-2，因为test-service-2没有匹配的高级转发策略注解，所以CCE不做任何处理，而/aa路径匹配的转发策略已配置test-service对应的写入Header的转发动作。
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.id: *****
    kubernetes.io/elb.port: "80"
    # 以下注解对所有名为test-service的Service生效，为其配置写入Header的转发动作
    kubernetes.io/elb.actions.test-service: |
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "aa",
              "value_type": "USER_DEFINED",
              "value": "aa"
          }
      }]      
  name: ingress-test
  namespace: default
spec:
  ingressClassName: cce
  rules:
    - http:
        paths:
          - path: /aa
            backend:
              service:
                name: test-service-2 # 没有匹配高级转发动作配置，CCE后端不做任何处理。转发策略会复用之前创建的配置
                port:
                  number: 8080
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: /bb
            backend:
              service:
                name: test-service
                port:
                  number: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
```
因此，**建议更新后端服务的时候，请为其配置相应的高级转发动作**，确保获得预期的结果。如下：
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/elb.class: performance
    kubernetes.io/elb.id: *****
    kubernetes.io/elb.port: "80"
    # 以下注解对名为test-service的Service生效，为其配置写入Header的转发动作
    kubernetes.io/elb.actions.test-service: |
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "aa",
              "value_type": "USER_DEFINED",
              "value": "aa"
          }
      }]
    # 以下注解对名为test-service-2的Service生效，为其配置期望的高级转发动作，配置为空时，则无高级转发动作
    kubernetes.io/elb.actions.test-service-2: "[]"
  name: ingress-test
  namespace: default
spec:
  ingressClassName: cce
  rules:
    - http:
        paths:
          - path: /aa
            backend:
              service:
                name: test-service-2
                port:
                  number: 8080
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: /bb
            backend:
              service:
                name: test-service
                port:
                  number: 8888
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
```
