La suppression d’un pod dans un nœud Kubernetes est généralement nécessaire pour réduire manuellement votre cluster à des fins de dépannage. Lorsqu’un nœud a besoin d’opération de maintenance, il est possible qu’un ou plusieurs pods doivent être supprimés de celui-ci. Dans cet article, nous allons couvrir les différentes méthodes pour supprimer un ou plusieurs pods simultanément dans vos nœuds Kubernetes.
Si vous souhaitez devenir incollable sur la gestion des nodes et des pods, notre formation Kubernetes vous permettra de devenir incollable sur la gestion de vos clusters et de vos applications conteneurisées. À l’issue de cette formation, vous saurez déployer et gérer des applications cloud native conteneurisées.
L’équipe Ambient IT
Méthode 1 : Supprimer tous les Pods d’un nœud
Pour supprimer tous les pods d’un nœud Kubernetes, vous devez d’abord marquer le nœud comme non planifiable afin d’empêcher que de nouveaux pods soient planifiés dessus, puis de drainer le nœud, ce qui supprimera tous les pods.
Pour marquer le nœud comme non planifiable, vous devez rentrer cette commande :
kubectl cordon <node-name>
En remplaçant la commande <node-name> par le nom de votre nœud, vous empêchez la création de nouveaux pods sur celui-ci. Vous devez maintenant le drainer.
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
Remplacez encore une fois <node-name> par le nom de votre nœud. Cette commande supprimera tous les pods du nœud.
L’option –ignore-daemonsets est nécessaire, vous ne pouvez malheureusement pas supprimer les pods daemonset en utilisant kubectl drain. Ils doivent être supprimés manuellement.
L’option –delete-emptydir-data est utilisée pour permettre la suppression des pods utilisant emptyDir pour le stockage. De plus, si vous avez des pods avec un stockage local, vous devrez peut-être utiliser l’option –force.
Lorsque l’opération est terminée, vous pouvez relancer le pod, utilisez la commande suivante :
kubectl uncordon <node-name>
Cette opération entraînera une interruption de service si les pods supprimés ne font pas partie d’un ReplicaSet ou d’un contrôleur similaire qui créera de nouveau pods sur d’autres nœuds disponibles.
Message d’erreur lors du drain
Lors du drain du pod, il est possible que vous rencontriez un message d’erreur : Cannot evict pod as it would violate the pod’s disruption budget.
La disruption est un moyen d’assurer la disponibilité des pods afin d’éviter leur suppression accidentelle. La documentation de Kubernetes nous apprend que : « En tant que propriétaire d’application, vous pouvez créer un PodDisruptionBudget (PDB) pour chaque application. Un PDB limite le nombre de Pods d’une application répliquée qui sont hors service simultanément à cause de perturbations volontaires. »
Vous pouvez visualiser cette limite avec la commande suivante :
kubectl get poddisruptionbudget -A
Vous pouvez alors supprimer cette limite :
kubectl delete poddisruptionbudget
Même si le message d’erreur est affiché, des tentatives auront lieu automatiquement après un délai configurable.
Méthode 2 : Supprimer un seul Pod
Pour supprimer un pod unique d’un nœud spécifique dans Kubernetes, vous pouvez utiliser la commande kubectl delete pod, tout comme pour la suppression d’un pod. Vous devez d’abord connaître le nom du module pour réaliser cette opération. Vous pouvez lister tous les pods ainsi que les nœuds sur lesquels ils tournent avec cette commande :
kubectl get pods -o wide
Lorsque vous avez trouvé le pod que vous souhaitez supprimer, il vous suffit d’utiliser cette commande :
kubectl delete pod <pod-name>
Cela supprimera le pod du cluster, quel que soit le nœud sur lequel il se trouve. Si le pod fait partie d’un Deployment, StatefulSet ou d’un autre type de contrôleur, un nouveau pod peut être programmé pour le remplacer, éventuellement sur le même nœud.
Il faut également noter que les modules ne sont pas liés à un nœud spécifique, ils sont planifiés sur n’importe quel nœud disponible dans le cluster qui répond aux exigences du module. Si vous souhaitez empêcher qu’un module soit de nouveau programmé sur un nœud spécifique, vous devez ajuster les paramètres d’affinité/anti-affinité du module avec le nœud ou altérer le nœud et ajouter les tolérances correspondantes à vos modules.
Augmenter le nombre de pods
Vous pouvez avoir besoin d’augmenter le nombre de pods sur un nœud avant d’en supprimer certains pour des raisons de performance et de disponibilité.
kubectl scale deployment <deployment-name> --replicas=<number-of-replicas>
Cette commande vous permet d’augmenter le nombre de pods. Il vous suffit de remplacer par le nom de votre déploiement et par le nombre d’instances de pods que vous souhaitez avoir.
Vous pouvez aussi choisir de réduire le nombre de pods :
kubectl scale deployment <deployment-name> --replicas=<number-of-replicas>
Il est également possible de configurer la mise à l’échelle automatique basée sur l’utilisation du processeur ou d’une autre métrique de votre choix, mais cela demande une configuration complète de l’outil en utilisant la commande kubectl autoscale.
Forcer la suppression d’un pod
Pour forcer la suppression d’un pod, vous pouvez utiliser la commande kubectl delete pod avec les options –force et –grace-period=0.
kubectl delete pod <pod-name> --force --grace-period=0
L’utilisation de la commande –force est souvent risquée, car elle peut entrainer une corruption des données ou un état incohérent. De plus, pour éviter la création d’un nouveau module pour remplacer l’ancien, vous aurez parfois besoin de réduire la taille du contrôleur parent ou de le supprimer.
Supprimer les pods terminés
Les Pods ayant le statut completed après avoir terminé leur tâche peuvent être supprimés manuellement ou automatiquement. La suppression automatique peut être configurée en utilisant le TTL Controller for Finished Resources.
Pour supprimer manuellement tous les pods terminés, utilisez la commande suivante :
kubectl get pods --field-selector=status.phase==Succeeded -o name | xargs kubectl delete
Il faut noter que la suppression d’un pod le supprime définitivement, ainsi que les journaux qui lui sont associés, du serveur API Kubernetes. Assurez-vous d’avoir collecté tous les journaux et autres données nécessaires de vos modules avant de les supprimer.