¿Cómo actualizo un espacio de nombres en estado Terminating?
En Kubernetes, un espacio de nombres tiene dos estados comunes: Active y Terminating. El estado Terminating es raro. Cuando un espacio de nombres tiene recursos en ejecución pero se elimina el espacio de nombres, el espacio de nombres se convierte en Terminating. En este caso, el sistema eliminará automáticamente el espacio de nombres después de que Kubernetes recupere los recursos en el espacio de nombres.
Sin embargo, en algunos casos, incluso si no se está ejecutando ningún recurso en el espacio de nombres, el espacio de nombres en el estado Terminating aún no se puede eliminar.
Para solucionar este problema, realice los siguientes pasos:
- Ver los detalles del espacio de nombres.
$ 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
- Ver recursos en el espacio de nombres.
# 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
Después de ejecutar el comando anterior, no se ocupa ningún recurso en el espacio de nombres rdbms.
- Eliminar el espacio de nombres.
Elimine directamente el rdbms del espacio de nombres.
$ 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.
El sistema muestra un mensaje que indica que la operación de eliminación se completará hasta que el sistema elimine todos los recursos inútiles.
- Elimine por la fuerza el espacio de nombres.
$ 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.
Después de ejecutar el comando anterior, el espacio de nombres aún no se puede eliminar.
- Utilizar la API nativa para eliminar estos recursos.
Obtenga los detalles del espacio de nombres.
$ kubectl get ns rdbms -o json > rdbms.json
Compruebe la configuración de JSON definida por el espacio de nombres, edite el archivo JSON y elimine la 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" } }
Después de ejecutar la solicitud PUT, el espacio de nombres se elimina automáticamente.
$ 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" }
Si el espacio de nombres aún no se puede eliminar, compruebe si el campo finalizers existe en los metadatos. Si el campo existe, ejecute el siguiente comando para acceder al espacio de nombres y eliminar el campo:
kubectl edit ns rdbms
- Para obtener más información acerca de cómo obtener el certificado de clúster, consulte Obtención de un certificado de clúster.
- https://x.x.x.x:5443 indica la dirección para conectarse al clúster. Para obtener la dirección, inicie sesión en la consola de CCE, haga clic en el clúster y vea Private IP en el panel Connection Information.
- Compruebe si el espacio de nombres se ha eliminado.
$ kubectl get ns | grep rdb