Проблема с выставлением веб-интерфейса Prometheus через nginx входной контроллер - PullRequest
0 голосов
/ 03 августа 2020

Понятия не имею, в чем проблема в моем случае. Я развертываю сервер Prometheus на AKS (Azure k8s) и хочу открыть веб-интерфейс Prometheus через контроллер входящего трафика для следующей конфигурации.

И я также ссылаюсь на это

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 страница не найдена». Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 августа 2020

Думаю, я знаю, в чем проблема. На самом деле мой предыдущий комментарий был неправильным:

Если он доступен в /, вам не нужно никаких перезаписей в вашем входящем потоке, и он должен работать сразу.

Хорошо. .. на самом деле этого не произойдет по одной простой причине. Когда вы пытаетесь получить доступ к пользовательскому интерфейсу Prometheus через вход, вы используете URL-адрес <ingress ip>/prometheus. Выбор пути /prometheus правильно перенаправляет вас на соответствующий бэкэнд Service:

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

Но проблема возникает из-за того, что путь /prometheus (который вам нужно перенаправить на prometheus-service и, в конечном итоге, один из Pods, представленных этим Service), пересылается на целевую Pod, обслуживающую фактическое содержимое.

Вы получаете сообщение об ошибке 404 page not found, потому что 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 , чтобы получить доступ к чему-то по пути root.

Следующее определение входа должно решить вашу проблему (Да, rewr В этом сценарии необходимы элементы !):

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(/|$)(.*)

Rewrite , который использовался выше, гарантирует, что исходный путь доступа /prometheus будет перезаписан на / до достижения цель Pod.

0 голосов
/ 03 августа 2020

Я думаю, проблема связана с вашим целевым объектом перезаписи и путем. Можете ли вы попробовать использовать субдомен, а не путь для подтверждения? У меня есть следующий Prometheus Ingress, работающий над субдоменом

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/force-ssl-redirect: "true"
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx-ingress
  name: prometheus-monitoring
  namespace: monitoring
spec:
  backend:
    serviceName: prometheus
    servicePort: 9090   #As my service is listening on 9090
  rules:
  - host: prometheus-monitoring.DOMAIN
    http:
      paths:
      - backend:
          serviceName: prometheus
          servicePort: 9090   #As my service is listening on 9090
        path: /

И ниже мой манифест службы

apiVersion: v1
kind: Service
metadata:
  labels:
    app: prometheus
    chart: prometheus-operator-5.11.0
    heritage: Tiller
  name: prometheus
  namespace: monitoring
spec:
  ports:
  - name: web
    port: 9090
    protocol: TCP
    targetPort: 9090
  selector:
    app: prometheus
    prometheus: k8s
  sessionAffinity: None
  type: ClusterIP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...