Пространства имен (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