Prometheus-operator (на текущий момент проект называется kube-prometheus-stack) позволяет из коробки получить базово настроенный мониторинг кластера kubernetes на основе популярной связки prometheus+grafana.
К сожалению, для решения реальных задач настроек по умолчанию недостаточно, ведь может понадобиться подключать к мониторингу дополнительные объекты, создавать кастомные уведомления, настраивать отправку уведомлений в мессенджер. Рассмотрим пример базовой конфигурации prometheus-operator, позволяющей решать эти задачи.
Создаем папку prometheus-operator, которая будет содержать наши кастомные values-prod.yaml для helm-чарта и папку с манифестами telegram-alertmanager, решения, используемого в качестве “посредника” для отправки алертов в telegram.
Нужна помощь? Настройки grafana, prometheus мы осуществляем в рамках услуги DevOps-аутсорсинг. Также возможны разовые проектные работы.
Содержимое папки telegram-alertmanager. Манифест Telegram-alertmanager.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: telegram-alertmanager
namespace: prometheus-operator
labels:
app: telegram
spec:
template:
metadata:
name: telegram-alertmanager
labels:
app: telegram
spec:
containers:
- name: telegram-alertmanager
image: janwh/alertmanager-telegram
ports:
- containerPort: 8080
env:
- name: TELEGRAM_CHAT_ID
value: "-5842051ХХ"
- name: TELEGRAM_TOKEN
value: "1457321396:AAGB8bUYwY8yGZchAiitrHOpUYb_7YuХХХХ"
replicas: 1
selector:
matchLabels:
app: telegram
В указанном выше манифесте необходимо поменять параметры namespace, telegram_chat_id и telegram_token, указав свои значения.
Манифест service-telegram.yaml:
apiVersion: v1
kind: Service
metadata:
labels:
app: telegram
name: telegram-alertmanager
namespace: prometheus-operator
spec:
type: ClusterIP
selector:
app: telegram
ports:
- protocol: TCP
port: 8080
Создадим yaml-файл со значениями параметров нашего prometheus-operatora:
additionalPrometheusRules:
- name: my-rule-file
groups:
- name: test
rules:
- alert: HaproxyServerDown
expr: haproxy_server_up != 0
for: 0m
labels:
severity: critical
annotations:
summary: HAProxy server down (instance {{ $labels.instance }})
# description: HAProxy server is downn VALUE = {{ $value }}n LABELS: { { $labels } }
- alert: NodeNetworkInterfaceFlapping
expr: changes(node_network_up{device!~"veth.+",job="node-exporter"}[2m])> 2
for: 2m
labels:
severity: warning
annotations:
message: Network interface "{{ $labels.device }}" changing it's up status often on node-exporter {{ $labels.namespace }}/{{ $labels.pod }}"
alertmanager:
config:
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'instance', 'job']
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receiver: 'null'
routes:
- match:
alertname: Watchdog
receiver: 'telegram'
continue: true
- match_re:
severity: ^(none|warning|critical)$
receiver: 'telegram'
receivers:
- name: 'telegram'
webhook_configs:
- url: 'http://telegram-alertmanager:8080/alerts'
send_resolved: true
- name: 'null'
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
external-dns.alpha.kubernetes.io/target: "monitoring.dom"
hosts:
- alertmanager.dom
paths:
- /
grafana:
enabled: true
namespaceOverride: ""
defaultDashboardsEnabled: true
adminPassword: prom-operator
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
external-dns.alpha.kubernetes.io/target: "monitoring.dom"
hosts:
- grafana.dom
prometheus:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
external-dns.alpha.kubernetes.io/target: "monitoring.dom"
hosts:
- prometheus.dom
prometheusSpec:
additionalScrapeConfigs:
- job_name: 'linux vm'
static_configs:
- targets: [ '172.28.7.139:9100' ]
- job_name: 'win-exporter'
static_configs:
- targets: [ '172.28.7.128:9182' ]
- job_name: 'rabbit'
static_configs:
- targets: [ '172.28.7.139:9419' ]
В разделе additionalPrometheusRules описанного выше файла указываем необходимые кастомные алерты, в разделе alertmanager описываем получателя наших алертов, в grafana. Указываем пароль админа и адрес нашего экземпляра grafana, в PrometheusSpec указываем объекты, которые необходимо мониторить нашей связкой prometheus+grafana.
Данный пример лишь один из возможных вариантов базовой настройки, позволяет получить базовое понимание параметризации helm-чарта prometheus-operatora; на его основе возможно быстро оптимизировать параметры под нужды своей инфраструктуры.
Запустим установку в кластер telegram-alertmanager:
kubectl apply -f telegram-alertmanager/.
Запустим установку prometheus-operator:
helm repo add stable https://charts.helm.sh/stable helm repo update helm upgrade -i prometheus-operator stable/prometheus-operator --atomic --namespace prometheus-operator --values values-prod.yaml
После запуска всех сущностей в кластере kubernetes, получили решение, позволяющие гибко оптимизировать параметры стека prometheus+grafana и получать в мессенджер информацию об уведомлениях (алертах).
