Как организовать сбор метрик с Kubernetes-кластера?

«Как организовать сбор метрик с Kubernetes-кластера?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для сбора метрик с продакшн-кластера Kubernetes я развертываю стек Prometheus + Grafana с дополнительными экспортерами. Вот как это выглядит на практике:

1. Развертывание Prometheus Stack с помощью Helm:

# Добавление репозитория и установка kube-prometheus-stack
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus prometheus-community/kube-prometheus-stack 
  --namespace monitoring 
  --create-namespace 
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false 
  --set grafana.adminPassword="$GRAFANA_PASSWORD"

Этот чарт автоматически устанавливает:

  • Prometheus Server с настроенным scrape_configs для Kubernetes SD.
  • Node Exporter на каждой ноде для сбора системных метрик (CPU, memory, disk I/O).
  • kube-state-metrics для метрик состояния объектов Kubernetes (количество подов, статусы деплойментов).
  • Grafana с предустановленными дашбордами (например, Kubernetes / Compute Resources / Cluster).

2. Конфигурация сбора метрик с кастомных приложений:

Для сбора метрик с Java-микросервиса (Spring Boot Actuator) создаю ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: myapp-metrics
  namespace: default
spec:
  selector:
    matchLabels:
      app: myapp
  endpoints:
  - port: http-metrics
    path: /actuator/prometheus
    interval: 15s

3. Визуализация и алертинг:

  • В Grafana импортирую дашборды по ID (например, 315 для детального мониторинга нод).
  • Настраиваю алерты в Prometheus через PrometheusRule:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: node-alerts
spec:
  groups:
  - name: node.rules
    rules:
    - alert: HighNodeCPU
      expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "High CPU usage on {{ $labels.instance }}"

Альтернативы и дополнения:

  • VictoriaMetrics: Использовал для долгосрочного хранения метрик (более эффективное сжатие, чем у Prometheus).
  • Loki + Promtail: Для связки логов и метрик в одном запросе в Grafana.
  • Интеграция с PagerDuty/Slack: Алерты из Alertmanager перенаправлял в инцидент-каналы.