K8s Ingress重定向至集群外VM HTTP应用失败问题排查
解决方案:处理K8s Ingress后端重定向路径缺失前缀的问题
问题根源
你的后端Web应用(运行在VM的5601端口)不知道自身是通过/opensearch路径对外提供服务的,因此返回重定向(比如到/app/login)时,只会返回不带前缀的路径。而你的Ingress仅配置了/opensearch路径的转发规则,导致/app/login无法匹配到后端服务,返回404。
配置方案
1. 修正Endpoints配置(必填)
你提供的Endpoints配置缺少metadata.name字段,该字段必须与对应Service的名称完全一致,否则Service无法关联到Endpoints。假设你的Service名称是opensearch,修正后的Endpoints如下:
apiVersion: v1 kind: Endpoints metadata: name: opensearch # 与Service名称保持一致 subsets: - addresses: - ip: 10.128.0.18 ports: - name: opensearch port: 5601 protocol: TCP
2. 更新Ingress配置,添加重写与重定向修正注解
通过Nginx Ingress的注解,可实现两个核心功能:
- 将
/opensearch前缀的请求转发到后端应用的根路径 - 修改后端返回的重定向Location头,自动添加
/opensearch前缀
完整Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: opensearch-ingress annotations: # 启用正则路径匹配 nginx.ingress.kubernetes.io/use-regex: "true" # 将/opensearch后的路径转发到后端对应路径(比如/opensearch/app/login → /app/login) nginx.ingress.kubernetes.io/rewrite-target: /$2 # 修改后端返回的重定向Location,把/app/开头的路径替换为/opensearch/app/ nginx.ingress.kubernetes.io/proxy-redirect: "http://app.kohls.com/app/ http://app.kohls.com/opensearch/app/" # 若后端返回相对路径重定向,自动添加路径前缀 nginx.ingress.kubernetes.io/add-base-url: "true" spec: rules: - host: app.kohls.com http: paths: - path: /opensearch(/|$)(.*) pathType: ImplementationSpecific backend: service: name: opensearch port: name: opensearch
3. 更彻底的方案:配置后端应用的上下文路径
如果你的Web应用(看起来是OpenSearch Dashboards)支持配置上下文路径,直接在应用层面设置server.basePath: "/opensearch"是最优解。这样应用自身生成的所有链接、重定向都会自动带上/opensearch前缀,无需Ingress做额外修改。
以OpenSearch Dashboards为例,修改opensearch_dashboards.yml:
server.basePath: "/opensearch" server.rewriteBasePath: true
验证步骤
- 应用修正后的Endpoints、Ingress配置
- 访问
app.kohls.com/opensearch,观察重定向是否跳转到app.kohls.com/opensearch/app/login - 登录后检查页面内的所有链接是否都带有
/opensearch前缀,确保后续请求正常转发
内容的提问来源于stack exchange,提问作者Nagesh Jayaram
相关产品推荐
相关产品推荐

