如何让Kubernetes Ingress的路径匹配不区分大小写?
Kubernetes Ingress路径不区分大小写配置方案
Kubernetes原生Ingress资源(networking.k8s.io/v1)本身不支持路径的不区分大小写匹配,路径匹配是严格按定义的字符串执行的。要实现需求,需依赖你使用的Ingress Controller的扩展特性,以下是两种主流控制器的实现方法:
NGINX Ingress Controller 配置方法
方法1:使用官方注解(推荐,需版本≥0.21.0)
直接添加nginx.ingress.kubernetes.io/case-sensitive注解开启不区分大小写匹配,修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: APP namespace: NAMESPACE annotations: nginx.ingress.kubernetes.io/case-sensitive: "false" spec: rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: APP port: number: 80
方法2:配置Lua片段(兼容旧版本)
如果你的NGINX Ingress Controller版本较低,不支持上述注解,可以通过配置片段将请求URI转为小写后匹配:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: APP namespace: NAMESPACE annotations: nginx.ingress.kubernetes.io/configuration-snippet: | rewrite_by_lua_block { ngx.var.uri = string.lower(ngx.var.uri) } spec: rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: APP port: number: 80
Traefik Ingress Controller 配置方法
Traefik通过中间件实现路径大小写转换,步骤如下:
- 创建一个小写转换中间件
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: lowercase-path namespace: NAMESPACE spec: lowerCase: enabled: true
- 在Ingress资源中引用该中间件
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: APP namespace: NAMESPACE annotations: traefik.ingress.kubernetes.io/router.middlewares: NAMESPACE-lowercase-path@kubernetescrd spec: rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: APP port: number: 80
核心逻辑是通过Ingress Controller的扩展能力,将请求路径统一转为小写(或大写),再与Ingress中定义的标准化路径(建议统一为小写)匹配,从而实现不区分大小写的路径匹配效果。
内容的提问来源于stack exchange,提问作者vaisakh raveendran
相关产品推荐
相关产品推荐

