kube-prometheus-stack: полная настройка мониторинга

Published: 2026-03-18

kube-prometheus-stack — единый Helm-чарт, который разворачивает Prometheus, Alertmanager, Grafana, node-exporter, kube-state-metrics, а также стандартный набор recording rules и дашбордов. Это типовой способ поднять наблюдаемость Kubernetes одним релизом.


HelmRelease

yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: kube-prom-stack
  namespace: monitoring
spec:
  chart:
    spec:
      chart: kube-prometheus-stack
      version: "65.x"
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
  values:
    fullnameOverride: kube-prom-stack

    prometheus:
      prometheusSpec:
        retention: 30d
        retentionSize: 40GB
        storageSpec:
          volumeClaimTemplate:
            spec:
              storageClassName: local-path
              resources:
                requests:
                  storage: 50Gi
        serviceMonitorSelectorNilUsesHelmValues: false
        podMonitorSelectorNilUsesHelmValues: false
        ruleSelectorNilUsesHelmValues: false
        resources:
          requests:
            cpu: 500m
            memory: 2Gi
          limits:
            cpu: 2000m
            memory: 4Gi

    alertmanager:
      alertmanagerSpec:
        storage:
          volumeClaimTemplate:
            spec:
              storageClassName: local-path
              resources:
                requests:
                  storage: 5Gi

    grafana:
      adminPassword: ""    # задаётся через secret
      persistence:
        enabled: true
        storageClassName: local-path
        size: 10Gi
      grafana.ini:
        server:
          root_url: https://grafana.example.com
      sidecar:
        dashboards:
          enabled: true
          searchNamespace: ALL

    nodeExporter:
      enabled: true

    kubeStateMetrics:
      enabled: true

serviceMonitorSelectorNilUsesHelmValues: false — критично. Без этого Prometheus отслеживает только ServiceMonitor в своём неймспейсе. Аналогично для podMonitorSelectorNilUsesHelmValues и ruleSelectorNilUsesHelmValues.


Пароль Grafana через secret

yamlgrafana:
  admin:
    existingSecret: grafana-admin-secret
    userKey: admin-user
    passwordKey: admin-password
bashkubectl create secret generic grafana-admin-secret \
  --from-literal=admin-user=admin \
  --from-literal=admin-password=REDACTED \
  --dry-run=client -o yaml \
  | kubeseal --cert infra.pem -o yaml \
  > fluxcd/custom/monitoring/grafana-admin-secret.yaml

ServiceMonitor для приложения

yamlapiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-service
  namespace: app
  labels:
    release: kube-prom-stack    # обязательно
spec:
  selector:
    matchLabels:
      app: my-service
  namespaceSelector:
    matchNames:
      - app
  endpoints:
    - port: http
      path: /metrics
      interval: 30s

Метка release: kube-prom-stack обязательна. Без неё Prometheus игнорирует ServiceMonitor.


Retention и настройка хранилища

При retention: 30d и retentionSize: 40GB Prometheus удаляет старые данные по достижении любого из лимитов.

Для кластера среднего размера (50 узлов, 200 подов):

  • входящий поток ~10 МБ/с
  • Snappy-сжатие (экономия ~70%)
  • итого ~7,5 ГБ/день
  • 30 дней ≈ 225 ГБ сжатых данных

50 ГБ мало для 30 дней. Уменьшите retention до 14d, увеличьте PVC или используйте remote_write в VictoriaMetrics.


Проверка работоспособности

bashkubectl port-forward -n monitoring svc/kube-prom-stack-prometheus 9090:9090
# http://localhost:9090/targets — все должны быть UP

kubectl port-forward -n monitoring svc/kube-prom-stack-alertmanager 9093:9093
# http://localhost:9093/#/status

Конфигурация Alertmanager

yamlalertmanager:
  config:
    global:
      resolve_timeout: 5m
    route:
      group_by: ['alertname', 'job']
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 12h
      receiver: 'telegram'
      routes:
        - matchers:
            - severity = "critical"
          receiver: 'telegram-critical'
    receivers:
      - name: 'telegram'
        telegram_configs:
          - bot_token: "${TELEGRAM_BOT_TOKEN}"
            chat_id: -123456789
            message: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"