254 votes

Espace de nom "bloqué" comme Terminating, comment le supprimer ?

J'ai eu un espace de noms "bloqué" que j'ai supprimé et qui s'affiche dans cet éternel statut "terminating".

0 votes

Votre espace de nom était-il vide ?

260voto

nobar Points 5849

En supposant que vous avez déjà essayé de forcer la suppression de ressources comme : Pods bloqués à l'état de terminaison et vous ne savez plus quoi faire pour récupérer l'espace de nom...

Vous pouvez forcer la suppression de l'espace de nom (en laissant peut-être des ressources en suspens) :

(
NAMESPACE=your-rogue-namespace
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
)
  • Il s'agit d'un raffinement de la réponse aquí qui est basé sur le commentaire aquí .

  • J'utilise le jq pour supprimer de façon programmatique les éléments de la section des finaliseurs. Vous pouvez le faire manuellement à la place.

  • kubectl proxy crée l'écouteur à 127.0.0.1:8001 par défaut . Si vous connaissez le nom d'hôte/IP de votre maître de cluster, vous pouvez l'utiliser à la place.

  • Ce qui est amusant, c'est que cette approche semble fonctionner même lorsque l'on utilise kubectl edit faire le même changement n'a aucun effet.

143voto

Jordan Liggitt Points 828

Cela est dû à des ressources qui existent toujours dans l'espace de noms et que le contrôleur de l'espace de noms n'est pas en mesure de supprimer.

Cette commande (avec kubectl 1.11+) vous montrera quelles ressources restent dans l'espace de noms :

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

Une fois que vous les aurez trouvés, résolus et supprimés, l'espace de noms sera nettoyé.

6 votes

Cela ne montre aucune ressource sur mon cluster, je ne pense pas que ce soit toujours la solution.

6 votes

Mais il vaut mieux essayer d'abord. La suppression forcée de l'espace de nom n'est pas un bon conseil.

129voto

teoincontatto Points 425

Comme mentionné précédemment dans ce fil de discussion, il existe un autre moyen de mettre fin à un espace de noms en utilisant une API non exposée par kubectl en utilisant une version moderne de kubectl où kubectl replace --raw est disponible (je ne sais pas de quelle version). De cette façon, vous n'aurez pas à créer un fichier kubectl proxy et éviter de dépendre de curl (qui dans certains environnements comme busybox n'est pas disponible). Dans l'espoir que cela puisse aider quelqu'un d'autre, j'ai laissé ceci ici :

kubectl get namespace "stucked-namespace" -o json \
  | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
  | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -

6 votes

Celui-ci a fonctionné pour moi dans la version kubectl v1.17, k8 v1.16

0 votes

Super. La seule chose qui a fonctionné pour nous quand il n'y avait pas de nœuds dans le cluster.

0 votes

Erreurs de mine sur "tr". Le terme "tr" n'est pas reconnu.

82voto

Shreyangi Saxena Points 201

Il faut supprimer le finisseur pour kubernetes.

Étape 1 :

kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
  • supprimer kubernetes du tableau des finaliseurs qui est en cours de spécification

Étape 2 :

kubectl replace --raw "/api/v1/namespaces/<YOUR_NAMESPACE>/finalize" -f ./<YOUR_NAMESPACE>.json

Étape 3 :

kubectl get namespace

Vous pouvez voir que l'espace de nom gênant a disparu.

0 votes

Il me manque cette api namespaces. Existe-t-il un moyen de l'installer ?

9 votes

Cela peut également être réalisé avec kubectl edit <stuck_resource> et supprimer l'élément dans la liste des "finalistes". Cela a l'avantage de pouvoir être utilisé pour supprimer d'autres ressources bloquées sans connaître leur chemin d'api. Je l'ai utilisé pour supprimer un CRD récalcitrant.

69voto

Étape 1 : Dans un terminal, exécuter la commande suivante :

kubectl proxy

Étape 2 : Ouvrez un autre terminal et envoyez le descripteur en JSON dans un fichier.

kubectl get namespace YOURNAMESPACE -o json > logging.json

Ouvrez le fichier avec un éditeur de texte :

{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2019-05-14T13:55:20Z",
        "labels": {
            "name": "logging"
        },
        "name": "logging",
        "resourceVersion": "29571918",
        "selfLink": "/api/v1/namespaces/logging",
        "uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
    },
    "spec": {
        "finalizers": [
            **"kubernetes"**
        ]
    },
    "status": {
        "phase": "Terminating"
    }
}

Supprimez le contenu du tableau des finalistes et laissez-le vide comme dans l'exemple ci-dessous :

    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "creationTimestamp": "2019-05-14T13:55:20Z",
            "labels": {
                "name": "logging"
            },
            "name": "logging",
            "resourceVersion": "29571918",
            "selfLink": "/api/v1/namespaces/logging",
            "uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
        },
        "spec": {
            "finalizers": [
            ]
        },
        "status": {
            "phase": "Terminating"
        }
    }

Étape 3 : Exécution de la commande de nettoyage pour se débarrasser de cet espace de nom ennuyeux :

curl -k -H "Content-Type: application/json" -X PUT --data-binary @logging.json http://127.0.0.1:8001/api/v1/namespaces/YOURNAMESPACE/finalize

Profitez de

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X