Introduction
La surveillance et les alertes des espaces de noms Kubernetes sont essentielles pour maintenir la santé et les performances des clusters multi-locataires. Ce guide propose une approche pratique et concrète pour les développeurs, les consultants DevOps et les équipes techniques de startups. À la fin de votre lecture, vous serez en mesure d'observer le comportement des espaces de noms, de collecter des métriques pertinentes, de déclencher des alertes actionnables, de créer des tableaux de bord et de répondre aux incidents avec confiance. Nous mettons l'accent sur la sécurité opérationnelle : observer avant de modifier, limiter le rayon d'impact, éviter d'exposer des secrets, vérifier chaque changement et documenter les étapes de récupération.
Nous aborderons l'inventaire des versions et de l'environnement, les chemins de configuration sécurisés, la vérification et les diagnostics, les modes de défaillance et la récupération, une liste de contrôle opérationnelle et les pièges courants. Chaque section inclut des commandes concrètes, les sorties attendues et les décisions de récupération. Tout au long du guide, nous utiliserons un espace de noms d'exemple nommé payments exécutant un déploiement web et un statefulset Redis.
Inventaire des versions et de l'environnement
Avant d'apporter des modifications, établissez une base de référence de votre cluster et des composants impliqués. Cet inventaire vous aide à comprendre ce avec quoi vous travaillez et garantit la compatibilité.
Commencez par vérifier les versions de votre client et de votre serveur Kubernetes :
kubectl version --short
Sortie attendue (tronquée) :
Client Version: v1.25.3
Server Version: v1.24.6
Notez que l'écart de version mineure est acceptable mais doit être documenté. Ensuite, identifiez tous les espaces de noms :
kubectl get namespaces
Sortie attendue :
NAME STATUS AGE
default Active 46d
kube-system Active 46d
kube-public Active 46d
kube-node-lease Active 46d
payments Active 12d
Concentrez-vous sur l'espace de noms payments. Listez ses ressources :
kubectl get all -n payments
La sortie attendue montre les déploiements, les pods, les services et les statefulsets. Vérifiez l'état du déploiement :
kubectl rollout status deployment/web -n payments
Sortie attendue : deployment "web" successfully rolled out.
Pour les détails de planification et les événements, décrivez un pod :
kubectl describe pod <nom-du-pod> -n payments
Cette commande révèle les demandes de ressources, les limites, l'affectation du nœud et les événements récents. Utilisez kubectl logs <nom-du-pod> --previous -n payments pour inspecter les boucles de crash. Ces commandes en lecture seule établissent une base de référence sans rien modifier. Enregistrez l'état actuel et les horodatages avant toute intervention.
Lorsque vous devez modifier quelque chose, gardez le changement petit. Par exemple, si vous devez ajuster les limites de ressources, appliquez un manifeste à la fois et vérifiez avec kubectl get pods -n payments et kubectl describe ensuite.
Chemin de configuration sécurisé
La configuration de la surveillance nécessite une attention particulière pour éviter d'impacter les charges de travail. Nous allons créer un compte de service dédié pour la surveillance, appliquer des règles RBAC pour limiter les autorisations à l'espace de noms payments et déployer un agent de surveillance avec des privilèges minimaux.
Tout d'abord, créez le compte de service :
apiVersion: v1
kind: ServiceAccount
metadata:
name: monitoring-sa
namespace: payments
Appliquez-le :
kubectl apply -f monitoring-sa.yaml
Ensuite, créez un rôle qui autorise la lecture des pods, des services et des endpoints :
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: monitoring-role
namespace: payments
rules:
- apiGroups: [""]
resources: ["pods", "services", "endpoints"]
verbs: ["get", "list", "watch"]
Appliquez et liez le rôle au compte de service :
kubectl apply -f monitoring-role.yaml
kubectl create rolebinding monitoring-rb --role=monitoring-role --serviceaccount=payments:monitoring-sa -n payments
Vérifiez la liaison :
kubectl get rolebinding monitoring-rb -n payments -o yaml
Cela limite l'agent de surveillance à la lecture uniquement des ressources nécessaires dans l'espace de noms. Évitez les rôles à l'échelle du cluster lorsque des autorisations limitées à l'espace de noms suffisent.
Pour les tests, utilisez kubectl port-forward pour accéder aux services localement avant de les exposer via un équilibreur de charge ou une ingress. Par exemple :
kubectl port-forward svc/web 8080:80 -n payments
Accédez ensuite à http://localhost:8080 pour vérifier que le service fonctionne.
Vérification et diagnostics
Après avoir configuré la surveillance, vérifiez que les métriques sont collectées. Si vous utilisez Prometheus, interrogez le point de terminaison des métriques de votre agent de surveillance. Tout d'abord, trouvez le pod :
kubectl get pods -n payments -l app=monitoring-agent
Ensuite, faites un port-forward vers le pod Prometheus (le cas échéant) ou consultez les journaux de l'agent :
kubectl logs <pod-de-surveillance> -n payments
Les lignes de journal attendues indiquent un scraping réussi.
Pour les diagnostics, utilisez kubectl top pour voir l'utilisation des ressources :
kubectl top pods -n payments
Sortie attendue :
NAME CPU(cores) MEMORY(bytes)
web-6d4b8c7f9-abcde 120m 256Mi
redis-0 80m 512Mi
Si les métriques sont manquantes, vérifiez la configuration de l'agent et les autorisations RBAC. Assurez-vous que le compte de service peut lister les pods. Utilisez kubectl auth can-i list pods --as=system:serviceaccount:payments:monitoring-sa -n payments pour tester les autorisations.
Pour une analyse plus approfondie, utilisez kubectl describe pour inspecter les événements et les conditions :
kubectl describe pod web-6d4b8c7f9-abcde -n payments
Recherchez les événements FailedScheduling ou OOMKilled.
Modes de défaillance et récupération
Les systèmes de surveillance peuvent échouer. Les modes de défaillance courants incluent le crash de l'agent de surveillance, l'absence de scraping des métriques, le non-déclenchement des alertes ou l'absence de données dans les tableaux de bord. Voici les étapes de récupération :
CrashLoopBackOff de l'agent de surveillance
Si le pod de l'agent est en CrashLoopBackOff :
kubectl get pods -n payments
La sortie attendue montre l'état CrashLoopBackOff. Consultez les journaux :
kubectl logs <pod-agent> -n payments --previous
Causes courantes : configuration incorrecte, configmap manquante ou autorisations insuffisantes. Corrigez la configuration et redémarrez le pod. Si l'agent a besoin de plus de mémoire, ajustez ses limites de ressources dans le manifeste de déploiement et appliquez.
Absence de métriques dans Prometheus
Si Prometheus ne montre aucune cible pour l'espace de noms, vérifiez la configuration de découverte de services. Assurez-vous que les endpoints du service sont corrects :
kubectl get endpoints -n payments
Si les endpoints sont vides, le sélecteur du service peut ne pas correspondre aux pods. Corrigez le sélecteur et réappliquez.
Alertes non déclenchées
Si des règles d'alerte existent mais qu'aucune alerte ne se déclenche, vérifiez les règles d'alerte et la configuration d'Alertmanager. Utilisez kubectl describe configmap pour la configmap Prometheus afin de vérifier que les règles sont chargées. Assurez-vous qu'Alertmanager est joignable et reçoit les notifications.
Tableau de bord sans données
Si les tableaux de bord Grafana n'affichent aucune donnée, vérifiez la configuration de la source de données et l'URL de Prometheus. Vérifiez la connectivité de Grafana à Prometheus. Utilisez kubectl logs sur les pods Grafana pour identifier les erreurs.
Liste de contrôle opérationnelle
Utilisez cette liste de contrôle pour assurer l'efficacité continue de la surveillance des espaces de noms. Attribuez chaque élément à un seul propriétaire responsable pour éviter toute ambiguïté.
- Hebdomadaire : Examinez l'utilisation des ressources de l'espace de noms avec
kubectl top pods -n paymentset comparez avec les quotas. Propriétaire : Ingénieur DevOps (par exemple, Priya Shah). - Quotidien : Vérifiez s'il y a des pods en état
CrashLoopBackOffouPending:kubectl get pods -n payments --field-selector=status.phase!=Running. Propriétaire : SRE de garde (rotation). - Mensuel : Auditez les rôles et les liaisons RBAC du compte de service de surveillance pour garantir le moindre privilège. Propriétaire : Équipe de sécurité (par exemple, Marcus Chen).
- Trimestriel : Testez les règles d'alerte en déclenchant une défaillance contrôlée (par exemple, drainer un nœud dans un cluster de staging) et vérifiez que les alertes se déclenchent et que les notifications sont reçues. Propriétaire : Responsable de plateforme (par exemple, Elena Rodriguez).
- Après tout changement de configuration : Exécutez
kubectl apply --dry-run=client -f <manifest>pour valider la syntaxe avant d'appliquer. Propriétaire : Personne effectuant le changement.
Cette liste de contrôle garantit une supervision régulière et une détection rapide des problèmes.
Pièges courants et comment les éviter
- Utiliser cluster-admin pour la surveillance. Cela viole le principe du moindre privilège et augmente les risques. Créez plutôt des comptes de service dédiés avec des rôles limités à l'espace de noms comme indiqué précédemment. Si vous devez surveiller plusieurs espaces de noms, créez un ClusterRole limité aux points de terminaison de métriques en lecture seule, mais évitez les autorisations larges.
- Négliger la fatigue des alertes. Trop d'alertes bruyantes poussent les équipes à les ignorer. Définissez des seuils significatifs et agréguez les alertes. Par exemple, alertez sur une utilisation élevée du CPU uniquement si elle persiste plus de 5 minutes, pas instantanément. Utilisez
for: 5mdans les règles d'alerte Prometheus. Révisez les alertes trimestriellement et supprimez ou ajustez celles qui ne se sont pas déclenchées depuis des mois.
- Ne pas définir de demandes et de limites de ressources. Sans elles, un pod peut consommer toutes les ressources du nœud et affecter la surveillance. Définissez toujours des demandes et des limites, en particulier pour les composants de surveillance eux-mêmes. Exemple :
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
- Stocker des secrets en clair dans les configurations de surveillance. Utilisez les secrets Kubernetes et référencez-les dans les manifestes de déploiement. Ne committez pas de secrets dans Git. Utilisez des outils comme Sealed Secrets ou External Secrets Operator pour les gérer en toute sécurité.
- Absence de plan de réponse aux incidents. Lorsqu'une alerte se déclenche, les équipes peuvent paniquer sans runbook documenté. Créez des runbooks pour les alertes courantes, incluant les étapes de diagnostic et de récupération. Stockez-les dans un wiki ou un dépôt Git accessible au personnel de garde. Testez les runbooks périodiquement.
Conclusion
La surveillance et les alertes des espaces de noms Kubernetes sont une pratique continue. Commencez par un inventaire solide de l'environnement, configurez la surveillance avec le moindre privilège, vérifiez les métriques et les alertes, préparez-vous aux défaillances et suivez une liste de contrôle opérationnelle. Évitez les pièges courants en appliquant les mesures de protection décrites ici. Ce faisant, vous maintiendrez un environnement d'espace de noms fiable, observable et sécurisé. Choisissez une vérification à faible risque de ce guide, enregistrez l'état actuel, exécutez la vérification et comparez le résultat avec le signal attendu. Ensuite, développez progressivement, en gardant toujours la récupération à l'esprit.
Comme prochaine étape immédiate, vérifiez l'utilisation actuelle des ressources de votre espace de noms avec kubectl top pods -n <votre-espace-de-noms> et assurez-vous que votre agent de surveillance fonctionne avec le bon compte de service. Si vous rencontrez des problèmes, reportez-vous à la section sur les modes de défaillance pour les étapes de récupération. Avec ces pratiques, vous pouvez surveiller et alerter en toute confiance sur vos espaces de noms Kubernetes.