暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何删除处于 terminating 状态命名空间

IT那活儿 2025-08-11
114
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


问题背景

Kubernetes集群中,有时侯想要删掉某个长时间不用命名空间以释放资源却发现删不掉,经过反复删除发现想要删除命名空间处在Terminating状态,强制删除也无济于事。

作者也遇到这样事情,我又是如何删除掉呢?

#kubectl get ns
NAME                   STATUS       AGE
default               Active       44d
kube-node-lease       Active       44d
kube-public           Active       44d
kube-system           Active       44d
kubernetes-dashboard   Active       44d
rook-ceph             Terminating   15d

作者尝试了以下几种方式:
  • 使用 "kubectl delete ns rook-ceph" 删除,失败;

  • 使用 "kubectl delete ns rook-ceph --grace-period=0 --force" 强制删除,失败;

  • 使用调用api-server接口进行删除,删除成功。



操作步骤

2.1 使用 "kubectl delete ns rook-ceph" 删除

发现根本删除不掉,一直处于被夯住状态......, 最终不得使用 Ctrl +c 结束。

#kubectl delete ns rook-ceph 

namespace"rook-ceph" deleted

2.2 使用 "kubectl delete ns rook-ceph --grace-period=0 --force" 强制删除

#kubectl delete ns rook-ceph --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continueto run on the cluster indefinitely.
namespace "rook-ceph" force deleted
...............

同样,发现根本删除不掉,一直处于被夯住状态......, 最终不得使用 Ctrl +c 结束。

2.3 使用调用api-server接口进行删除
步骤一:将要删除命名空间使用“kubectl get ns rook-ceph -o json > rook-ceph.json” 该命令将其转化为json格式并保存在当前目录
#kubectl get ns
NAME                   STATUS       AGE
default               Active       44d
kube-node-lease       Active       44d
kube-public           Active       44d
kube-system           Active       44d
kubernetes-dashboard   Active       44d
rook-ceph             Terminating   15d
#kubectl get ns rook-ceph -o json > rook-ceph.json
#cat rook-ceph.json
{
"apiVersion""v1",
"kind""Namespace",
"metadata": {
      "annotations": {
          "kubectl.kubernetes.io/last-applied-configuration""{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"rook-ceph\"}}\n"
      },
      "creationTimestamp""2024-03-23T10:01:56Z",
      "deletionTimestamp""2024-04-07T13:15:10Z",
      "labels": {
          "kubernetes.io/metadata.name""rook-ceph"
      },
      "name""rook-ceph",
      "resourceVersion""658949",
      "uid""66c4eb8a-33ac-4cd3-a7b6-89398b739d6b"
  },
"spec": {
      "finalizers": [
          "kubernetes"
      ]
  },
"status": {
      "conditions": [
          {
              "lastTransitionTime""2024-04-08T03:30:14Z",
              "message""Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: stale GroupVersion discovery: metrics.k8s.io/v1beta1",
              "reason""DiscoveryFailed",
              "status""True",
              "type""NamespaceDeletionDiscoveryFailure"
          },
          {
              "lastTransitionTime""2024-04-07T13:15:41Z",
              "message""All legacy kube types successfully parsed",
              "reason""ParsedGroupVersions",
              "status""False",
              "type""NamespaceDeletionGroupVersionParsingFailure"
          },
          {
              "lastTransitionTime""2024-04-08T02:31:11Z",
              "message""All content successfully deleted, may be waiting on finalization",
              "reason""ContentDeleted",
              "status""False",
              "type""NamespaceDeletionContentFailure"
          },
          {
              "lastTransitionTime""2024-04-07T13:15:41Z",
              "message""Some resources are remaining: cephblockpools.ceph.rook.io has 1 resource instances, cephclusters.ceph.rook.io has 1 resource instances, cephfilesystems.ceph.rook.io has 1 resource instances, cephfilesystemsubvolumegroups.ceph.rook.io has 1 resource instances, configmaps. has 1 resource instances, secrets. has 1 resource instances",
              "reason""SomeResourcesRemain",
              "status""True",
              "type""NamespaceContentRemaining"
          },
          {
              "lastTransitionTime""2024-04-07T13:15:41Z",
              "message""Some content in the namespace has finalizers remaining: ceph.rook.io/disaster-protection in 2 resource instances, cephblockpool.ceph.rook.io in 1 resource instances, cephcluster.ceph.rook.io in 1 resource instances, cephfilesystem.ceph.rook.io in 1 resource instances, cephfilesystemsubvolumegroup.ceph.rook.io in 1 resource instances",
              "reason""SomeFinalizersRemain",
              "status""True",
              "type""NamespaceFinalizersRemaining"
          }
      ],
      "phase""Terminating"
  }
}
[root@k8s-master01 ~]#

步骤二:编辑rook-ceph.json文件,将spec.finalizers设为空数组

rook-ceph.json文件"spec"中"kubernetes"删除后保存。

"spec": {
  "finalizers": [
      "kubernetes"
  ]

更新后的样子:

"spec": {
      "finalizers": [
      ]
  },

步骤三:执行kubectl proxy,启动一个kube api server本地代理,待执行完删除命令后再结束掉
#kubectlproxy
Startingtoserveon 127.0.0.1:8001

步骤四:另开一个窗口执行 "curl -k -H Content-Type: application/json -X PUT --data-binary @rook-ceph.json http://127.0.0.1:8001/api/v1/namespaces/rook-ceph/finalize" 进行接口调用方式删除处于Terminating状态命名空间

注意:rook-ceph.json替换为步骤一当中你自己的json文件,127.0.0.1.8001替换为步骤三你自己kubectl proxy本地代理,rook-ceph替换为你将要删除命名空间名字。

[root@k8s-master01 ~]#curl -k -H Content-Type: application/json -X PUT --data-binary @rook-ceph.json http://127.0.0.1:8001/api/v1/namespaces/rook-ceph/finalize
{
"kind""Namespace",
"apiVersion""v1",
"metadata": {
"name""rook-ceph",
"uid""66c4eb8a-33ac-4cd3-a7b6-89398b739d6b",
"resourceVersion""658949",
"creationTimestamp""2024-03-23T10:01:56Z",
"deletionTimestamp""2024-04-07T13:15:10Z",
"labels": {
    "kubernetes.io/metadata.name""rook-ceph"
  },
"annotations": {
    "kubectl.kubernetes.io/last-applied-configuration""{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"rook-ceph\"}}\n"
  },
"managedFields": [
    {
      "manager""kubectl-create",
      "operation""Update",
      "apiVersion""v1",
      "time""2024-03-23T10:01:56Z",
      "fieldsType""FieldsV1",
      "fieldsV1": {
        "f:metadata": {
          "f:labels": {
            ".": {},
            "f:kubernetes.io/metadata.name": {}
          }
        }
      }
    },
    {
      "manager""kubectl-client-side-apply",
      "operation""Update",
      "apiVersion""v1",
      "time""2024-03-23T11:01:37Z",
      "fieldsType""FieldsV1",
      "fieldsV1": {
        "f:metadata": {
          "f:annotations": {
            ".": {},
            "f:kubectl.kubernetes.io/last-applied-configuration": {}
          }
        }
      }
    },
    {
      "manager""kube-controller-manager",
      "operation""Update",
      "apiVersion""v1",
      "time""2024-04-08T03:30:14Z",
      "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-04-08T03:30:14Z",
      "reason""DiscoveryFailed",
      "message""Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: stale GroupVersion discovery: metrics.k8s.io/v1beta1"
    },
    {
      "type""NamespaceDeletionGroupVersionParsingFailure",
      "status""False",
      "lastTransitionTime""2024-04-07T13:15:41Z",
      "reason""ParsedGroupVersions",
      "message""All legacy kube types successfully parsed"
    },
    {
      "type""NamespaceDeletionContentFailure",
      "status""False",
      "lastTransitionTime""2024-04-08T02:31:11Z",
      "reason""ContentDeleted",
      "message""All content successfully deleted, may be waiting on finalization"
    },
    {
      "type""NamespaceContentRemaining",
      "status""True",
      "lastTransitionTime""2024-04-07T13:15:41Z",
      "reason""SomeResourcesRemain",
      "message""Some resources are remaining: cephblockpools.ceph.rook.io has 1 resource instances, cephclusters.ceph.rook.io has 1 resource instances, cephfilesystems.ceph.rook.io has 1 resource instances, cephfilesystemsubvolumegroups.ceph.rook.io has 1 resource instances, configmaps. has 1 resource instances, secrets. has 1 resource instances"
    },
    {
      "type""NamespaceFinalizersRemaining",
      "status""True",
      "lastTransitionTime""2024-04-07T13:15:41Z",
      "reason""SomeFinalizersRemain",
      "message""Some content in the namespace has finalizers remaining: ceph.rook.io/disaster-protection in 2 resource instances, cephblockpool.ceph.rook.io in 1 resource instances, cephcluster.ceph.rook.io in 1 resource instances, cephfilesystem.ceph.rook.io in 1 resource instances, cephfilesystemsubvolumegroup.ceph.rook.io in 1 resource instances"
    }
  ]
}
}

执行完后,你会惊奇发现,处于Terminating状态命名空间就这样被删除了:

#kubectl get ns
NAME                   STATUS   AGE
default               Active   44d
kube-node-lease       Active   44d
kube-public           Active   44d
kube-system           Active   44d
kubernetes-dashboard   Active   44d

祝大家能够轻松删除处于Terminating状态命名空间!


END


本文作者:赵乐乐(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论