操作场景
容器服务 TKE 支持使用正则表达式在 CLB Ingress上 配置转发规则。现有的 CLB Ingress 通过配置特定注解实现这一特性。本文将为您介绍如何在 CLB Ingress 使用正则表达式配置转发规则。
注意事项
CLB Ingress 可以同时使用精确匹配、前缀匹配和正则匹配。在 CLB Ingress 配置转发规则支持以下场景。
适用场景 | 路径配置示例 |
区分大小写的正则匹配路径 | ~/CaseSensitive/API |
忽略大小写的正则匹配路径 | ~*/caseinsensitive/api |
精确匹配的路径 | =/exact/api |
普通前缀匹配 | /prefix/api |
CLB Ingress 使用正则表达式配置说明
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: anyserverport:number: 7001path: /prefix # 非正则表达式转发规则pathType: ImplementationSpecific- backend:service:name: anyserverport:number: 7002path: /exact-path # 精确匹配pathType: ImplementationSpecific- backend:service:name: anyserverport:number: 7003path: /Regex/[a-z]*.ico$ # 区分大小写的正则匹配pathType: ImplementationSpecific- backend:service:name: anyserverport:number: 7004path: /RegexIgnoreCase/V1[.]0/.*/my\\.png # 不区分大小写的正则匹配,注意在 annotation 中使用了转义字符pathType: ImplementationSpecific