Как решить Prometheus карту Ingres / Сервис карт? - PullRequest
2 голосов
/ 14 февраля 2020

Только что установили стабильную / прометейную диаграмму с указанными ниже значениями, и я могу получить доступ к веб-интерфейсу сервера из модулей, но не из веб-браузера хоста.

My values.yaml :

alertmanager:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - localhost/alerts

server:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - localhost/prom

pushgateway:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - localhost/push

Я использую nginx Вход и входы создаются, но по какой-то неизвестной причине он не отображается на службу.

Некоторые данные:

Я могу получить доступ к серверу из входных модулей (также всех остальных) через имена по умолчанию и имена служб dns:

kubectl exec -it nginx-ingress-controller-5cb489cd48-t4dgv -- sh
/etc/nginx $ curl prometheus-server.default.svc.cluster.local
<a href="/graph">Found</a>

/etc/nginx $ curl prometheus-server
<a href="/graph">Found</a>

Список активных входов, созданных диаграммой:

kubectl get ingress
NAME                      HOSTS       ADDRESS     PORTS   AGE
nginx-ingress             localhost   localhost   80      37h
prometheus-alertmanager   localhost   localhost   80      43m
prometheus-pushgateway    localhost   localhost   80      43m
prometheus-server         localhost   localhost   80      43m

Список активных сервисных ресурсов:

kubectl get svc
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kubernetes                      ClusterIP      10.96.0.1        <none>        443/TCP                      37h
nginx-deployment                ClusterIP      10.100.1.167     <none>        80/TCP                       37h
nginx-ingress-controller        LoadBalancer   10.109.57.131    localhost     80:32382/TCP,443:30669/TCP   36h
nginx-ingress-default-backend   ClusterIP      10.107.91.35     <none>        80/TCP                       36h
php-deployment                  ClusterIP      10.105.73.26     <none>        9000/TCP                     37h
prometheus-alertmanager         ClusterIP      10.97.89.149     <none>        80/TCP                       44m
prometheus-kube-state-metrics   ClusterIP      None             <none>        80/TCP,81/TCP                44m
prometheus-node-exporter        ClusterIP      None             <none>        9100/TCP                     44m
prometheus-pushgateway          ClusterIP      10.105.81.111    <none>        9091/TCP                     44m
prometheus-server               ClusterIP      10.108.225.187   <none>        80/TCP                       44m

С другой стороны, если я объявляю субдомен входным хостом, Прометей становится доступным:

alertmanager:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - alerts.localhost

server:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - prom.localhost

pushgateway:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - push.localhost

Я делаю что-то не так или есть какая-то проблема с этим? Есть предложения?

Заранее спасибо!

Версия Helm и Kubernetes: Helm 3.0.3 / Kubernetes 1.15.5 (Docker для Ma c, MacOS Catalina)

1 Ответ

3 голосов
/ 18 февраля 2020

Я воспроизвел ваш сценарий и, запустив несколько тестов, понял, что это не сработает так, как вы хотите, чтобы он работал. Это не правильный способ реализовать это.

Давайте немного углубимся в это.

Вы можете добавить nginx.ingress.kubernetes.io/rewrite-target в свои входы, как в этом примере:

$ kubectl get ingresses. myprom-prometheus-pushgateway -oyaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  creationTimestamp: "2020-02-18T09:51:32Z"
  generation: 1
  labels:
    app: prometheus
    chart: prometheus-10.4.0
    component: pushgateway
    heritage: Helm
    release: myprom
  name: myprom-prometheus-pushgateway
  namespace: default
  resourceVersion: "3239"
  selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/myprom-prometheus-pushgateway
  uid: 499372f4-52b1-4b37-982c-b52e70657d37
spec:
  rules:
  - host: localhost
    http:
      paths:
      - backend:
          serviceName: myprom-prometheus-pushgateway
          servicePort: 9091
        path: /push
status:
  loadBalancer:
    ingress:
    - ip: 192.168.39.251

После добавления этого вы будете иметь возможность получить доступ, как вы предполагали. К сожалению, после этого вы столкнетесь с новой проблемой. Если мы проверим вывод html из команды curl, то увидим следующее:

<!DOCTYPE html>

<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="robots" content="noindex,nofollow">
    <title>Prometheus Pushgateway</title>

    <link rel="shortcut icon" href="/static/favicon.ico?v=793293bdadd51fdaca69de5bb25637b0f93b656b">

    <script src="/static/jquery-3.4.1.min.js?v=793293bdadd51fdaca69de5bb25637b0f93b656b"></script>
    <script src="/static/bootstrap-4.3.1-dist/js/bootstrap.min.js?v=793293bdadd51fdaca69de5bb25637b0f93b656b"></script>
    <script src="/static/functions.js?v=793293bdadd51fdaca69de5bb25637b0f93b656b"></script>

    <link type="text/css" rel="stylesheet" href="/static/bootstrap-4.3.1-dist/css/bootstrap.min.css?v=793293bdadd51fdaca69de5bb25637b0f93b656b">
    <link type="text/css" rel="stylesheet" href="/static/prometheus.css?v=793293bdadd51fdaca69de5bb25637b0f93b656b">
    <link type="text/css" rel="stylesheet" href="/static/bootstrap4-glyphicons/css/bootstrap-glyphicons.min.css?v=793293bdadd51fdaca69de5bb25637b0f93b656b">
  </head>

Как видно, у нас есть, например, /static/jquery-3.4.1.min.js, поэтому он будет перенаправлять ваш браузер на другой расположение. Проблема в том, что у вас нет этого места.

Вот почему я предлагаю вам избегать использования пути и придерживаться вашего вторичного решения, которое включает использование субдомена.

alertmanager:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - alerts.localhost

server:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - prom.localhost

pushgateway:
  ingress:
    enabled: true
    annotations:
      kubernetes.io/ingress.class: nginx
    hosts:
      - push.localhost
...