Passer au contenu

Comment résoudre les problèmes liés aux pods et aux espaces de noms bloqués dans les clusters Amazon EKS ?

Lecture de 6 minute(s)
0

Je n'arrive pas à supprimer mes pods ou espaces de noms dans mon cluster Amazon Elastic Kubernetes Service (Amazon EKS). Les pods ou les espaces de noms sont bloqués à l’état En cours de résiliation.

Brève description

Une fois que vous avez supprimé un pod ou un espace de noms dans Amazon EKS, la ressource passe à l’état En cours de résiliation. Si ce processus ne se termine pas, vous devez résoudre le problème manuellement.

Les pods peuvent rencontrer des problèmes de résiliation pour l'une des raisons suivantes :

  • Les finalisateurs empêchent la suppression
  • Les pods ne répondent pas aux signaux de terminaison
  • Les hooks PreStop échouent ou le service terminationGracePeriodSeconds s'étend trop longtemps
  • Les interruptions du réseau bloquent les composants master et les communications du plan de contrôle
  • L'utilisation élevée des ressources affecte les composants master

Les espaces de noms peuvent rencontrer des problèmes de résiliation pour l'une des raisons suivantes :

  • Kubernetes ne peut pas supprimer des ressources spécifiques
  • Les serveurs d'API signalent un état False
  • Les finalisateurs empêchent la suppression

Résolution

Utilisez les sections suivantes pour résoudre les problèmes liés au pod ou à l'espace de noms bloqué.

Résoudre les problèmes liés aux pods bloqués

Effectuez les tâches suivantes pour résoudre les problèmes liés aux pods bloqués.

Vérifier l'état du pod

Procédez comme suit :

  1. Pour vérifier les journaux Kubelet sur le nœud concerné, exécutez la commande suivante :

    kubectl get pods -A --field-selector=status.phase==Terminating -o wide
  2. Consultez la colonne NODE dans la sortie pour identifier les nœuds concernés. Si tous les pods bloqués se trouvent sur le même nœud, exécutez la commande journalctl suivante pour vérifier les journaux de kubelet sur le nœud concerné :

    journalctl -u kubelet
  3. Redémarrez le kubelet.

Vérifier les finalisateurs de pod

Pour vérifier la présence de finalisateurs, exécutez la commande suivante :

kubectl get pod POD_NAME -n NAMESPACE -o yaml

Remarque : remplacez POD_NAME par le nom de votre pod. Remplacez NAMESPACE par le nom de l'espace de noms dans lequel se trouve votre pod.

Si des finalisateurs sont présents, exécutez l'une des commandes suivantes :

Pour une suppression simple, utilisez la commande suivante :

kubectl patch pod POD_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}'

Ou, si votre environnement nécessite des opérations de correctif JSON ou si vous préférez une syntaxe plus détaillée, utilisez la commande suivante :

kubectl patch pod POD_NAME -n NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Remarque : remplacez POD_NAME par le nom de votre pod. Remplacez NAMESPACE par le nom de l'espace de noms dans lequel se trouve votre pod.

Forcer la suppression du pod

Important : il est recommandé d'utiliser cette option uniquement si les autres méthodes ne permettent pas d'éviter la perte ou la corruption des données.

Exécutez la commande suivante pour forcer la suppression du pod :

kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force

Remarque : remplacez POD_NAME par le nom de votre pod et NAMESPACE par l'espace de noms dans lequel se trouve votre pod.

Résoudre les problèmes liés aux espaces de noms bloqués

Effectuez les tâches suivantes pour résoudre les problèmes liés aux espaces de noms bloqués.

Vérifier l'état de l'espace de noms

Lorsqu'un espace de noms est bloqué à l’état En cours de résiliation, il peut contenir des ressources que Kubernetes ne peut pas supprimer. Ou bien, un service d'API peut présenter l’état False.

Exécutez les commandes suivantes pour vérifier l’état de votre espace de noms :

kubectl describe namespace NAMESPACE

Remarque : remplacez NAMESPACE par le nom de votre espace de noms bloqué.

Trouver et supprimer les ressources restantes

Si les ressources restent dans l'espace de noms, le message d'erreur suivant s'affiche :

« NamespaceContentRemaining: Some resources are remaining: serviceaccounts has 2 resource instances »

Pour répertorier les ressources restantes, exécutez la commande suivante :

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Remarque : remplacez NAMESPACE par le nom de votre espace de noms.

Exécutez ensuite la commande suivante pour supprimer les ressources identifiées :

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Remarque : remplacez RESOURCE_TYPE par le type de ressource, RESOURCE_NAME par le nom de la ressource et remplacez NAMESPACE par votre espace de noms.

Supprimer les finalisateurs d'espaces de noms

Si les finalisateurs sont toujours attachés, le message d'erreur suivant s'affiche :

« NamespaceFinalizersRemaining: Some content in the namespace has finalizers remaining: kubernetes.io/persistent-volume-provisioner in 1 resource instance »

Pour supprimer les finalisateurs d'espaces de noms, vous pouvez exécuter une commande patch, utiliser un fichier JSON ou forcer la suppression de l'espace de noms.

Pour supprimer les finalisateurs avec une opération de correctif, exécutez la commande suivante :

kubectl patch namespace NAMESPACE --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'

Remarque : remplacez NAMESPACE par le nom de votre espace de noms bloqué.

Pour utiliser un fichier JSON, procédez comme suit :

  1. Exécutez la commande suivante pour créer le fichier de configuration de l'espace de noms :
    kubectl get namespace TERMINATING_NAMESPACE -o json > tempfile.json
    Remarque : remplacez TERMINATING_NAMESPACE par le nom de votre espace de noms bloqué.
  2. Supprimez le tableau de finalisateurs de la section des spécifications du fichier JSON.
  3. Exécutez la commande suivante pour appliquer les modifications :
    kubectl replace --raw "/api/v1/namespaces/TERMINATING_NAMESPACE/finalize" -f ./tempfile.json
    Remarque : remplacez TERMINATING_NAMESPACE par le nom de votre espace de noms bloqué.
  4. Vérifiez que l'espace de noms a été supprimé. Exécutez la commande suivante :
    kubectl get namespaces

Pour forcer la suppression de l'espace de noms, exécutez la commande suivante :

kubectl delete namespace NAMESPACE --grace-period=0 --force

Remarque : remplacez NAMESPACE par le nom de votre espace de noms bloqué. Il est recommandé d'utiliser cette option uniquement si les autres méthodes ne permettent pas d'éviter la perte ou la corruption des données.

Nettoyer les ressources personnalisées

Si les ressources restent dans l'espace de noms, exécutez la commande suivante :

kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n NAMESPACE

Remarque : remplacez NAMESPACE par le nom de votre espace de noms.

Si vous identifiez des ressources personnalisées, exécutez la commande suivante pour les supprimer :

kubectl delete RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE

Remarque : remplacez RESOURCE_TYPE par le type de ressource, RESOURCE_NAME par le nom de la ressource et remplacez NAMESPACE par votre espace de noms.

Exécutez la commande suivante pour supprimer les finalisateurs de ressources personnalisées :

kubectl patch RESOURCE_TYPE RESOURCE_NAME -n NAMESPACE -p '{"metadata":{"finalizers":null}}' --type=merge

Remarque : remplacez RESOURCE_TYPE par le type de ressource. Remplacez RESOURCE_NAME par le nom de la ressource. Remplacez NAMESPACE par votre espace de noms.

Puis, exécutez la commande suivante pour supprimer CustomResourceDefinitions :

kubectl delete crd CRD_NAME

Remarque : remplacez CRD_NAME par le nom de votre CustomResourceDefinition. Supprimez uniquement les CustomResourceDefinitions dont vous n'avez plus besoin.

AWS OFFICIELA mis à jour il y a 6 mois