为ELB Ingress配置高级转发规则
Ingress支持多样化的转发规则,可以根据HTTP请求方法、HTTP请求头、查询字符串、网段、Cookie等请求参数匹配不同的监听器(每个监听器对应一个ELB访问端口),便于灵活地分流业务,合理分配资源。
前提条件
- 已创建一个CCE Standard或CCE Turbo集群,且集群版本满足以下要求:
- 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及以上
- 其他更高版本的集群
- 您需要使用kubectl连接到集群,详情请参见通过kubectl连接集群。
约束与限制
仅使用独享型ELB时,Ingress支持配置高级转发规则。
通过kubectl命令行配置
- 请参见通过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服务,请确保svc-hello1服务存在 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": "querystringkey1", "value": "querystringvalue2" }, { "key": "querystringkey3", "value": "querystringvalue4" } ] } }, { "type": "QueryString", "queryStringConfig": { "key": "testKey", "values": [ "testValue" ] } }, { "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
表1 高级转发规则注解 参数
类型
描述
kubernetes.io/elb.conditions.${svc_name}
String
配置高级转发规则,${svc_name}即对应的Service名称,其最大长度为48个字符。
如果该annotation值配置成[]则表示删除相应的高级转发规则。
注解值格式为Json字符串数组,具体格式请参见表2。
须知:- 由于ELB的API限制,conditions设置的数量上限为10,即一条kubernetes.io/elb.conditions.{svcName}中,最多包含十条key-value键值对。
- 一条conditions中的数组中不同的规则是“与”关系,但同一个规则块中的值是“或”关系。例如,Method和QueryString两种转发条件都配置时,需要同时满足,才能实现目标流量分发。但如果Method值为GET,POST,即只需要满足Method为GET或POST,且QueryString满足条件即可。
表2 数组结构 参数
使用说明
示例
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": "querystringkey1", "value": "querystringvalue2" }, { "key": "querystringkey3", "value": "querystringvalue4" } ] } }
queryStringConfig
当请求中的字符串与设置好的转发规则中的字符串相匹配时,触发转发,仅当type参数值为QueryString时使用。
查询字符串是键值对的形式,需要分别设置值:
- 键(key):只能包含英文字母、数字和特殊字符!$'()*+,./:;=?@^-_'。
- 值(value):一个键下可以配置多个值。只能包含英文字母、数字和特殊字符!$'()*+,./:;=?@^-_'。还支持*和?两种通配符。
queryStringConfig仅能设置一个Key,如需设置多个Key,请配置多组QueryStringConfig规则块。
{ "type": "QueryString", "queryStringConfig": { "key": "testKey", "values": [ "testValue" ] } }
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