Пример конфигурации модуля
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