# 为ELB Ingress配置自定义Header转发策略
独享型ELB的Ingress支持自定义Header的转发策略，可通过不同的Header键值来确定转发的后端Service。
#### 前提条件
- 已创建一个CCE Standard或CCE Turbo集群，且集群版本满足以下要求：
  - v1.23集群：v1.23.16-r0及以上
  
  - v1.25集群：v1.25.11-r0及以上
  
  - v1.27集群：v1.27.8-r0及以上
  
  - v1.28集群：v1.28.6-r0及以上
  
  - v1.29集群：v1.29.2-r0及以上
  
  - 其他更高版本的集群
   
- 您需要使用kubectl连接到集群，详情请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
 
#### 约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 该特性依赖ELB高级转发策略，开启后将不再根据域名/路径匹配确定优先级，请您根据实际需要[自定义转发策略优先级](https://support.huaweicloud.com/usermanual-cce/cce_10_0939.html)。关于转发策略优先级详情请参见[ELB Ingress转发策略优先级说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0950.html)。

- 由于自定义Header转发策略（kubernetes.io/elb.headers.\<svc-name\>）和高级转发策略（kubernetes.io/elb.conditions.\<svc-name\>）的部分功能重叠，两者不能同时配置。当前高级转发策略中已支持根据Header转发，您可以统一使用高级转发策略进行配置（参见[场景一：为ELB Ingress配置高级转发规则](https://support.huaweicloud.com/usermanual-cce/cce_10_0949.html#cce_10_0949__section1439911272208)），避免冲突。
 
#### 通过kubectl命令行配置
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:
     name: ingress-test
     namespace: default
     annotations:
       kubernetes.io/elb.port: '80'
       kubernetes.io/elb.id: 08eab934-1636-4d90-a4cd-cb3fa4330411
       kubernetes.io/elb.class: performance  #需使用独享型ELB
       # 表示只能通过Header key1=value1或者key1=value2访问/a路径，最终访问到的服务是 svc-a:80
       kubernetes.io/elb.headers.svc-a: | 
         {
             "key": "key1",
             "values": [
                 "value1",
                 "value2"
             ]
         }
       # 表示只能通过Header key2=value1或者key2=value2访问/b路径，最终访问到的服务是 svc-b:81
       kubernetes.io/elb.headers.svc-b: |  
         {
             "key": "key2",
             "values": [
                 "value1",
                 "value2"
             ]
         }
   spec:
     rules:
       - host: ''
         http:
           paths:
             - path: /a
               backend:
                 service:
                   name: svc-a
                   port:
                     number: 80
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
             - path: /b
               backend:
                 service:
                   name: svc-b
                   port:
                     number: 81
               property:
                 ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
               pathType: ImplementationSpecific
     ingressClassName: cce
   ```
   表1自定义Header转发策略注解 
   | 参数                                      | 类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|:---|
   | kubernetes.io/elb.headers.*${svc_name}* | String | Ingress关联的Service配置自定义的Header，${svc_name}即对应的Service名称。 格式说明：Json字符串，如 {"key": "test", "values": \["value1", "value2"\]} - key/value表示自定义Header的键值对，value最多可以配置9个（如果同时配置了host，则只能配置8个value）。 key的取值范围：长度限制1-40字符，只允许包含字母、数字、中划线（-）和下划线（_） value的取值范围：长度限制1-128字符，不支持空格，双引号，支持以下通配符：\*（匹配0个或更多字符）和?（正好匹配1个字符）   - 设置自定义Header转发策略后，Ingress不能再同时创建灰度发布策略  - svc_name最大长度51个字符   |
      
   
   
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
   ```
   
   
 
