Files
K3S/addons/prometheus-stack
Sergey Antropoff ed44d6418e Molecule и CI: единая схема тестов для аддонов и удобные параллельные прогоны
Makefile
- Уникальные имена контейнеров на каждый вызов make (ANSIBLE_RUN_ID); переопределение
  через ANSIBLE_CONTAINER_NAME / MOLECULE_CONTAINER_NAME; отдельное имя для
  Molecule, чтобы k3s-ansible и molecule не конфликтовали.
- Старые цели molecule-prometheus и molecule-istio переведены на molecule-addon
  (prometheus-stack, istio); добавлены явные molecule-addon-prometheus-stack и
  molecule-addon-istio; в molecule-addon-all включены prometheus-stack и istio
  (полный набор аддонов), скорректированы подписи.
- Phony-таргет dashboard (без внесения кода в dashboard/ в этот коммит).

Сценарии Molecule (converge/verify) — десятки аддонов
- Добавлены/выровнены переменные и шаблоны под текущие роли (harbor, hysteria2,
  ingress-*, jenkins, mediaserver, netbird, nextcloud, splitgw, vault,
  vaultwarden и др.).
- Helm/файлы на хост: delegate_to: localhost, run_once где уместно
  (technitium-dns, yandex-dns-controller); verify на localhost для
  file-based проверок.
- Уточнения проверок: metrics-server, minio, promtail, pushgateway, velero
  (bool из фактов/строк), splitgw (JSON, поиск портов/DNS-правил в структуре).
- В meta ролей: prometheus_stack + namespace, istio + namespace; у istio
  согласованы converge/verify (в т.ч. метрики, ослаблены жёсткие assert под
  шаблоны Kiali).
- csi-nfs: комментарий к volume_binding_mode (Immediate / WaitForFirstConsumer).

Инфраструктура
- .gitignore: каталог dashboard/ (локальная копия не в репозитории).
- docker-compose: убрано фиксированное container_name для параллельных
  ; TZ по умолчанию Europe/Moscow.
- roles/k3s/tasks/prereqs.yml: повторные попытки update_cache и apt install
  при кратковременных сбоях зеркал/сети.
2026-04-28 01:16:05 +03:00
..
2026-04-24 21:01:26 +03:00

kube-prometheus-stack

Полный monitoring-стек: Prometheus, Grafana, Alertmanager, node-exporter, kube-state-metrics. Все аддоны проекта автоматически создают ServiceMonitor при включённом prometheus-stack.

Быстрый старт

# group_vars/all/addons.yml
addon_prometheus_stack: true

Секреты в vault.yml:

vault_grafana_user: "admin"
vault_grafana_password: "secure-password"
make addon-prometheus-stack

Параметры

Переменная Умолч. Описание
prometheus_retention_days 7 Срок хранения метрик
prometheus_storage_size 10Gi PVC Prometheus
grafana_storage_size 5Gi PVC Grafana
prometheus_alertmanager_enabled true Alertmanager
prometheus_grafana_ingress_enabled false Grafana через Ingress

Доступ к Grafana

По умолчанию — NodePort 32000:

http://192.168.1.10:32000

Через Ingress:

prometheus_grafana_ingress_enabled: true
prometheus_grafana_ingress_host: "grafana.example.com"

Предустановленные дашборды

  • Kubernetes / Cluster Overview — ресурсы кластера
  • Node Exporter Full — метрики нод
  • Pod Monitoring — метрики подов
  • Ingress Nginx — HTTP метрики (при addon_ingress_nginx: true)

Добавить Grafana дашборд через ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-dashboard
  namespace: monitoring
  labels:
    grafana_dashboard: "1"
data:
  my-dashboard.json: |
    {
      "title": "My App",
      "panels": [...]
    }

ServiceMonitor — добавить своё приложение

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app
  namespace: my-app
  labels:
    release: prom    # совпадает с prometheus_stack_release_name
spec:
  selector:
    matchLabels:
      app: my-app
  endpoints:
    - port: metrics
      interval: 30s
      path: /metrics

PrometheusRule — создать алерт

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: my-app-alerts
  namespace: my-app
  labels:
    release: prom
spec:
  groups:
    - name: my-app
      rules:
        - alert: MyAppDown
          expr: up{job="my-app"} == 0
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "My App is down"
            description: "{{ $labels.instance }} has been down for more than 5 minutes."

Alertmanager — настроить уведомления

# В values Prometheus stack (через JCasC/ConfigMap):
alertmanager:
  config:
    route:
      receiver: slack
    receivers:
      - name: slack
        slack_configs:
          - api_url: "https://hooks.slack.com/services/..."
            channel: "#alerts"
            text: "{{ range .Alerts }}{{ .Annotations.description }}{{ end }}"

PromQL примеры

# CPU usage по нодам
100 - (avg by(node) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Memory usage
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# HTTP error rate ingress
sum(rate(nginx_ingress_controller_requests{status=~"5.."}[5m])) by (ingress)

# Pod restarts
increase(kube_pod_container_status_restarts_total[1h]) > 0