RKE集群Nginx Ingress路径路由异常(304状态)求助
问题排查与解决方案
一、当前Ingress配置的核心问题
路径匹配与重写规则不匹配
开启了nginx.ingress.kubernetes.io/use-regex: "true",但path: /tob未使用正则表达式,导致仅能精确匹配/tob路径,无法覆盖/tob/xxx这类带后续路径的请求;同时rewrite-target: /会直接丢弃原路径的后续部分,导致后端服务无法获取完整请求路径。304状态码的诱因
- 前端服务缓存策略:后端服务返回的
Cache-Control等缓存头让客户端缓存了资源,后续请求直接命中本地缓存返回304。 - Ingress代理配置缺失:未明确禁用缓存,或
X-Forwarded-Port设置影响了服务端的缓存判断逻辑。
- 前端服务缓存策略:后端服务返回的
后端协议不明确
后端服务端口为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"注解,并调整对应端口。
四、验证与调试步骤
- 应用配置:
kubectl apply -f <ingress-file.yaml> -n tob - 检查Ingress状态:
kubectl get ingress -n tob,确认ADDRESS字段已关联Ingress Controller的负载均衡地址。 - 查看Ingress日志:
kubectl logs -n kube-system <nginx-ingress-controller-pod-name>,排查路由匹配或代理异常。 - 测试请求:
curl -v http://test.koc.gov.tr/tob,观察响应头与状态码,确认服务正常返回内容。
内容的提问来源于stack exchange,提问作者cengizhan
相关产品推荐
相关产品推荐

