RousselTMLEARNING

Observabilité

Prometheus dans le monde Kubernetes (Operator, ServiceMonitor, kube-prometheus-stack)

Superviser Kubernetes avec Prometheus : service discovery, kube-prometheus-stack, Prometheus Operator, ServiceMonitor, PodMonitor, PrometheusRule, kube-state-metrics et requêtes utiles.

1. Superviser Kubernetes : ce qu'il faut collecter #

Quatre sources de métriques.

Les sources #

SourceContenuExposé par
kube-state-metricsÉtat des objets : pods, deployments, jobs, PVC...Deployment kube-state-metrics
node-exporterCPU, RAM, disque, réseau des nœudsDaemonSet
kubelet / cAdvisorConsommation des conteneursChaque nœud (/metrics/cadvisor)
Control planeAPI server, scheduler, etcd, controller-managerComposants du cluster
Vos applicationsMétriques métier et techniquesEndpoint /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:9090

Le 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 #

Fonctionnement du Prometheus Operator
Plus besoin d'éditer 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: metrics

PrometheusRule #

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 serviceMonitorSelector
Erreur Courante : Si votre ServiceMonitor n'est pas pris en compte, vérifiez d'abord que son label release correspond au serviceMonitorSelector de l'objet Prometheus, puis que le port du Service est bien nommé.

4. Requêtes PromQL Kubernetes #

Les indispensables.

Quelques requêtes utiles #

Cibles Prometheus dans Kubernetes
Vérification rapide des cibles collectées.
# 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.1
Bonne 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.

Pour aller plus loin