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

AKS Ingress Controller基于路径的路由规则返回404问题求助

问题分析与解决方案

问题根源

Spark UI默认以根路径/提供服务,当通过Ingress的子路径(如/service1)访问时,会触发两个关键问题导致404:

  1. 访问/service1时,Ingress将路径重写为/转发给Spark,Spark返回302重定向到/jobs/,但这个重定向未带上/service1前缀,客户端请求/jobs/会触发Ingress不存在的默认后端,导致404。
  2. 即使手动访问/service1/jobs/,Spark页面内的静态资源链接(如CSS、JS)仍指向/static/...,同样会因路径不匹配返回404。

解决方案

需要同时调整Spark服务的启动参数和Ingress配置:

1. 配置Spark服务的上下文路径

启动Spark时必须指定spark.ui.webapp.basePath参数,让Spark明确自己运行在子路径下,这样所有内部生成的链接、重定向都会自动带上该前缀。

如果用Deployment部署Spark,修改容器启动命令:

containers:
- name: spark-master
  image: bitnami/spark:latest
  command:
    - /bin/bash
    - -c
    - |
      start-master.sh --conf spark.ui.webapp.basePath=/service1

(service-2同理,将/service1替换为/service2)

2. 调整Ingress配置

为每个服务单独配置Ingress(避免规则冲突,更易维护),添加重定向修正规则:

service-1的Ingress配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spark-service1-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/use-regex: "true"
    # 修正Spark返回的重定向路径,补全子路径前缀
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_redirect ~^https://spark.company.net/(.*) https://spark.company.net/service1/$1;
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - spark.company.net
    secretName: tls-secret
  rules:
  - host: spark.company.net
    http:
      paths:
      - path: /service1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: service-1
            port:
              number: 443

service-2的Ingress配置:

将上述配置中的service1替换为service2,服务名改为service-2即可。

3. 验证步骤

  1. 应用新的Ingress配置:
kubectl apply -f spark-service1-ingress.yaml
kubectl apply -f spark-service2-ingress.yaml
  1. 重启Spark服务,确保spark.ui.webapp.basePath配置生效
  2. 访问测试:
    • 打开https://spark.company.net/service1,会自动重定向到https://spark.company.net/service1/jobs/,页面加载正常
    • 访问https://spark.company.net/service2同理,所有静态资源和链接都能正确指向带前缀的路径

补充说明

  • 核心是Spark的spark.ui.webapp.basePath配置,它能让Spark自动处理路径前缀,不需要额外传递X-Forwarded-Prefix请求头
  • 拆分Ingress是为了给每个服务单独配置重定向规则,避免不同路径的规则冲突
  • 重写规则rewrite-target: /$1会将/service1/jobs转发为/jobs,和Spark的上下文路径配合,保证请求能正确匹配服务内部路由

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:03:08