K8s中通过Ingress路径/alertmanager访问Alertmanager报404求助
解决Alertmanager通过Nginx Ingress前缀路径访问404的问题
问题根源
Alertmanager默认以根路径/提供服务,当Nginx Ingress将/alertmanager前缀的请求转发给它时,Alertmanager会收到包含/alertmanager的完整路径(比如/alertmanager/#/alerts),但它本身没有配置对应这个前缀的路由,因此返回404错误。
解决方案
有两种可行的解决方式,根据你的场景选择:
方案一:修改Ingress配置(无需重启Alertmanager)
通过Nginx Ingress的路径重写功能,将请求路径中的/alertmanager前缀去掉后再转发给Alertmanager服务。修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin' # 添加路径重写相关注解 nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" spec: tls: - hosts: - example.com secretName: tls-secret rules: - host: example.com http: paths: - backend: service: name: alertmanager-service port: number: 80 path: /alertmanager(/|$)(.*) pathType: ImplementationSpecific
配置说明:
nginx.ingress.kubernetes.io/use-regex: "true":开启正则匹配,让重写规则生效nginx.ingress.kubernetes.io/rewrite-target: /$2:将匹配到的路径/alertmanager(/|$)(.*)中的第二组捕获内容(即/alertmanager之后的部分)重写为根路径下的请求,比如/alertmanager/alerts会被转发为/alerts给Alertmanager- 路径改为
/alertmanager(/|$)(.*):用正则匹配所有以/alertmanager开头的请求,包括/alertmanager本身和后续子路径
方案二:通过Helm配置Alertmanager的路由前缀(需要重新部署)
直接修改Prometheus-Grafana栈的Helm配置,让Alertmanager以/alertmanager作为根路径提供服务:
- 在Helm values文件中添加或修改以下配置:
alertmanager: routePrefix: /alertmanager
- 执行Helm升级命令重新部署:
helm upgrade prometheus-grafana prometheus-community/kube-prometheus-stack -f your-values.yaml --version 43.3.0
- 保持原有Ingress配置不变(路径为
/alertmanager,pathType为Prefix)即可正常访问
验证
修改配置后,访问https://example.com/alertmanager,检查Alertmanager界面是否正常加载,子路径(如告警列表)是否能正常跳转。
内容的提问来源于stack exchange,提问作者Chanikya_Sai
相关产品推荐
相关产品推荐

