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

RKE集群Nginx Ingress路径路由异常(304状态)求助

问题排查与解决方案

一、当前Ingress配置的核心问题

  1. 路径匹配与重写规则不匹配
    开启了nginx.ingress.kubernetes.io/use-regex: "true",但path: /tob未使用正则表达式,导致仅能精确匹配/tob路径,无法覆盖/tob/xxx这类带后续路径的请求;同时rewrite-target: /会直接丢弃原路径的后续部分,导致后端服务无法获取完整请求路径。

  2. 304状态码的诱因

    • 前端服务缓存策略:后端服务返回的Cache-Control等缓存头让客户端缓存了资源,后续请求直接命中本地缓存返回304。
    • Ingress代理配置缺失:未明确禁用缓存,或X-Forwarded-Port设置影响了服务端的缓存判断逻辑。
  3. 后端协议不明确
    后端服务端口为8443(通常对应HTTPS),但Ingress未指定代理协议,可能导致HTTP→HTTPS代理时出现协议不匹配,引发异常响应。

二、修正后的单服务Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # 适配后端HTTPS服务
    nginx.ingress.kubernetes.io/rewrite-target: /$2 # 保留路径后续部分
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Forwarded-Port 80;
      # 禁用缓存解决304问题
      add_header Cache-Control "no-cache, no-store, must-revalidate";
      add_header Pragma "no-cache";
      add_header Expires "0";
  name: bilge-tob
  namespace: tob
spec:
  rules:
  - host: test.koc.gov.tr
    http:
      paths:
      - path: /tob(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: tob-frontend
            port:
              number: 8443

配置说明

  • 正则路径:/tob(/|$)(.*) 覆盖/tob、/tob/、/tob/xxx所有相关请求,$2捕获路径后续部分并传递给后端。
  • 后端协议指定:明确用HTTPS代理到后端8443端口,避免协议不兼容。
  • 缓存控制:通过响应头强制客户端不缓存资源,彻底解决304问题。

三、25个前端服务的批量配置方案

推荐在同一个Ingress资源中添加多路径规则(减少资源冗余),示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Forwarded-Port 80;
      add_header Cache-Control "no-cache, no-store, must-revalidate";
      add_header Pragma "no-cache";
      add_header Expires "0";
  name: frontend-services-ingress
  namespace: tob # 若服务跨namespace,需拆分Ingress或配置跨namespace权限
spec:
  rules:
  - host: test.koc.gov.tr
    http:
      paths:
      # tob-frontend服务
      - path: /tob(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: tob-frontend
            port:
              number: 8443
      # sso服务
      - path: /sso(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: sso-service
            port:
              number: 8443
      # 剩余23个服务依次添加以下格式规则
      - path: /<service-path>(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: <service-name>
            port:
              number: <service-port>

注意事项

  • 若服务分布在不同namespace,需为每个namespace创建独立Ingress,或配置RBAC权限允许Ingress跨namespace引用服务。
  • 若后端为HTTP服务,需移除nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"注解,并调整对应端口。

四、验证与调试步骤

  1. 应用配置:kubectl apply -f <ingress-file.yaml> -n tob
  2. 检查Ingress状态:kubectl get ingress -n tob,确认ADDRESS字段已关联Ingress Controller的负载均衡地址。
  3. 查看Ingress日志:kubectl logs -n kube-system <nginx-ingress-controller-pod-name>,排查路由匹配或代理异常。
  4. 测试请求:curl -v http://test.koc.gov.tr/tob,观察响应头与状态码,确认服务正常返回内容。

内容的提问来源于stack exchange,提问作者cengizhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:15:01