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 при кратковременных сбоях зеркал/сети.
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