Kubernetes配置Ingress路由实现Prometheus带路径访问失败求助
嘿,我来帮你搞定这个Prometheus Ingress子路径访问的问题!先分析下你两次尝试踩的坑,再给你靠谱的解决方案:
为什么两次尝试都失败了?
第一次尝试(app-root注解)
你用了nginx.ingress.kubernetes.io/app-root: /prometheus,这个注解的作用是把访问/的请求重定向到/prometheus,但Prometheus默认是把/作为根路径提供服务的,它本身并没有配置/prometheus这个路径的资源,所以重定向后自然返回404。而且就算能访问,Prometheus页面里的所有静态资源(比如CSS、JS)都是基于/的链接,会直接请求my.prom.com:9090/css/xxx,同样会404。
第二次尝试(rewrite-target注解)
你配置的路径规则/prometheus(/|$)(.*)配合rewrite-target: /$2,会把/prometheus重写到/,/prometheus/graph重写到/graph。这时候Prometheus确实能收到请求,但Prometheus默认会把页面跳转到/graph,跳转时它会用自己的根路径生成URL,也就是直接跳转到my.prom.com:9090/graph,而你的Ingress只匹配/prometheus开头的路径,所以这个跳转后的URL就触发了404。
正确的解决方案
要让Prometheus通过/prometheus子路径正常访问,需要同时修改Prometheus的启动参数和Ingress规则:
1. 修改Prometheus Deployment,设置路径前缀
你需要给Prometheus添加两个启动参数,让它知道自己是在子路径下运行的:
# 修改你的Prometheus Deployment的spec.template.spec.containers.args部分 args: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus - --web.console.libraries=/etc/prometheus/console_libraries - --web.console.templates=/etc/prometheus/consoles # 添加以下两个参数 - --web.route-prefix=/prometheus # 内部服务的路径前缀 - --web.external-url=http://my.prom.com:9090/prometheus # 外部访问的完整URL
--web.route-prefix:告诉Prometheus内部用/prometheus作为所有资源的路径前缀--web.external-url:告诉Prometheus生成外部链接时使用这个完整URL,这样页面里的所有跳转、静态资源链接都会带上/prometheus前缀,不会跳到根路径
修改后重启Prometheus Deployment:
kubectl rollout restart deployment prometheus-deployment -n default
2. 配置正确的Ingrewrite规则
现在用rewrite-target把/prometheus/xxx的请求转发到Prometheus的/xxx路径:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 name: prometheus-ingress namespace: default spec: rules: - host: my.prom.com http: paths: - backend: serviceName: prometheus-svc servicePort: 9090 path: /prometheus/(.*)
这个规则会把所有/prometheus/开头的请求,去掉/prometheus前缀后转发给Prometheus服务,比如:
my.prom.com:9090/prometheus→ 匹配后转发到/(因为$1为空)my.prom.com:9090/prometheus/graph→ 转发到/graph
应用这个Ingress配置:
kubectl apply -f your-ingress-file.yaml
3. 验证访问
现在访问http://my.prom.com:9090/prometheus,应该能正常打开Prometheus页面,而且页面跳转(比如点击Graph)后,地址栏会显示http://my.prom.com:9090/prometheus/graph,不会跳转到根路径,也就不会出现404了。
内容的提问来源于stack exchange,提问作者ImranRazaKhan




