Как организовать мониторинг кластера (Prometheus, Grafana)?
Краткая архитектура и компоненты
Для надёжного мониторинга Kubernetes обычно разворачивают: Prometheus (scrape + storage + recording rules), Alertmanager (уведомления), node-exporter (метрики ноды), kube-state-metrics (статус K8s-объектов), cAdvisor (через kubelet — метрики контейнеров), ServiceMonitors/PodMonitors (discovery), Grafana (дашборды) и опционально long-term storage/HA (Thanos/Cortex). Также часто подключают логирование и трэйсинг для полной картинки.
Установка (две популярные опции)
-
Prometheus Operator / kube-prometheus-stack — удобнее: CRD (Prometheus, ServiceMonitor, PrometheusRule, Alertmanager) и готовая интеграция с Grafana/Alertmanager.
-
Ручная — deploy Prometheus, настроить scrape_configs в prometheus.yml, разместить exporters и настроить Service/Endpoints.
Базовая последовательность развёртывания
-
Развернуть kube-state-metrics, node-exporter (DaemonSet) и убедиться, что у них есть Service/Endpoints.
-
Развернуть Prometheus с persistent volume и достаточной retention/ресурсами. В Operator-режиме создаёте CR Prometheus и указываете serviceMonitorSelector/podMonitorSelector.
-
Создать ServiceMonitor/PodMonitor для всех exporter’ов (node-exporter, kube-state-metrics, ingress-controller, приложения).
-
Настроить PrometheusRule для alert’ов и recording rules.
-
Развернуть Alertmanager и настроить routes/receivers.
-
Развернуть Grafana, добавить datasource → Prometheus и импортировать/сделать дашборды.
Примеры YAML (минимум)
ServiceMonitor для kube-state-metrics:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: ksm-sm
labels: { release: prometheus }
spec:
selector:
matchLabels: { k8s-app: kube-state-metrics }
endpoints:
\- port: http-metrics
interval: 30s
Recording rule + alert:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata: { name: k8s-rules }
spec:
groups:
\- name: node.rules
rules:
\- record: node:node_cpu_seconds:rate5m
expr: sum by (instance)(rate(node_cpu_seconds_total{mode!="idle"}\[5m\]))
\- alert: NodeMemoryPressure
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.15
for: 5m
labels: { severity: critical }
annotations:
summary: "Node memory available <15% on {{ $labels.instance }}"
Grafana datasource provisioning (ConfigMap):
apiVersion: v1
kind: ConfigMap
metadata: { name: grafana-datasources, labels: { grafana_datasource: "1" } }
data:
prometheus.yaml: |-
apiVersion: 1
datasources:
\- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus-operated:9090
isDefault: true
Важные настройки и практики
-
Scrape interval & retention: по умолчанию 15s, для node/ingress можно 15–30s; retention зависит от объёма и бюджета (например, 15d).
-
Relabeling: удалить лишние лейблы с высокого кардинала (pod ip, уникальные id) чтобы не взорвать TSDB.
-
Recording rules: вычислять p95/p99/агрегаты заранее — заметно снижает нагрузку на Prometheus и ускоряет дашборды/alerts.
-
Alerting: классифицируйте severity, создавайте route’ы в Alertmanager и тестируйте с for/silences`.
-
HA и long-term: для HA/ретенции используйте Thanos/Cortex (sidecar + object storage) или репликацию Prometheus (но учтите дублирование alert’ов).
-
Scale: горизонтальная шардировка targets (несколько Prometheus с разными scrape-configs) или Remote_Write в удалённое хранилище.
-
Безопасность: RBAC для доступов к endpoints; TLS для APIServer/kubelet если требуется; ограничьте доступ к Grafana/Prometheus UI через OIDC/ingress auth.
-
Кардинальность метрик: избегайте label’ов с уникальными значениями (request_id, user_id) — они создают огромный метрик-кард.
-
Мониторинг контрол-плейна: scrape apiserver, scheduler, controller-manager, etcd (экспортёры) отдельно, собрать их метрики и alert’ы.
Диагностика и поддержка
-
Настройте Alertmanager с интеграциями (Slack/Email/PagerDuty).
-
Дашборды: node (node-exporter), kube-state (deployments/pods), kubelet/cAdvisor (container usage), ingress/latency, apiserver health.
-
Тестируйте правила симуляцией проблем (создать Pending pods, создать OOM, выключить node) чтобы проверить alert’ы и runbooks.
заканчивайте внедрение поэтапно: сначала раскрывать базовую видимость (инфраструктура), затем приложения, затем тонкая настройка recording/alerts и HA.