J'ai eu un espace de noms "bloqué" que j'ai supprimé et qui s'affiche dans cet éternel statut "terminating".
Cela ne montre aucune ressource sur mon cluster, je ne pense pas que ce soit toujours la solution.
J'ai eu un espace de noms "bloqué" que j'ai supprimé et qui s'affiche dans cet éternel statut "terminating".
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.
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é.
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 -
Super. La seule chose qui a fonctionné pour nous quand il n'y avait pas de nœuds dans le cluster.
Il faut supprimer le finisseur pour kubernetes.
Étape 1 :
kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
É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.
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.
É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 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.
0 votes
Votre espace de nom était-il vide ?