1. Superviser Kubernetes : ce qu'il faut collecter #
Quatre sources de métriques.
Les sources #
| Source | Contenu | Exposé par |
|---|---|---|
| kube-state-metrics | État des objets : pods, deployments, jobs, PVC... | Deployment kube-state-metrics |
| node-exporter | CPU, RAM, disque, réseau des nœuds | DaemonSet |
| kubelet / cAdvisor | Consommation des conteneurs | Chaque nœud (/metrics/cadvisor) |
| Control plane | API server, scheduler, etcd, controller-manager | Composants du cluster |
| Vos applications | Métriques métier et techniques | Endpoint /metrics |
2. Installer kube-prometheus-stack #
Tout-en-un avec Helm.
Installation #
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install monitoring prometheus-community/kube-prometheus-stack \
-n monitoring --create-namespace \
--set grafana.adminPassword=ChangeMe! \
--set prometheus.prometheusSpec.retention=15d \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
kubectl -n monitoring get pods
kubectl -n monitoring port-forward svc/monitoring-grafana 3000:80
kubectl -n monitoring port-forward svc/monitoring-kube-prometheus-prometheus 9090:9090Le chart installe l'opérateur, Prometheus, Alertmanager, Grafana avec des dashboards Kubernetes prêts à l'emploi, node-exporter, kube-state-metrics et un jeu de règles d'alerte standard.
3. Les CRD de l'Operator #
Déclarer ce que l'on veut superviser.
ServiceMonitor et PodMonitor #
prometheus.yml : on déclare des objets Kubernetes.# Application exposant /metrics sur le port nommé "http-metrics"
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mon-api
namespace: monitoring
labels: { release: monitoring }
spec:
namespaceSelector: { matchNames: [production] }
selector:
matchLabels: { app: mon-api }
endpoints:
- port: http-metrics
path: /metrics
interval: 30s# Sans Service : cibler directement les pods
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata: { name: workers, namespace: monitoring, labels: { release: monitoring } }
spec:
namespaceSelector: { matchNames: [production] }
selector: { matchLabels: { app: worker } }
podMetricsEndpoints:
- port: metricsPrometheusRule #
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata: { name: mon-api-alertes, namespace: monitoring, labels: { release: monitoring } }
spec:
groups:
- name: mon-api
rules:
- alert: ApiHighErrorRate
expr: sum(rate(http_requests_total{app="mon-api",status=~"5.."}[5m])) / sum(rate(http_requests_total{app="mon-api"}[5m])) > 0.05
for: 10m
labels: { severity: critical }
annotations: { summary: "Plus de 5 % d'erreurs sur mon-api" }kubectl get servicemonitors,podmonitors,prometheusrules -A
kubectl -n monitoring get prometheus -o yaml | grep -A3 serviceMonitorSelectorErreur Courante : Si votreServiceMonitorn'est pas pris en compte, vérifiez d'abord que son labelreleasecorrespond auserviceMonitorSelectorde l'objetPrometheus, puis que le port du Service est bien nommé.
4. Requêtes PromQL Kubernetes #
Les indispensables.
Quelques requêtes utiles #
# Pods qui redémarrent
increase(kube_pod_container_status_restarts_total[1h]) > 3
# Pods non prêts
kube_pod_status_ready{condition="false"} == 1
# CPU par namespace (cœurs)
sum by (namespace) (rate(container_cpu_usage_seconds_total{container!=""}[5m]))
# Mémoire utilisée / demandée
sum by (pod) (container_memory_working_set_bytes{container!=""})
/ sum by (pod) (kube_pod_container_resource_requests{resource="memory"})
# Réplicas indisponibles
kube_deployment_status_replicas_unavailable > 0
# PVC bientôt pleins
kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes < 0.1Bonne Pratique : Pour de grands clusters, déléguez le stockage long terme à Mimir/Thanos avec remoteWrite et réduisez la rétention locale de Prometheus.