如何强制删除Kubernetes命名空间

时间:2020-02-23 14:38:29  来源:igfitidea点击:

命名空间是一种划分kubernetes在多个用户和团队之间群集资源的方法。
它们用于在许多用户跨越多个团队或者项目的环境中使用。
对于只有少数用户的Kubernetes集群,可能无需创建或者考虑名称空间。

我们可能已经使用Kuubeadm创建了Kubernetes群集,如我们的Kubernetes安装教程中所讨论的。
在我们正在执行部署时,我们将在删除所有资源之前删除命名空间并希望重用相同的名称以重新创建资源。
但是,命名空间粘贴在终止状态。

[Hyman@theitroad ~]$kubectl delete ns developer
namespace "developer" deleted
[Hyman@theitroad ~]$kubectl get ns developer
NAME STATUS AGE
developer Terminating 1h

我们可以使用各种方式来解决这个问题。
在本文中,我将通过使用kubectl代理来指导我们解决此问题。

第1步:编辑命名空间

首先,我们需要编辑终止命名空间,以便在IT的规范中删除Kubernetes Finalizer。
Finalizers是Kubernetes资源中设置的值,即当存在时确保在存在时无法删除资源。
这解释了如果不优雅地删除,命名空间保留在终止状态。

我们可以使用JSON格式执行此操作。
运行以下命令:

[Hyman@theitroad ~]$kubectl get ns developer -o json  > tmp.json
[Hyman@theitroad ~]$vim  tmp.json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "developer",
"spec": {
"finalizers": [
"kubernetes"
]
},
"status": {
"conditions": [
{
"lastTransitionTime": "2017-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": "2017-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值应如下所示:

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

第2步:打开一个新终端

其次,我们将使用HTTP代理访问Kubernetes API。
代理服务器允许我们探索Kubernetes API curlwget或者浏览器。
我们可以通过在新终端上运行以下命令来执行此操作:

[Hyman@theitroad ~]$kubectl proxy
Starting to serve on 127.0.0.1:800

第3步:应用已编辑的JSON文件

最后,我们将使用 curl在没有问题的终结器的情况下应用命名空间。

[Hyman@theitroad ~]$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": "2017-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": "2017-07-19T12:53:54Z",
"reason": "ParsedGroupVersions",
"message": "All legacy kube types successfully parsed"
},
{
"type": "NamespaceDeletionContentFailure",
"status": "False",
"lastTransitionTime": "2017-07-19T12:53:54Z",
"reason": "ContentDeleted",
"message": "All content successfully deleted"
}
]
}

我们已成功删除命名空间。

[Hyman@theitroad ~]$kubectl get ns developer
Error from server (NotFound): namespaces "developer" not found