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