容器服务 在 TKE 上使用正则表达式配置 CLB Ingress

容器服务 TKE 支持使用正则表达式在 CLB Ingress上 配置转发规则。现有的 CLB Ingress 通过配置特定注解实现这一特性。这里说明如何在 CLB Ingress 使用正则表达式配置转发规则。

相关产品
容器服务 产品页,含版本规格、价格与购买入口。

一、注意事项

CLB Ingress 可以同时使用精确匹配、前缀匹配和正则匹配。在 CLB Ingress 配置转发规则支持以下场景。

适用场景 路径配置示例
区分大小写的正则匹配路径 ~/CaseSensitive/API
忽略大小写的正则匹配路径 ~*/caseinsensitive/api
精确匹配的路径 =/exact/api
普通前缀匹配 /prefix/api

二、CLB Ingress 使用正则表达式配置说明

CLB Ingress 上使用正则表达式配置转发规则的特性,在混合协议特性的基础上实现,该特性详见 Ingress 混合使用 HTTP 及 HTTPS 协议。

CLB Ingress 通过混合协议特性选择规则的方式来选中转发规则,然后再根据 pathType 字段将匹配的转发规则配置为正则表达式类型的转发规则,并最终配置到 CLB 的 Path 上。

注意:在 Ingress spec 上配置的 path 必须以 / 开头。因此,需要通过注解对这些 spec 上的 path 进行修改。

三、选中转发规则

为了使用混合协议,必须设置注解 ingress.cloud.tencent.com/rule-mix: "true"。然后使用 kubernetes.io/ingress.http-rules 和 kubernetes.io/ingress.https-rules 注解来选中转发规则。注解的值格式是一个 JSON Array 数组。数组中每个对象的格式如下:

// 注解 kubernetes.io/ingress.https-rules 或 kubernetes.io/ingress.https-rules 值数组中的对象格式{ "pathType": ["<正则表达式类型>"] "host": "<host>", "path": "<path>", "backend": { "serviceName": "<service name>", "servicePort": "<service port>" }}

其中,

1. host(可忽略),path,backend 用于选中某条转发规则。

2. pathType 用于声明转发规则,以待后续配置 CLB 转发规则。

3. 当使用非正则表达式时,Ingress 注解中的 path 与 Ingress spec 中的 path 完全一致。

注意:当使用正则表达式时,令Ingress spec 中的 path 所包含的转义字符 \\ 修改为 \\\\,这样得到的 path 就是 Ingress 注解中的 path。例如,spec 中 path /.*\\.png$ 在注解中应该修改为 path /.*\\\\.png$。

四、声明和配置转发规则

pathType 字段声明对注解中的转发规则进行修改,以符合CLB的配置方式。

TKE PathType 类型 类型说明 对注解 path 的修改行为
Exact 精确匹配 在 path 前增加 ‘=’
Regex 区分大小写的正则匹配 在 path 前增加 ‘~’
RegexIgnoreCase 不区分大小写的正则匹配 在 path 前增加 ‘~*’
NonAbsolutePath 转发路径不要以绝对路径开头(可以与 “Regex” “RegexIgnoreCase” 配合使用) 在 path 前去除 ‘/’

五、添加混合协议注解

在 Ingress 上添加注解 kubernetes.io/ingress.rule-mix: "true"。

六、添加注解中的转发路径

在 Ingress 上添加注解 kubernetes.io/ingress.http-rules。然后根据 spec 规则填写相应的正则表达式规则。具体样例见下表:

期望 CLB上的 Path 正则表达式类型 路径需求 spec 中的Path(必须以 / 开头) 注解中对应的pathType 注解中的对应的Path (注意转义字符)
/prefix 无,该路径是通用匹配 /prefix ,非正则表达式,通用匹配 /prefix 无 /prefix
=/exact-path 精确匹配 /exact-path ,精确匹配 /exact-path ["Exact"] /exact-path
~Regex/[a-z]*.ico$ 区分大小写的正则匹配 Regex/[a-z]*.ico$ , 区分大小写的正则匹配 /Regex/[a-z]*.ico$ ["Regex","NonAbsolutePath"] /Regex/[a-z]*.ico$
~*RegexIgnoreCase/V1[.]0/.*/my\\.png 不区分大小写的正则匹配 RegexIgnoreCase/V1[.]0/.*/my\\.png , 不区分大小写的正则匹配 /RegexIgnoreCase/V1[.]0/.*/my\\.png ["RegexIgnoreCase","NonAbsolutePath"] /RegexIgnoreCase/V1[.]0/.*/my\\\\.png

配置好的 YAML 文件样例参考如下:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: kubernetes.io/ingress.http-rules: |- [ {"path":"/prefix","backend":{"serviceName":"anyserver","servicePort":"7001"}}, {"pathType":["Exact"],"path":"/exact-path","backend":{"serviceName":"anyserver","servicePort":"7002"}}, {"pathType":["Regex","NonAbsolutePath"],"path":"/Regex/[a-z]*.ico$","backend":{"serviceName":"anyserver","servicePort":"7003"}}, {"pathType":["RegexIgnoreCase","NonAbsolutePath"],"path":"/RegexIgnoreCase/V1[.]0/.*/my\\\\.png","backend":{"serviceName":"anyserver","servicePort":"7004"}} ] kubernetes.io/ingress.rule-mix: "true" name: anyserverspec: rules: – http: paths: – backend: service: name: anyserver port: number: 7001 path: /prefix # 非正则表达式转发规则 pathType: ImplementationSpecific – backend: service: name: anyserver port: number: 7002 path: /exact-path # 精确匹配 pathType: ImplementationSpecific – backend: service: name: anyserver port: number: 7003 path: /Regex/[a-z]*.ico$ # 区分大小写的正则匹配 pathType: ImplementationSpecific – backend: service: name: anyserver port: number: 7004 path: /RegexIgnoreCase/V1[.]0/.*/my\\.png # 不区分大小写的正则匹配,注意在 annotation 中使用了转义字符 pathType: ImplementationSpecific

赞 (0)
上一篇 4天前
下一篇 4天前