Como atualizar um namespace no estado Terminating?
No Kubernetes, um namespace tem dois estados comuns: Active e Terminating. O estado Terminating é raro. Quando um namespace tem recursos em execução, mas o namespace é excluído, o namespace se torna Terminating. Nesse caso, o namespace será automaticamente excluído pelo sistema depois que o Kubernetes recuperar os recursos no namespace.
No entanto, em alguns casos, mesmo que nenhum recurso esteja em execução no namespace, o namespace no estado Terminating ainda não pode ser excluído.
Para resolver este problema, execute os seguintes passos:
- Veja os detalhes do namespace.
$ kubectl get ns | grep rdb rdbms Terminating 6d21h $ kubectl get ns rdbms -o yaml apiVersion: v1 kind: Namespace metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"rdbms"}} creationTimestamp: "2020-05-07T15:19:43Z" deletionTimestamp: "2020-05-07T15:33:23Z" name: rdbms resourceVersion: "84553454" selfLink: /api/v1/namespaces/rdbms uid: 457788ddf-53d7-4hde-afa3-1fertg21ewe1 spec: finalizers: - kubernetes status: phase: Terminating
- Exiba recursos no namespace.
# View resources that can be isolated using namespaces in the cluster. $ kubectl api-resources -o name --verbs=list --namespaced | xargs -n 1 kubectl get --show-kind --ignore-not-found -n rdbms
Depois de executar o comando acima, nenhum recurso é ocupado no namespace rdbms.
- Exclua o namespace.
Exclua diretamente o namespace rdbms.
$ kubectl delete ns rdbms Error from server (Conflict): Operation cannot be fulfilled on namespaces "rdbms": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
O sistema exibe uma mensagem indicando que a operação de exclusão será concluída até que o sistema exclua todos os recursos inúteis.
- Exclua forçadamente o namespace.
$ kubectl delete ns rdbms --force --grace-period=0 warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. Error from server (Conflict): Operation cannot be fulfilled on namespaces "rdbms": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
Depois de executar o comando acima, o namespace ainda não pode ser excluído.
- Use a API nativa para excluir esses recursos.
Obtenha os detalhes do namespace.
$ kubectl get ns rdbms -o json > rdbms.json
Verifique a configuração JSON definida pelo namespace, edite o arquivo JSON e exclua a parte spec.
$ cat rdbms.json { "apiVersion": "v1", "kind": "Namespace", "metadata": { "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"rdbms\"}}\n" }, "creationTimestamp": "2019-10-14T12:17:44Z", "deletionTimestamp": "2019-10-14T12:30:27Z", "name": "rdbms", "resourceVersion": "8844754", "selfLink": "/api/v1/namespaces/rdbms", "uid": "29067ddf-56d7-4cce-afa3-1fbdbb221ab1" }, "spec": { "finalizers": [ "kubernetes" ] }, "status": { "phase": "Terminating" } }
Depois que a solicitação PUT é executada, o namespace é automaticamente excluído.
$ curl --cacert /root/ca.crt --cert /root/client.crt --key /root/client.key -k -H "Content-Type:application/json" -X PUT --data-binary @rdbms.json https://x.x.x.x:5443/api/v1/namespaces/rdbms/finalize { "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "rdbms", "selfLink": "/api/v1/namespaces/rdbms/finalize", "uid": "29067ddf-56d7-4cce-afa3-1fbdbb221ab1", "resourceVersion": "8844754", "creationTimestamp": "2019-10-14T12:17:44Z", "deletionTimestamp": "2019-10-14T12:30:27Z", "annotations": { "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"rdbms\"}}\n" } }, "spec": { }, "status": { "phase": "Terminating" }
Se o namespace ainda não puder ser excluído, verifique se o campo finalizers existe nos metadados. Se o campo existir, execute o seguinte comando para acessar o namespace e excluir o campo:
kubectl edit ns rdbms
- Para obter detalhes sobre como obter o certificado de cluster, consulte Obtenção de um certificado de cluster.
- https://x.x.x.x:5443 indica o endereço para conexão ao cluster. Para obter o endereço, efetue logon no console do CCE, clique no cluster e visualize Private IP no painel de Connection Information.
- Verifique se o namespace foi excluído.
$ kubectl get ns | grep rdb