# 为ELB Ingress配置转发规则优先级
Ingress使用同一个ELB监听器时，支持按照以下规则进行转发规则优先级排序：
- 同一个Ingress的转发规则排序：可使用"kubernetes.io/elb.rule-priority-enabled"注解，设置为"true"时，根据Ingress YAML里**paths** 字段下定义的转发规则顺序进行排序，配置靠前的优先级高；未配置该注解时，同一个Ingress的转发规则会遵循ELB侧的[排序规则](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。
- 不同Ingress的转发规则排序：可使用"kubernetes.io/elb.ingress-order"注解的优先级进行排序，且默认开启同一个Ingress的转发规则排序（即同时设置"kubernetes.io/elb.rule-priority-enabled"注解为"true"），具体规则如下。
  - "kubernetes.io/elb.ingress-order"注解的参数取值范围为1\~1000，参数值越小，表示优先级越高。
  
  - 具有"kubernetes.io/elb.ingress-order"注解的Ingress优先级较高，不具有该注解的Ingress优先级较低。
  
  - 如果多个Ingress都具有"kubernetes.io/elb.ingress-order"注解，则不同Ingress间先按注解值的大小排序，然后同一个Ingress的规则按照先后顺序排序。
   
未配置以上注解时，同一个ELB监听器下无论包含多个Ingress还是同一个Ingress的转发规则，都会使用ELB侧的[排序规则](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。
关于以上规则，您可以参考[转发规则优先级设置示例]了解更多场景化的示例。
图1自定义转发规则优先级   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002391617326.png "点击放大")
#### 前提条件
- 已创建一个CCE Standard或CCE Turbo集群，且集群版本满足以下要求：
  - v1.23集群：v1.23.15-r0及以上
  
  - v1.25集群：v1.25.10-r0及以上
  
  - v1.27集群：v1.27.7-r0及以上
  
  - v1.28集群：v1.28.5-r0及以上
  
  - v1.29集群：v1.29.1-r10及以上
  
  - 其他更高版本的集群
   
- 集群中需提前部署可用的工作负载用于对外提供访问。若您无可用工作负载，可参见[创建无状态负载（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)。
 
#### 通过kubectl命令行配置
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   ```
   vi ingress-test.yaml
   ```
   以使用已有ELB为例，配置示例如下：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: test
     namespace: default
     annotations:
       kubernetes.io/elb.port: '88'    # 对接的ELB端口
       kubernetes.io/elb.id: 2c623150-17bf-45f1-ae6f-384b036f547e    # 已有ELB的ID
       kubernetes.io/elb.class: performance    # ELB的类型，该功能仅支持performance
       kubernetes.io/elb.ingress-order: '1'    # 不同Ingress间的转发规则优先级
       kubernetes.io/elb.rule-priority-enabled: 'true'   # 同一个Ingress的转发规则按照paths字段下的转发规则顺序进行排序
   spec:
     rules:
       - host: ''
         http:
           paths:
             - path: /test1  # 定义转发规则
               backend:  # 该规则对应的后端Service，示例可进行替换
                 service:
                   name: test1
                   port:
                     number: 8081
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
             - path: /test2  # 定义转发规则
               backend:  # 该规则对应的后端Service，示例可进行替换
                 service:
                   name: test2
                   port:
                     number: 8081
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
     ingressClassName: cce
   ```
   
   表1转发规则优先级注解 
   | 参数                                    | 类型     | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|:---|
   | kubernetes.io/elb.ingress-order        | String | 不同Ingress间的转发规则排序，参数值越小表示优先级越高，且同一个监听器内规则优先级必须唯一，取值范围为1\~1000。 仅独享型ELB支持配置。 说明： - 配置该注解时，默认开启"kubernetes.io/elb.rule-priority-enabled"注解，即同时对每个Ingress的转发规则进行排序。  - kubernetes.io/elb.ingress-order注解中设置的优先级与ELB侧的转发策略优先级属于不同层面的概念，二者不存在直接映射关系。该注解可对不同的Ingress进行排序：具有该注解的Ingress优先级较高，而多个Ingress都具有该注解时则按注解值的大小排序，参数值越小表示优先级越高。关于以上规则，您可以参考[转发规则优先级设置示例]了解更多场景化的示例。   |
   | kubernetes.io/elb.rule-priority-enabled | String  | 仅支持设置为"true"，表示对同一个Ingress的转发规则进行排序，系统将会根据创建Ingress时的转发规则先后顺序确定优先级，配置在上面的优先级高。 未开启该参数时，同一个Ingress的转发规则会使用ELB侧的默认排序，开启后则不允许关闭。 仅独享型ELB支持配置。                                                                                                                                                                                                                                                                                                                                                                                             |
      
   
   
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.**.**.**     88      10s
   ```
   
   
 
 #### 转发规则优先级设置示例
假设当前已存在ingress-a的kubernetes.io/elb.ingress-order参数值设置为1，且该ingress-a存在规则A和规则B；Ingress-b的kubernetes.io/elb.ingress-order参数值设置为2，该Ingress-b存在规则C和规则D。
YAML示例如下：
- ingress-a：
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-a
    namespace: default
    annotations:
      kubernetes.io/elb.port: '88'    # 对接的ELB端口
      kubernetes.io/elb.id: f7fb2aa8-34af-48fb-b451-16e8f675ff45    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.ingress-order: '1'    # 不同Ingress间的转发规则优先级
      kubernetes.io/elb.rule-priority-enabled: 'true'   # 同一个Ingress的转发规则按照paths字段下的转发规则顺序进行排序
  spec:
    rules:
      - host: ''
        http:
          paths:
            - path: /A  # 定义转发规则A
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: nginx 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
            - path: /B  # 定义转发规则B
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: nginx
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
- ingress-b：
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-b
    namespace: default
    annotations:
      kubernetes.io/elb.port: '88'    # 对接的ELB端口
      kubernetes.io/elb.id: f7fb2aa8-34af-48fb-b451-16e8f675ff45   # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.ingress-order: '2'    # 不同Ingress间的转发规则优先级
      kubernetes.io/elb.rule-priority-enabled: 'true'   # 同一个Ingress的转发规则按照paths字段下的转发规则顺序进行排序
  spec:
    rules:
      - host: ''
        http:
          paths:  
            - path: /C  # 定义转发规则C
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: nginx
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
            - path: /D  # 定义转发规则D
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: nginx
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
 
ingress-a和ingress-b同时对接同一个ELB端口，此时ELB的转发策略顺序依次为：
| 转发规则顺序 | 转发规则 | 所属Ingress |
|:---|:---|:---|
| 1       | 规则A  | ingress-a |
| 2        | 规则B  | ingress-a   |
| 3       | 规则C  | ingress-b   |
| 4      | 规则D    | ingress-b   |
   
图2ELB的转发策略顺序示例1   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002386657141.png "点击放大")
如果此时为ingress-b添加规则E，并将规则E的顺序设置在规则C、D之前，修改ingress-b的YAML如下：
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-b
  namespace: default
  annotations:
    kubernetes.io/elb.port: '88'    # 对接的ELB端口
    kubernetes.io/elb.id: f7fb2aa8-34af-48fb-b451-16e8f675ff45   # 已有ELB的ID
    kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
    kubernetes.io/elb.ingress-order: '2'    # 不同Ingress间的转发规则优先级
    kubernetes.io/elb.rule-priority-enabled: 'true'   # 同一个Ingress的转发规则按照paths字段下的转发规则顺序进行排序
spec:
  rules:
    - host: ''
      http:
        paths:
          - path: /E  # 定义转发规则E
            backend:  # 该规则对应的后端Service，示例可进行替换
              service:
                name: nginx
                port:
                  number: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: /C  # 定义转发规则C
            backend:  # 该规则对应的后端Service，示例可进行替换
              service:
                name: nginx
                port:
                  number: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: /D  # 定义转发规则D
            backend:  # 该规则对应的后端Service，示例可进行替换
              service:
                name: nginx
                port:
                  number: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
  ingressClassName: cce
```
则此时ELB的转发策略顺序依次为：
| 转发规则顺序 | 转发规则    | 所属Ingress    |
|:---|:---|:---|
| 1     | 规则A      | ingress-a    |
| 2    | 规则B    | ingress-a  |
| **3**  | **规则E** | **ingress-b** |
| 4     | 规则C      | ingress-b   |
| 5     | 规则D       | ingress-b    |
   
图3ELB的转发策略顺序示例2   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002353085582.png "点击放大")
#### 配置了HTTP重定向到HTTPS场景
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
集群版本为v1.30.14-r100、v1.31.14-r60、v1.32.13-r30、v1.33.12-r10、v1.34.8-r10、v1.35.5-r10、v1.36.2-r0及以上时，使用独享型ELB的Ingress支持配置HTTP重定向到HTTPS，且重定向转发策略的优先级受kubernetes.io/elb.ingress-order注解控制。
详细场景说明及示例，请参见[为配置了重定向监听器的ELB Ingress配置转发规则优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_11012.html)。
