☸️ Как принудительно удалить пространство имен (Namespace) в Kubernetes

by itisgood

Пространства имен (Namespace) – это способ разделения ресурсов кластера Kubernetes между несколькими пользователями и группами.

Они предназначены для использования в средах с большим количеством пользователей, распределенных по нескольким командам или проектам.

В кластерах Kubernetes, в которых всего несколько пользователей, может и не быть необходимости создавать или думать о пространствах имен.

Возможно, вы уже создали кластер Kubernetes, используя kubeadm, как описано в нашем руководстве по установке Kubernetes.

☸️ Как развернуть легкий кластер Kubernetes за 5 минут с K3s

Смоделируем сценарий:

В процессе развертывания вы удалили пространство имен до того, как были удалены все его ресурсы, и хотите повторно использовать то же имя, чтобы воссоздать ваши ресурсы.

Тем не менее, ваше пространство имен застряло в состоянии terminating state.

$ kubectl delete ns developer
namespace "developer" deleted

$ kubectl get ns developer
NAME STATUS AGE
developer Terminating 1h

Существуют различные способы решения этой проблемы. В этой статье я расскажу вам, как решить эту проблему с помощью kubectl proxy.

ШАГ 1: Отредактируйте namespace

Во-первых, нам нужно отредактировать завершающее пространство имен, чтобы удалить kubernetes finalizer iиз его spec.

Finalizer- это значения, установленные в ресурсах kubernetes, которые при их наличии гарантируют, что полное удаление ресурса невозможно, пока они существуют.

Это объясняет, почему пространство имен остается в terminating state., если не удаляется правильно.

Мы можем сделать это, используя формат JSON.

Запустите следующие команды:

$ kubectl get ns developer -o json  > tmp.json
$ vim  tmp.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "developer",
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"conditions": [
{
"lastTransitionTime": "2020-07-19T12:29:58Z",
"message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request",
"reason": "DiscoveryFailed",
"status": "True",
"type": "NamespaceDeletionDiscoveryFailure"
},
{
"lastTransitionTime": "2020-07-19T12:30:02Z",
"message": "Failed to delete all resource types, 1 remaining: unexpected items still remain in namespace: developer for gvr: /v1, Resource=pods",
"reason": "ContentDeletionFailed",
"status": "True",
"type": "NamespaceDeletionContentFailure"
}
],
"phase": "Terminating"
}
}

Итак, значение spec.finalizer должно быть таким:

cat tmp.json
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "developer"
},
"spec": {
"finalizers": []
}
}

ШАГ 2: ОТКРОЙТЕ НОВЫЙ ТЕРМИНАЛ

Далее, мы будем использовать HTTP-прокси для доступа к API Kubernetes.

Прокси-сервер позволяет нам исследовать API kubernetes, используя curl, wget или браузер.

Мы можем сделать это, выполнив следующую команду на новом терминале:

$ kubectl proxy
Starting to serve on 127.0.0.1:800

ШАГ 3: ПРИМЕНЕНИЕ ОТРЕДАКТИРОВАННОГО ФАЙЛА JSON

Наконец, мы будем использовать curl для применения пространства имен без проблемного finalizer

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/developer/finalize
{
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "developer",
"spec": {},
"status": {
"phase": "Terminating",
"conditions": [
{
"type": "NamespaceDeletionDiscoveryFailure",
"status": "True",
"lastTransitionTime": "2020-07-19T12:53:50Z",
"reason": "DiscoveryFailed",
"message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request"
},
{
"type": "NamespaceDeletionGroupVersionParsingFailure",
"status": "False",
"lastTransitionTime": "2020-07-19T12:53:54Z",
"reason": "ParsedGroupVersions",
"message": "All legacy kube types successfully parsed"
},
{
"type": "NamespaceDeletionContentFailure",
"status": "False",
"lastTransitionTime": "2020-07-19T12:53:54Z",
"reason": "ContentDeleted",
"message": "All content successfully deleted"
}
]
}

Мы успешно удалили пространство имен.

$ kubectl get ns developer
Error from server (NotFound): namespaces "developer" not found

 

You may also like

Leave a Comment