文档中心>容器服务>实践教程>网络>在 TKE 上使用正则表达式配置 CLB Ingress

在 TKE 上使用正则表达式配置 CLB Ingress

最近更新时间:2025-09-05 16:52:52

我的收藏

操作场景

容器服务 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-ruleskubernetes.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/v1
kind: Ingress
metadata:
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: anyserver
spec:
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