为ELB Ingress配置高级转发策略
在CCE集群中创建ELB Ingress后,系统会自动在ELB上创建对应的监听器并配置转发策略,Ingress默认根据域名、路径匹配客户端请求,然后通过监听器转发至对应的后端服务器(节点或Pod)进行处理。在创建ELB Ingress时,您可以配置多样化的转发规则和转发动作,满足自定义的业务需求、灵活分配流量。

高级转发策略的实现分为以下四个步骤:
- 客户端访问ELB Ingress,发送请求至ELB。
- ELB首先根据高级转发策略中的转发规则匹配访问请求,匹配成功后继续执行转发动作。
- ELB再根据已设置的转发动作,将客户端请求转发至对应的后端服务器进行处理。
- 最后返回响应至客户端。
高级转发策略支持的转发规则与转发动作请参见高级转发规则介绍和高级转发动作介绍。
前提条件
- 已创建一个集群版本满足要求的CCE Standard或CCE Turbo集群。
- 您需要使用kubectl连接到集群,详情请参见通过kubectl连接集群。
约束与限制
- 该特性仅在使用独享型ELB时支持配置。
- 该特性依赖ELB高级转发策略,开启后将不再根据域名/路径匹配确定优先级,请您根据实际需要自定义转发策略优先级。关于转发策略优先级详情请参见ELB Ingress转发策略优先级说明。
高级转发规则介绍
ELB Ingress支持在“kubernetes.io/elb.conditions.<svc-name>”注解中配置转发规则,根据不同的规则匹配满足条件的访问请求,然后进行流量转发。
如果在一个注解中为同一个Service配置不同的转发规则,不同的规则是“与”关系,但同一个规则块中的值是“或”关系。例如,Method和QueryString两种转发规则都配置时,需要同时满足,才能实现目标流量分发。但如果Method值为GET,POST,即只需要满足Method为GET或POST,且QueryString满足条件即可。

最多支持添加10个高级转发条件(包括域名和路径),同一转发规则类型的每个value值都算作一个转发条件。
例如,某个Ingress配置了域名和路径,则最多支持再添加8个高级转发条件;如果再配置根据HTTP请求方法转发,如GET、POST,则继续占用2个转发条件。
转发规则 |
说明 |
操作指导 |
集群版本要求 |
---|---|---|---|
HTTP请求方法 |
根据HTTP请求的类型(如GET、POST等)进行匹配,匹配成功后再执行转发动作。 注解示例如下: kubernetes.io/elb.conditions.<svc-name>: |
[{
"type": "Method",
"methodConfig": {
"values": [
"GET",
"POST"
]
}
}] |
关于高级转发规则的具体配置示例及参数说明,请参见场景一:为ELB Ingress配置高级转发规则 |
|
HTTP请求头 |
根据HTTP请求头中的特定信息(如User-Agent、Content-Type等)进行匹配,匹配成功后再执行转发动作。 注解示例如下: kubernetes.io/elb.conditions.<svc-name>: |
[{
"type": "Header",
"headerConfig": {
"key": "gray-hello",
"values": [
"value1",
"value2"
]
}
}] |
||
Cookie |
根据Cookie中的指定键值进行匹配,匹配成功后再执行转发动作。 注解示例如下: kubernetes.io/elb.conditions.<svc-name>: |
[{
"type": "Header",
"headerConfig": {
"key": "gray-hello",
"values": [
"value1",
"value2"
]
}
}] |
||
查询字符串 |
根据URL中查询字符串的特定参数和值进行匹配,匹配成功后再执行转发动作。 注解示例如下: kubernetes.io/elb.conditions.<svc-name>: |
[{
"type": "QueryString",
"queryStringConfig": {
"key": "querykey",
"values": [
"queryvalue"
]
}
}] |
||
网段 |
根据请求来源的IP地址所属的网段进行匹配,匹配成功后再执行转发动作。 注解示例如下: kubernetes.io/elb.conditions.<svc-name>: |
[{
"type": "SourceIp",
"sourceIpConfig": {
"values": [
"192.168.0.0/16",
"172.16.0.0/16"
]
}
}] |
高级转发动作介绍
ELB Ingress支持在注解中配置多种转发动作,您可以使用这些转发动作灵活地管理访问请求以满足业务需求。
- 转发至后端服务器组(ELB Ingress默认转发动作):支持重写、跨域访问、写入/删除Header、限速等额外转发动作,ELB将首先执行额外的转发动作,然后再将请求转发至对应的后端服务器组。额外转发动作中,限速的优先级最高。
- 重定向至监听器:支持HTTP协议重定向至HTTPS协议。
- 返回固定响应:支持配置限速等额外转发动作。
- 转发至自定义后端服务器组:不可与灰度发布、返回固定响应、重定向到URL同时使用。
转发动作 |
额外转发动作 |
说明 |
操作指导 |
集群版本要求 |
---|---|---|---|---|
转发至后端服务器组(ELB Ingress默认转发动作) |
重写 |
该转发动作可以重写请求的路径信息。 注解示例如下: kubernetes.io/elb.rewrite-target: /rewritepath |
具体配置示例及参数说明,请参见为ELB Ingress配置Rewrite重写 |
|
跨域访问 |
该转发动作可以支持资源的跨域访问。 注解示例如下: 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配置跨域访问 |
|
|
写入/删除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 |
||
限速 |
该转发动作支持对请求设置限速。 注解示例如下: kubernetes.io/elb.actions.<svc-name>: |
[{
"type": "TrafficLimit",
"trafficLimitConfig": {
"QPS": 4,
"perSourceIpQps": 2,
"burst": 2
}
}] |
具体配置示例及参数说明,请参见示例三:为ELB Ingress配置限速 |
|
|
重定向至监听器(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 |
|
重定向至URL |
无可额外添加的转发动作 |
该转发动作可以将特定的访问请求重定向至指定的URL,并返回3xx返回码。 注解示例如下: kubernetes.io/elb.redirect-url: https://example.com/testa # 重定向URL的信息 kubernetes.io/elb.redirect-url-code: '301' # 重定向URL后的返回码 |
具体配置示例及参数说明,请参见为ELB Ingress配置URL重定向 |
|
返回固定响应 |
不额外添加转发动作 |
该转发动作可以直接返回固定响应,不向后端服务器继续转发。 注解示例如下: kubernetes.io/elb.actions.<svc-name>: |
[{
"type": "FixedResponse",
"fixedResponseConfig": {
"contentType": "text/plain",
"statusCode": "503",
"messageBody": "503 error text"
}
}] |
具体配置示例及参数说明,请参见示例二:为ELB Ingress配置返回固定响应 |
|
限速 |
该转发动作支持对请求设置限速。 注解示例如下: 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配置限速 |
|
|
转发到自定义后端服务器组 |
该转发动作支持将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配置自定义后端服务器组 |
|
场景一:为ELB Ingress配置高级转发规则
ELB Ingress支持根据自定义的HTTP请求方法、请求头、查询字符串和源网段进行流量转发。以下示例中,当请求路径是/hello1,且同时满足以下高级转发规则时才会将流量转发至svc-hello1服务:
- 请求方法为GET或POST
- 请求头中包含键为gray-hello,值为value1或value2
- Cookie的键为cookiekey1,值为cookievalue1或键为cookiekey2,值为cookievalue2
- 查询字符串的键为querykey,值为queryvalue
- 源网段为192.168.0.0/16或172.16.0.0/16
具体操作及参数配置说明如下:
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建名为“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: ab53c3b2-xxxx-xxxx-xxxx-5ac3eb2887be kubernetes.io/elb.port: '80' # 以下注解表示为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时使用。
一个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或2020:50::44/127
sourceIpConfig无需设置key,仅设置values即可,values为数组。
{ "type": "SourceIp", "sourceIpConfig": { "values": [ "192.168.0.0/16", "172.16.0.0/16" ] } }
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/ingress-test created
- 查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功。NAME CLASS HOSTS ADDRESS PORTS AGE ingress-test cce * 121.**.**.** 80 10s
场景二:为ELB Ingress配置高级转发动作
以下示例将为您介绍如何为ELB Ingress配置写入/删除请求头、返回固定响应、限速、转发至自定义后端服务器组。
组合使用场景
高级转发规则与转发动作组合使用,可以满足各种多样化的需求,例如:
1.当访问Ingress时,满足以下转发规则 |
2.将执行以下转发动作 |
3.访问的目标Service(后端服务) |
---|---|---|
|
转发时执行以下动作:
|
test |
|
转发时执行以下动作:
|
test2 |
|
转发时执行以下动作:
|
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