一、注意事项
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