K8s 1.32.3与Nginx 1.12.4环境下基于传统Ingress实现无路径变更的Header路由方案咨询
K8s 1.32.3与Nginx 1.12.4环境下基于传统Ingress实现无路径变更的Header路由方案咨询
看起来你在把Gateway API的Header路由逻辑迁移回传统Nginx Ingress时,遇到了Canary规则不生效、请求全部走主Ingress的问题。我来帮你梳理下问题点和修正后的解决方案:
一、现有Canary配置的问题分析
你当前的Canary配置存在几个关键问题,导致路由规则未触发:
- Header值拼写不匹配:Gateway API中你判断的是
authtype: my-jwt,但Canary配置里写的是canary-by-header-value: "myjwt"(少了横杠),这会导致带正确Header的请求无法匹配Canary规则。 - 注解与路由逻辑的对齐问题:虽然你使用了Canary注解,但核心匹配值的偏差直接导致了规则失效。
二、修正后的传统Ingress配置
以下是调整后的主Ingress和Canary Ingress配置,完全对齐你Gateway API的路由逻辑,且不需要修改原有路径:
1. 主Ingress(无指定Header时走服务i)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: i-direct-ingress namespace: mynamespace spec: ingressClassName: nginx rules: - host: something.com http: paths: - path: /i pathType: Prefix backend: service: name: i port: number: 8000
2. Canary Ingress(带authtype: my-jwt时走服务asvc)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: i-canary-ingress namespace: mynamespace annotations: nginx.ingress.kubernetes.io/canary: "true" # 指定触发Canary路由的Header名称 nginx.ingress.kubernetes.io/canary-by-header: "authtype" # 只有Header值完全匹配时才走Canary服务 nginx.ingress.kubernetes.io/canary-by-header-value: "my-jwt" spec: ingressClassName: nginx rules: - host: something.com http: paths: - path: /i pathType: Prefix backend: service: name: asvc port: number: 8000
三、配置关键说明
- Canary核心注解作用:
nginx.ingress.kubernetes.io/canary: "true":标记该Ingress为Canary路由,Nginx Ingress Controller会优先处理它的匹配规则。canary-by-header:指定用来触发Canary路由的Header键名,和你原来的Gateway API逻辑保持一致。canary-by-header-value:设置精准匹配的Header值,完全对齐你之前my-jwt的规则。
- 路径一致性:主Ingress和Canary Ingress的
path、host规则完全一致,确保所有/i前缀的请求都进入Header判断逻辑。
四、验证方法
你可以用curl测试两种场景,确认路由是否生效:
- 带正确Header的请求(应走
asvc):
curl -H "authtype: my-jwt" http://something.com/i/xxx
可通过Nginx Ingress Controller的日志验证路由目标:
kubectl logs -n <你的Ingress控制器命名空间> <控制器Pod名称> | grep "asvc"
- 不带Header或Header值不匹配的请求(应走
i):
curl http://something.com/i/xxx # 或带错误Header值测试 curl -H "authtype: wrong-value" http://something.com/i/xxx
五、额外注意事项
- IngressClass一致性:确保主Ingress和Canary Ingress的
ingressClassName都设置为你环境中Nginx Ingress Controller对应的类(通常为nginx)。 - 避免配置冲突:不要在主Ingress上添加任何Canary相关注解,保持主Ingress为常规路由规则。
- 日志排查:如果仍不生效,可查看Nginx Ingress Controller的日志,检查是否有Header匹配的相关日志输出,定位规则不触发的具体原因。
内容来源于stack exchange
相关产品推荐
相关产品推荐

