You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes配置Ingress路由实现Prometheus带路径访问失败求助

解决Prometheus通过Ingress子路径访问的问题

嘿,我来帮你搞定这个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

火山引擎 最新活动