
# 为配置了重定向监听器的ELB Ingress配置转发规则优先级
当多个Ingress资源共享同一个ELB时，特别是在涉及HTTP到HTTPS重定向的场景下，转发策略的执行顺序至关重要。如果优先级配置不当，可能导致重定向逻辑干扰正常的业务路由，或者业务路由被重定向规则意外拦截。本文介绍如何为配置了重定向监听器的ELB Ingress配置转发规则优先级。
#### 约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 集群版本为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及以上版本时，使用HTTP重定向到HTTPS协议的策略支持配置优先级排序。
 
#### 默认优先级规则
为ELB ingress配置转发规则优先级时，可使用"kubernetes.io/elb.ingress-order"注解为不同Ingress的转发规则进行排序，具体规则如下：
- "kubernetes.io/elb.ingress-order"注解的参数取值范围为1\~1000，参数值越小，表示优先级越高。
- 具有"kubernetes.io/elb.ingress-order"注解的Ingress优先级较高，不具有该注解的Ingress优先级较低。
即在默认场景下，不同ingress的优先级从高到低如下：
1. 配置了kubernetes.io/elb.ingress-order且取值较小
2. 配置了kubernetes.io/elb.ingress-order且取值较大
3. 未配置kubernetes.io/elb.ingress-order注解
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
ingress-order的更多信息，请参见[为ELB Ingress配置转发规则优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_0939.html)。
在未配置ingress-order优先级注解的情况下，HTTP至HTTPS的重定向规则默认拥有最高优先级。详情请参见[示例2：重定向场景下未配置ingress-order]。
#### 场景示例
#### 示例1：重定向场景下配置ingress-order
例如，有四个Ingress资源（ingress-a，ingress-b，ingress-c，ingress-d），共用一个独享型ELB。
| Ingress   | ingress-order值 | 端口     | 规则                         | 说明                     |
|:---|:---|:---|:---|:---|
| ingress-a | 1              | 80     | 规则A（host: a.com, path: /A） | 80端口HTTP转发             |
| ingress-b | 2              | 80→443 | 规则B（host: b.com, path: /B） | 配置HTTP/80重定向到HTTPS/443 |
| ingress-c | 3              | 443    | 规则C（host: c.com, path: /C） | 443端口HTTPS转发           |
| ingress-d | 未配置            | 80     | 规则D（host: d.com, path: /D） | 80端口HTTP转发             |
   
YAML示例如下：
- **ingress-a**
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-a
    namespace: default
    annotations:
      kubernetes.io/elb.port: '80'    # 对接的ELB端口
      kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.ingress-order: '1'    # 不同Ingress间的转发规则优先级
  spec:
    rules:
      - host: 'a.com'
        http:
          paths:
            - path: /A  # 定义转发规则A
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  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.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.listen-ports: '[{"HTTP":80},{"HTTPS":443}]'   # 多端口配置
      kubernetes.io/elb.port: '80'             # 对接的ELB端口
      kubernetes.io/elb.ssl-redirect: 'true'   # 开启HTTP重定向到HTTPS
      kubernetes.io/elb.tls-certificate-ids: fd12a22d3ea64ae697066b78d9******,e981aee11f074c8d89c8eaa023******
      kubernetes.io/elb.tls-ciphers-policy: tls-1-0-inherit
      kubernetes.io/elb.ingress-order: '2'    # 不同Ingress间的转发规则优先级
  spec:
    rules:
      - host: 'b.com'
        http:
          paths:
            - path: /B  # 定义转发规则B
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
- **ingress-c**
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-c
    namespace: default
    annotations:
      kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.port: '443'      # 对接的ELB端口
      kubernetes.io/elb.tls-certificate-ids: fd12a22d3ea64ae697066b78d9******,e981aee11f074c8d89c8eaa023******
      kubernetes.io/elb.tls-ciphers-policy: tls-1-0-inherit
      kubernetes.io/elb.ingress-order: '3'    # 不同Ingress间的转发规则优先级
  spec:
    rules:
      - host: 'c.com'
        http:
          paths:
            - path: /C  # 定义转发规则C
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
- **ingress-d**
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-d
    namespace: default
    annotations:
      kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.port: '80'        # 对接的ELB端口
  spec:
    rules:
      - host: 'd.com'
        http:
          paths:
            - path: /D  # 定义转发规则D
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
 
创建成功截图示例如下。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675803626.png "点击放大")
查看ELB的80监听器上的转发策略优先级，此时转发策略顺序依次为：
| **转发规则优先级** | **规则**                     | **所属Ingress** | 说明                     | 对应的ingress-order |
|:---|:---|:---|:---|:---|
| 1           | 规则A（host: a.com, path: /A） | ingress-a     | 80端口HTTP转发             | 1                |
| 2           | 规则B（host: b.com, path: /B） | ingress-b     | 配置HTTP/80重定向到HTTPS/443 | 2                |
| 3           | 规则D（host: d.com, path: /D） | ingress-d     | 80端口HTTP转发             | 未配置              |
   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675643782.png "点击放大")
查看ELB的443监听器上的转发策略优先级，此时转发策略顺序依次为：
| **转发规则优先级** | **规则**                     | **所属Ingress** | 说明                     | 对应的ingress-order |
|:---|:---|:---|:---|:---|
| 1           | 规则B（host: b.com, path: /B） | ingress-b     | 配置HTTP/80重定向到HTTPS/443 | 2                |
| 2           | 规则C（host: c.com, path: /C） | ingress-c     | 443端口HTTPS转发           | 3                |
   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675803628.png "点击放大")
若需调重定向规则的优先级，示例如下：
1. 将80端口的ingress-a调整到ingress-b后面 更新ingress-a的YAML，将kubernetes.io/elb.ingress-order从1改为3：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-a
     namespace: default
     annotations:
       kubernetes.io/elb.port: '80'    # 对接的ELB端口
       kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
       kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
       kubernetes.io/elb.ingress-order: '3'    # 由1调整为3
   spec:
     rules:
       - host: 'a.com'
         http:
           paths:
             - path: /A  # 定义转发规则A
               backend:  # 该规则对应的后端Service，示例可进行替换
                 service:
                   name: service1 
                   port:
                     number: 80
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
     ingressClassName: cce
   ```
   查看ELB的80监听器上的转发策略优先级：
   
   | **转发规则优先级** | **规则**                     | **所属Ingress** | 说明                     | 对应的ingress-order |
   |:---|:---|:---|:---|:---|
   | 1           | 规则B（host: b.com, path: /B） | ingress-b     | 配置HTTP/80重定向到HTTPS/443 | 2                |
   | 2           | 规则A（host: a.com, path: /A） | ingress-a     | 80端口HTTP转发             | 3                |
   | 3           | 规则D（host: d.com, path: /D） | ingress-d     | 80端口HTTP转发             | 未配置              |
      
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675643784.png "点击放大")
   
   
   
2. 将443端口的ingress-c放到ingress-b前面 更新ingress-c的YAML，将kubernetes.io/elb.ingress-order从3改为1：
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-c
     namespace: default
     annotations:
       kubernetes.io/elb.port: '443'    # 对接的ELB端口
       kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
       kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
       kubernetes.io/elb.ingress-order: '1'    # 不同Ingress间的转发规则优先级
       kubernetes.io/elb.tls-certificate-ids: fd12a22d3ea64ae697066b78d9******,e981aee11f074c8d89c8eaa023******    
   spec:
     rules:
       - host: 'c.com'
         http:
           paths:
             - path: /C  # 定义转发规则C
               backend:  # 该规则对应的后端Service，示例可进行替换
                 service:
                   name: service1 
                   port:
                     number: 80
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
     ingressClassName: cce
   ```
   查看ELB的443监听器上的转发策略优先级：
   
   | **转发规则优先级** | **规则**                     | **所属Ingress** | 说明                     | 对应的ingress-order |
   |:---|:---|:---|:---|:---|
   | 1           | 规则C（host: c.com, path: /C） | ingress-c     | 443端口HTTPS转发           | 1                |
   | 2           | 规则B（host: b.com, path: /B） | ingress-b     | 配置HTTP/80重定向到HTTPS/443 | 2                |
      
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675803630.png "点击放大")
   
   
 
 #### 示例2：重定向场景下未配置ingress-order
例如，有三个Ingress资源（ingress-a，ingress-b，ingress-c），共用一个独享型ELB。
| Ingress   | ingress-order值 | 端口     | 规则                         | 说明                     |
|:---|:---|:---|:---|:---|
| ingress-a | 未配置            | 80→443 | 规则A（host: a.com, path: /A） | 配置HTTP/80重定向到HTTPS/443 |
| ingress-b | 1              | 80     | 规则B（host: b.com, path: /B） | 80端口HTTP转发             |
| ingress-c | 2              | 80     | 规则C（host: c.com, path: /C） | 80端口HTTP转发             |
   
YAML示例如下：
- ingress-a
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-a
    namespace: default
    annotations:
      kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.listen-ports: '[{"HTTP":80},{"HTTPS":443}]'   # 多端口配置
      kubernetes.io/elb.port: '80'           # 对接的ELB端口
      kubernetes.io/elb.ssl-redirect: 'true'
      kubernetes.io/elb.tls-certificate-ids: fd12a22d3ea64ae697066b78d9*****,e981aee11f074c8d89c8eaa023******
      kubernetes.io/elb.tls-ciphers-policy: tls-1-0-inherit
  spec:
    rules:
      - host: 'a.com'
        http:
          paths:
            - path: /A  # 定义转发规则A
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  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.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.port: '80'            # 对接的ELB端口
      kubernetes.io/elb.ingress-order: '1'    # 不同Ingress间的转发规则优先级
  spec:
    rules:
      - host: 'b.com'
        http:
          paths:
            - path: /B  # 定义转发规则B
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
- ingress-c
  ```
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: ingress-c
    namespace: default
    annotations:
      kubernetes.io/elb.id: fef427e4-6d2c-4c63-bf26-270daa******    # 已有ELB的ID
      kubernetes.io/elb.class: performance    # 已有ELB的类型，该功能仅支持performance
      kubernetes.io/elb.port: '80'            # 对接的ELB端口
      kubernetes.io/elb.ingress-order: '2'    # 不同Ingress间的转发规则优先级
  spec:
    rules:
      - host: 'c.com'
        http:
          paths:
            - path: /C  # 定义转发规则C
              backend:  # 该规则对应的后端Service，示例可进行替换
                service:
                  name: service1 
                  port:
                    number: 80
              property:
                ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
              pathType: ImplementationSpecific
    ingressClassName: cce
  ```
  
 
创建成功截图示例如下。
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675643786.png "点击放大")
查看ELB的80监听器上的转发策略优先级：
| **转发规则优先级** | **规则**                     | **所属Ingress** | 说明                     | 对应的ingress-order |
|:---|:---|:---|:---|:---|
| 1           | 规则A（host: a.com, path: /A） | ingress-a     | 配置HTTP/80重定向到HTTPS/443 | 未配置              |
| 2           | 规则B（host: b.com, path: /B） | ingress-b     | 80端口HTTP转发             | 1                |
| 3           | 规则C（host: c.com, path: /C） | ingress-c     | 80端口HTTP转发             | 2                |
   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002675803632.png "点击放大")
