首页 > 解决方案 > 通过nginx ingress controller暴露prometheus web UI的问题

问题描述

我不知道我的案子有什么问题。我在 AKS(Azure 的 k8s)上部署了 Prometheus 服务器,并希望通过入口控制器公开 Prometheus Web UI 以进行以下配置。

我也提到了这个

https://coreos.com/operators/prometheus/docs/latest/user-guides/exposing-prometheus-and-alertmanager.html

# Prometheus
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
  namespace: monitoring
spec:
  version: v2.13.1
  replicas: 2
  retention: 1d
  serviceAccountName: prometheus
  ...
# Service
apiVersion: v1
kind: Service
metadata:
  name: prometheus-service
  namespace: monitoring
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 9090
  selector:
    app: prometheus
# Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: prometheus-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: nginx
#    nginx.ingress.kubernetes.io/ssl-redirect: "false"
#    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
# Just try another subpath make sure the nginx is work
#      - backend:
#          serviceName: aks-helloworld-one
#          servicePort: 80
#        path: /hello-world-one
      - backend:
          serviceName: prometheus-service
          servicePort: 80
        path: /prometheus

我在测试阶段添加了另一条路径,nginx 为 aks-helloworld-one 成功工作。但是,它不适用于 Prometheus 服务器,我总是得到“404 page not found”作为回报。有谁知道如何解决这个问题?

标签: nginxprometheuskubernetes-ingressazure-aks

解决方案


我想我知道问题出在哪里。其实我之前的评论是错误的:

如果它在 / 下可用,则不需要在 ingress 中进行任何重写,它应该可以立即工作。

嗯......实际上它不会有一个简单的原因。当您尝试通过入口访问 Prometheus UI 时,您使用的是<ingress ip>/prometheusURL。选择/prometheus路径会将您正确重定向到适当的后端Service

      - backend:
          serviceName: prometheus-service
          servicePort: 80
        path: /prometheus

但是出现问题是因为/prometheus路径(您需要被重定向到prometheus-service并最终重定向到其中一个Pods,由 this 公开Service)被转发到Pod提供实际内容的目标。

您会收到404 page not found错误消息,因为到达目标 Web 服务器的 http 请求正在声明/prometheus目录的内容,而不是/实际提供目录的内容。

因此,如果您将入口更改为以下内容:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: prometheus-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: prometheus-service
          servicePort: 80
        path: /

很可能一切都会按预期工作,您将获得Prometheus UI网站,而不是404 Not found.

好吧,尽管它可能有效,但它仅用于调试目的,因为没有人想使用ingress只是为了能够在根路径下公开某些内容。

以下入口定义应该可以解决您的问题(是的,在这种情况下需要重写!):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: prometheus-ingress
  namespace: monitoring
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: prometheus-service
          servicePort: 80
        path: /prometheus(/|$)(.*)

上面使用的重写将确保在到达目标之前/prometheus重写原始访问路径。/Pod


推荐阅读