
Supprimer les ressources avec `kubectl delete -f `
Apprenez à supprimer proprement les ressources Kubernetes créées via un manifeste en utilisant la commande déclarative `kubectl delete -f
Compléter le cycle : le nettoyage déclaratif des ressources
Après avoir déployé, vérifié et interagi avec votre application, la dernière étape de la séquence de déploiement typique, surtout dans des contextes d'apprentissage, de test ou de développement, consiste à supprimer les ressources que vous avez créées. Laisser des ressources inutilisées peut consommer des ressources de cluster (CPU, mémoire, stockage, adresses IP) et potentiellement entraîner des coûts inutiles, notamment dans les environnements cloud. Heureusement, l'approche déclarative de Kubernetes offre une méthode de nettoyage aussi simple et cohérente que celle de la création : la commande `kubectl delete -f`.
Tout comme `kubectl apply -f` utilise un manifeste pour définir l'état désiré, `kubectl delete -f` utilise le même manifeste pour identifier les ressources à supprimer. C'est la beauté de l'approche : le fichier YAML qui a servi à créer et mettre à jour votre application sert également à la démanteler proprement. Cela garantit que vous supprimez exactement ce que vous avez défini, réduisant le risque d'oublier des composants ou de supprimer des ressources incorrectes.
Cette commande est l'outil privilégié pour le nettoyage lorsque vous travaillez avec des manifestes, car elle s'aligne parfaitement sur la philosophie déclarative et le principe d'Infrastructure as Code, où le fichier source fait autorité pour l'ensemble du cycle de vie de la ressource.
La commande `kubectl delete -f` : syntaxe et fonctionnement
La syntaxe de la commande est le miroir de son homologue `apply` :
kubectl delete -f ou pour supprimer toutes les ressources définies dans les manifestes d'un répertoire :
kubectl delete -f Lorsque vous exécutez cette commande, `kubectl` lit le ou les fichiers YAML spécifiés. Pour chaque définition d'objet trouvée dans le fichier (identifiée par `apiVersion`, `kind`, `name` et `namespace`), `kubectl` envoie une requête de suppression à l'API Server Kubernetes.
L'API Server reçoit ces requêtes et initie le processus de suppression des objets correspondants. Il est important de noter que la suppression n'est pas toujours instantanée. Kubernetes suit un processus de terminaison contrôlée (graceful termination) pour permettre aux applications de s'arrêter proprement. Par exemple, pour un Pod, Kubernetes envoie un signal SIGTERM au conteneur, attend une période de grâce (grace period), puis envoie un SIGKILL si le conteneur ne s'est pas arrêté.
De plus, la suppression d'un objet de haut niveau, comme un Deployment, déclenche généralement la suppression en cascade des objets qu'il gère. Ainsi, supprimer un Deployment entraînera la suppression des ReplicaSets qu'il a créés, qui à leur tour entraîneront la suppression des Pods associés. Vous n'avez généralement pas besoin de supprimer explicitement chaque Pod individuellement si vous supprimez le Deployment qui les contrôle.
Exemple pratique et vérification de la suppression
Reprenons notre fichier `nginx-deployment.yaml`. Pour supprimer le Deployment (et par conséquent les Pods qu'il gère) que nous avons créé avec ce fichier, nous exécutons simplement :
kubectl delete -f nginx-deployment.yamlLa sortie attendue sera similaire à ceci :
deployment.apps "nginx-deployment" deletedCela confirme que la demande de suppression pour l'objet Deployment nommé `nginx-deployment` a été acceptée par l'API Server.
Comme pour `apply`, il est bon de vérifier que la suppression est bien effective. Vous pouvez réutiliser les commandes `kubectl get` :
kubectl get deployment nginx-deploymentSi la suppression est terminée, vous obtiendrez une erreur indiquant que la ressource n'a pas été trouvée :
Error from server (NotFound): deployments.apps "nginx-deployment" not foundVous pouvez également vérifier les Pods avec le même label :
kubectl get pods -l app=nginxSi les Pods sont en cours de suppression, vous pourriez les voir brièvement dans l'état `Terminating`. Une fois la suppression terminée, la commande ne devrait retourner aucun Pod :
No resources found in default namespace.Note importante : si vous aviez défini un Service dans un fichier séparé (par exemple, `nginx-service.yaml`), vous devriez également exécuter `kubectl delete -f nginx-service.yaml` pour le supprimer. La commande `delete -f` ne supprime que les ressources explicitement définies dans le fichier fourni.
Avantages de `delete -f` par rapport à la suppression impérative
Il est également possible de supprimer des ressources de manière impérative, en spécifiant le type et le nom, par exemple : `kubectl delete deployment nginx-deployment`. Cependant, l'utilisation de `kubectl delete -f` avec le manifeste présente plusieurs avantages :
- Cohérence : Vous utilisez la même source (le fichier YAML) pour créer, mettre à jour et supprimer, ce qui garantit que vous gérez le bon ensemble de ressources.
- Exhaustivité : Si votre fichier YAML définit plusieurs ressources (par exemple, un Deployment et un ConfigMap associés), `kubectl delete -f` les supprimera toutes en une seule commande, évitant les oublis.
- Reproductibilité : L'action est clairement définie par le contenu du fichier, ce qui est utile pour l'automatisation et l'audit.
- Simplicité : Vous n'avez pas besoin de vous souvenir ou de rechercher les noms exacts de toutes les ressources à supprimer; il suffit de pointer vers le fichier qui les a définies.
L'utilisation de `kubectl delete -f` est donc la méthode recommandée pour le nettoyage dans un flux de travail basé sur des manifestes. Elle clôture proprement le cycle de vie des ressources gérées de manière déclarative, en assurant un nettoyage complet et cohérent de votre environnement Kubernetes.