You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置存在几个关键问题,导致路由规则未触发:

  1. Header值拼写不匹配:Gateway API中你判断的是authtype: my-jwt,但Canary配置里写的是canary-by-header-value: "myjwt"(少了横杠),这会导致带正确Header的请求无法匹配Canary规则。
  2. 注解与路由逻辑的对齐问题:虽然你使用了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测试两种场景,确认路由是否生效:

  1. 带正确Header的请求(应走asvc):
curl -H "authtype: my-jwt" http://something.com/i/xxx

可通过Nginx Ingress Controller的日志验证路由目标:

kubectl logs -n <你的Ingress控制器命名空间> <控制器Pod名称> | grep "asvc"
  1. 不带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:28:09