1、问题的现象
今天在清理测试环境的时候,发现一个ns的状态一直显示Terminating
代码语言:javascript复制 kubectl get ns输出结果:
代码语言:javascript复制 NAME STATUS AGE
argocd Active 327d
default Active 327d
ingress-apisix Active 27d
ingress-nginx Terminating 234d
istio-ingress Active 103d
istio-system Active 103d
kube-node-lease Active 327d
kube-public Active 327d
kube-system Active 327d
kubernetes-dashboard Active 327d
observability Active 172d
prometheus Active 255d
redis Terminating 291d使用–force 删除也是一直卡着的状态
代码语言:javascript复制 kubectl delete ns redis --force 输出结果:
代码语言:javascript复制 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.
namespace "redis" force deleted2、查看ns下的资源
根据以上现象,怀疑是该ns下有未释放的资源,使用如下命令查看
代码语言:javascript复制 kubectl get all -n redis输出结果
代码语言:javascript复制 No resources found in redis namespace.3、问题处理方法
以json格式导出ns的详细信息
代码语言:javascript复制 kubectl get ns redis -o json > redis.json编辑test.json文件,确保spec中内容为空,如下:
代码语言:javascript复制 "spec": {
"finalizers": [ #########
"kubernetes" ######### 删除这三行内容,告知k8s要删除的ns中内容为空
] #########
},将空ns通过调用k8s的api接口覆盖掉原来的ns
代码语言:javascript复制 curl -k
> -H "Content-Type: application/json"
> -X PUT
> --data-binary @redis.json
>http://127.0.0.1:8081/api/v1/namespaces/redis/finalize输出结果:
代码语言:javascript复制 curl: (7) Failed connect to 127.0.0.1:8081; Connection refused因为k8s主节点使用了认证,如果直接使用命令会拒绝连接,需要使用kube-proxy进行代理8081端口
使用kube-proxy开启端口
代码语言:javascript复制 kubectl proxy --port=8081 输出结果:
代码语言:javascript复制 Starting to serve on 127.0.0.1:8081打开新的终端,再次执行上述命令,返回如下内容
代码语言:javascript复制 curl -k -H "Content-Type: application/json" -X PUT --data-binary @redis.json http://127.0.0.1:8081/api/v1/namespaces/redis/finalize输出结果:
代码语言:javascript复制 {
"kind": "Namespace",
"apiVersion": "v1",
"metadata": {
"name": "redis",
"uid": "acce79d4-f8a4-4e99-8085-bdf7ef481901",
"resourceVersion": "77013481",
"creationTimestamp": "2023-04-06T08:20:21Z",
"deletionTimestamp": "2024-01-22T09:37:32Z",
"labels": {
"kubernetes.io/metadata.name": "redis"
},
"managedFields": [
{
"manager": "kubectl-create",
"operation": "Update",
"apiVersion": "v1",
"time": "2023-04-06T08:20:21Z",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:labels": {
".": {},
"f:kubernetes.io/metadata.name": {}
}
}
}
},
{
"manager": "kube-controller-manager",
"operation": "Update",
"apiVersion": "v1",
"time": "2024-01-22T09:37:38Z",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:status": {
"f:conditions": {
".": {},
"k:{"type":"NamespaceContentRemaining"}": {
".": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
},
"k:{"type":"NamespaceDeletionContentFailure"}": {
".": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
},
"k:{"type":"NamespaceDeletionDiscoveryFailure"}": {
".": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
},
"k:{"type":"NamespaceDeletionGroupVersionParsingFailure"}": {
".": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
},
"k:{"type":"NamespaceFinalizersRemaining"}": {
".": {},
"f:lastTransitionTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
}
}
}
},
"subresource": "status"
}
]
},
"spec": {},
"status": {
"phase": "Terminating",
"conditions": [
{
"type": "NamespaceDeletionDiscoveryFailure",
"status": "True",
"lastTransitionTime": "2024-01-22T09:37:37Z",
"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": "2024-01-22T09:37:38Z",
"reason": "ParsedGroupVersions",
"message": "All legacy kube types successfully parsed"
},
{
"type": "NamespaceDeletionContentFailure",
"status": "False",
"lastTransitionTime": "2024-01-22T09:37:38Z",
"reason": "ContentDeleted",
"message": "All content successfully deleted, may be waiting on finalization"
},
{
"type": "NamespaceContentRemaining",
"status": "False",
"lastTransitionTime": "2024-01-22T09:37:38Z",
"reason": "ContentRemoved",
"message": "All content successfully removed"
},
{
"type": "NamespaceFinalizersRemaining",
"status": "False",
"lastTransitionTime": "2024-01-22T09:37:38Z",
"reason": "ContentHasNoFinalizers",
"message": "All content-preserving finalizers finished"
}
]
}
}查看ns是否被删除
代码语言:javascript复制 kubectl get ns输出结果
代码语言:javascript复制 NAME STATUS AGE
argocd Active 327d
default Active 327d
ingress-apisix Active 27d
ingress-nginx Terminating 235d
istio-ingress Active 103d
istio-system Active 103d
kube-node-lease Active 327d
kube-public Active 327d
kube-system Active 327d
kubernetes-dashboard Active 327d
observability Active 173d
prometheus Active 255d其他Terminating状态的ns也可以使用上述方法删除


