Пример конфигурации модуля

1apiVersion: deckhouse.io/v1alpha1
2kind: ModuleConfig
3metadata:
4  name: prometheus
5spec:
6  version: 2
7  enabled: true
8  settings:
9    auth:
10      password: xxxxxx
11    retentionDays: 7
12    storageClass: rbd
13    nodeSelector:
14      node-role/monitoring: ""
15    tolerations:
16    - key: dedicated.deckhouse.io
17      operator: Equal
18      value: monitoring

Запись данных Prometheus в longterm storage

У Prometheus есть поддержка remote_write данных из локального Prometheus в отдельный longterm storage (например, VictoriaMetrics). В Deckhouse поддержка этого механизма реализована с помощью кастомного ресурса PrometheusRemoteWrite.

Для VictoriaMetrics подробную информацию о способах передачи данные в vmagent можно получить в документации VictoriaMetrics.

Пример минимального PrometheusRemoteWrite

1apiVersion: deckhouse.io/v1
2kind: PrometheusRemoteWrite
3metadata:
4  name: test-remote-write
5spec:
6  url: https://victoriametrics-test.domain.com/api/v1/write

Пример расширенного PrometheusRemoteWrite

1apiVersion: deckhouse.io/v1
2kind: PrometheusRemoteWrite
3metadata:
4  name: test-remote-write
5spec:
6  url: https://victoriametrics-test.domain.com/api/v1/write
7  basicAuth:
8    username: username
9    password: password
10  writeRelabelConfigs:
11  - sourceLabels: [__name__]
12    action: keep
13    regex: prometheus_build_.*|my_cool_app_metrics_.*
14  - sourceLabels: [__name__]
15    action: drop
16    regex: my_cool_app_metrics_with_sensitive_data

Подключение Prometheus к сторонней Grafana

У каждого ingress-nginx-controller есть сертификаты, при указании которых в качестве клиентских будет разрешено подключение к Prometheus. Все, что нужно, — создать дополнительный Ingress-ресурс.

{% alert level=”info” %} В приведенном ниже примере предполагается, что Secret example-com-tls уже существует в namespace d8-monitoring.

Имена для Ingress my-prometheus-api и Secret my-basic-auth-secret указаны для примера. Замените их на более подходящие для вас. {% endalert %}

1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4  name: my-prometheus-api
5  namespace: d8-monitoring
6  annotations:
7    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
8    nginx.ingress.kubernetes.io/auth-type: basic
9    nginx.ingress.kubernetes.io/auth-secret: my-basic-auth-secret
10    nginx.ingress.kubernetes.io/app-root: /graph
11    nginx.ingress.kubernetes.io/configuration-snippet: |
12      proxy_ssl_certificate /etc/nginx/ssl/client.crt;
13      proxy_ssl_certificate_key /etc/nginx/ssl/client.key;
14      proxy_ssl_protocols TLSv1.2;
15      proxy_ssl_session_reuse on;
16spec:
17  ingressClassName: nginx
18  rules:
19  - host: prometheus-api.example.com
20    http:
21      paths:
22      - backend:
23          service:
24            name: prometheus
25            port:
26              name: https
27        path: /
28        pathType: ImplementationSpecific
29  tls:
30  - hosts:
31    - prometheus-api.example.com
32    secretName: example-com-tls
33---
34apiVersion: v1
35kind: Secret
36metadata:
37  name: my-basic-auth-secret
38  namespace: d8-monitoring
39type: Opaque
40data:
41  # Строка basic-auth хешируется с помощью htpasswd.
42  auth: Zm9vOiRhcHIxJE9GRzNYeWJwJGNrTDBGSERBa29YWUlsSDkuY3lzVDAK  # foo:bar

Добавьте data source в Grafana:

{% alert level=”info” %} В качестве URL необходимо указать https://prometheus-api.<домен-вашего-кластера>** {% endalert %}

  • Basic-авторизация не является надежной мерой безопасности. Рекомендуется ввести дополнительные меры безопасности, например указать аннотацию nginx.ingress.kubernetes.io/whitelist-source-range.

  • Из-за необходимости создания Ingress-ресурса в системном пространстве имён подключение таким способом не рекомендуется. Deckhouse не гарантирует сохранение работоспособности данной схемы подключения в связи с его активными постоянными обновлениями.

  • Этот Ingress-ресурс может быть использован для доступа к Prometheus API не только для Grafana, но и для других интеграций, например, для федерации Prometheus.

Подключение стороннего приложения к Prometheus

Подключение к Prometheus защищено с помощью kube-rbac-proxy. Для подключения создайте ServiceAccount с необходимыми правами.

1---
2apiVersion: v1
3kind: ServiceAccount
4metadata:
5  name: app
6  namespace: default
7---
8apiVersion: rbac.authorization.k8s.io/v1
9kind: ClusterRole
10metadata:
11  name: app:prometheus-access
12rules:
13- apiGroups: ["monitoring.coreos.com"]
14  resources: ["prometheuses/http"]
15  resourceNames: ["main", "longterm"]
16  verbs: ["get"]
17---
18apiVersion: rbac.authorization.k8s.io/v1
19kind: ClusterRoleBinding
20metadata:
21  name: app:prometheus-access
22roleRef:
23  apiGroup: rbac.authorization.k8s.io
24  kind: ClusterRole
25  name: app:prometheus-access
26subjects:
27- kind: ServiceAccount
28  name: app
29  namespace: default

Выполните запрос, используя команду curl:

1apiVersion: batch/v1
2kind: Job
3metadata:
4  name: app-curl
5  namespace: default
6spec:
7  template:
8    metadata:
9      name: app-curl
10    spec:
11      serviceAccountName: app
12      containers:
13      - name: app-curl
14        image: curlimages/curl:7.69.1
15        command: ["sh", "-c"]
16        args:
17        - >-
18          curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -k -f
19          https://prometheus.d8-monitoring:9090/api/v1/query_range?query=up\&start=1584001500\&end=1584023100\&step=30
20      restartPolicy: Never
21  backoffLimit: 4

Job должен завершиться успешно.

Отправка алертов в Telegram

Alertmanager поддерживает прямую отправку алертов в Telegram.

Создайте Secret в пространстве имен d8-monitoring:

1apiVersion: v1
2kind: Secret
3metadata:
4  name: telegram-bot-secret
5  namespace: d8-monitoring
6stringData:
7  token: "562696849:AAExcuJ8H6z4pTlPuocbrXXXXXXXXXXXx"

Разверните кастомный ресурс CustomAlertManager:

1apiVersion: deckhouse.io/v1alpha1
2kind: CustomAlertmanager
3metadata:
4  name: telegram
5spec:
6  type: Internal
7  internal:
8    receivers:
9      - name: telegram
10        telegramConfigs:
11          - botToken:
12              name: telegram-bot-secret
13              key: token
14            chatID: -30490XXXXX
15    route:
16      groupBy:
17        - job
18      groupInterval: 5m
19      groupWait: 30s
20      receiver: telegram
21      repeatInterval: 12h

Поля token в Secret’е и chatID в ресурсе CustomAlertmanager необходимо поставить свои. Подробнее о Telegram API.

Пример отправки алертов в Slack с фильтром

1apiVersion: deckhouse.io/v1alpha1
2kind: CustomAlertmanager
3metadata:
4  name: slack
5spec:
6  internal:
7    receivers:
8    - name: devnull
9    - name: slack
10      slackConfigs:
11      - apiURL:
12          key: apiURL
13          name: slack-apiurl
14        channel: {{ dig .Values.werf.env .Values.slack.channel._default .Values.slack.channel }} 
15        fields:
16        - short: true
17          title: Severity
18          value: '{{`{{  .CommonLabels.severity_level }}`}}'
19        - short: true
20          title: Status
21          value: '{{`{{ .Status }}`}}'
22        - title: Summary
23          value: '{{`{{ range .Alerts }}`}}{{`{{ .Annotations.summary }}`}} {{`{{ end }}`}}'
24        - title: Description
25          value: '{{`{{ range .Alerts }}`}}{{`{{ .Annotations.description }}`}} {{`{{ end }}`}}'
26        - title: Labels
27          value: '{{`{{ range .Alerts }}`}} {{`{{ range .Labels.SortedPairs }}`}}{{`{{ printf "%s:
28            %s\n" .Name .Value }}`}}{{`{{ end }}`}}{{`{{ end }}`}}'
29        - title: Links
30          value: '{{`{{ (index .Alerts 0).GeneratorURL }}`}}'
31        title: '{{`{{ .CommonLabels.alertname }}`}}'
32    route:
33      groupBy:
34      - '...'  
35      receiver: devnull
36      routes:
37        - matchers:
38          - matchType: =~
39            name: severity_level
40            value: "^[4-9]$"
41          receiver: slack
42      repeatInterval: 12h
43  type: Internal

Пример отправки алертов в Opsgenie

1- name: opsgenie
2        opsgenieConfigs:
3          - apiKey:
4              key: data
5              name: opsgenie
6            description: |
7              {{ range .Alerts }}{{ .Annotations.summary }} {{ end }}
8              {{ range .Alerts }}{{ .Annotations.description }} {{ end }}
9            message: '{{ .CommonLabels.alertname }}'
10            priority: P1
11            responders:
12              - id: team_id
13                type: team