相同Ingress配置为何在不同集群生成的nginx location规则不一致?
问题根因定位
核心差异是两个集群的ingress-nginx控制器对路径的解析逻辑不同:
- 正常集群的
location ~* "^/test(/|$)(.*)/"是不区分大小写的正则匹配规则,可以正确匹配/test/、/test/abc等路径 - 异常集群的
location /test(/|$)(.*)/是普通前缀匹配规则,会把括号、正则符号当成字面量路径处理,只有访问路径包含/test(/|$)(.*)字面量时才会命中,访问/test/自然返回404
触发原因排查方向
按优先级从高到低排查:
ingress-nginx全局正则匹配开关配置差异
ingress-nginx的全局ConfigMap(默认名称为nginx-configuration,位于ingress-nginx部署的命名空间下)中有use-regex配置项:- 若该值为
true,所有Ingress的路径会默认当做正则表达式解析,自动生成带~*的location规则 - 若该值为
false,只有Ingress单独添加nginx.ingress.kubernetes.io/use-regex: "true"注解时,才会按正则解析路径
你的Ingress配置中未显式添加该注解,若两个集群的全局use-regex配置不一致,就会出现你遇到的现象。
- 若该值为
ingress-nginx控制器实际运行版本差异
尽管你标注两个集群使用的chart版本均为v4.0.6,但可能存在镜像拉取异常、集群内镜像覆盖的情况,导致实际运行的控制器版本不同,路径解析逻辑存在差异。可通过以下命令校验实际版本:kubectl exec -n <ingress-nginx命名空间> <控制器Pod名称> -- /nginx-ingress-controller --versionIngress注解的全局默认覆盖配置差异
部分集群管理员会通过ingress-nginx的annotations-prefix或者默认注入的MutatingWebhook给Ingress自动添加注解,若第二个集群存在自动关闭正则匹配的默认注入规则,也会导致该问题。
快速验证修复方式
直接在你的Ingress的annotations字段中添加如下配置,强制开启该Ingress的路径正则解析,观察异常集群是否恢复正常:
nginx.ingress.kubernetes.io/use-regex: "true"
内容的提问来源于stack exchange,提问作者Stini
相关产品推荐
相关产品推荐

