kubernetes删除ns异常状态为:Terminating

在尝试删除kuboard命名空间时遇到问题,状态保持为Terminating。首先尝试使用kubectl的--grace-period=0--force参数强制删除,但未成功。然后通过kubernetes-API来删除:获取命名空间的JSON文件,编辑移除finalizers配置,通过kubectlproxy开启代理,最后使用curl更新API以删除命名空间,成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在部署kuboard控制平台的时候,不规范删除,导致ns状态为Terminating

[root@master01 ~]# kubectl delete namespace kuboard 

^C
root@master01 ~]# kubectl get ns
NAME              STATUS        AGE
default           Active        25h
kube-flannel      Active        24h
kube-node-lease   Active        25h
kube-public       Active        25h
kube-system       Active        25h
kuboard           Terminating   21h
[root@master01 ~]#

尝试1,还是不行

使用 -grace-period=0 --force 参数强行删除,还是不行

[root@master01 ~]# kubectl delete namespace kuboard  --grace-period=0 --force
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 "kuboard" force deleted


^C
[root@master01 ~]# 
[root@master01 ~]# kubectl  get ns
NAME              STATUS        AGE
default           Active        39h
kube-flannel      Active        39h
kube-node-lease   Active        39h
kube-public       Active        39h
kube-system       Active        39h
kuboard           Terminating   36h

尝试2,调用kubernetes-API删除

感谢大哥的文章: http://www.manongjc.com/detail/40-xxgstfjidoveeot.html

1、首先,获取要删除 NameSpace 的 JSON 文件:

替换其中的 <terminating-namespace> 为实际 namespace
kubectl get namespace <terminating-namespace> -o json >tmp.json

[root@master01 ~]# kubectl get namespace kuboard -o json > tmp.json

2、编辑上一步导出的 json 文件,去除 spec.finalizers 配置

[root@master01 ~]# vim tmp.json
····
    "spec": {
        "finalizers": []
····

image

3、打开另一个ssh窗口运行kubectl proxy开启代理

[root@master01 ~]# kubectl proxy
Starting to serve on 127.0.0.1:8001

4、删除 namespace

其中 tmp.json 为第一步中导出的 json 文件, 需替换为实际的 namespace
$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/ /finalize

[root@master01 ~]# kubectl  get ns
NAME              STATUS        AGE
default           Active        39h
kube-flannel      Active        39h
kube-node-lease   Active        39h
kube-public       Active        39h
kube-system       Active        39h
kuboard           Terminating   36h
[root@master01 ~]# 
[root@master01 ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/kuboard/finalize


}[root@master01 ~]# kubectl  get ns
NAME              STATUS   AGE
default           Active   39h
kube-flannel      Active   39h
kube-node-lease   Active   39h
kube-public       Active   39h
kube-system       Active   39h
[root@master01 ~]#

image

完成对namespace状态Terminating的删除

<think>好的,用户现在问的是K8S命名空间终止状态的处理与强制删除方法。首先,我需要回忆一下Kubernetes中命名空间的生命周期。当一个命名空间被删除时,Kubernetes会将其状态设置为Terminating,并开始清理其中的资源。如果某些资源无法被正常删除,命名空间可能会一直卡在Terminating状态。 接下来,我需要考虑用户为什么会遇到这个问题。可能的情况是用户尝试删除一个命名空间,但里面有资源未被正确清理,或者有finalizer阻止了删除操作。用户可能已经尝试过普通的删除命令,但发现命名空间一直处于Terminating状态,所以想要强制删除的方法。 用户可能对Kubernetes的finalizer机制不太熟悉,需要解释什么是finalizer以及它们的作用。同时,用户可能需要具体的操作步骤来解决这个问题,尤其是如何绕过finalizer强制删除命名空间。 我需要确保回答的结构清晰,分步骤说明问题原因和解决方法。首先解释Terminating状态的成因,然后介绍常规处理方法,如果不行再引导用户进行强制删除。强制删除涉及到直接修改Kubernetes的API资源,需要谨慎操作,所以必须提醒用户注意风险,确认命名空间内没有重要资源。 另外,用户可能是在生产环境中操作,所以需要强调备份和谨慎操作的重要性。同时,用户可能需要不同的方法,比如使用kubectl命令或者直接调用API,需要提供多种解决方案。 最后,总结预防措施,帮助用户避免未来再次遇到类似问题,比如在删除命名空间前确保资源已清理,或者检查finalizer的设置。</think>--- ### K8S 命名空间终止状态Terminating)的成因 当删除 Kubernetes 命名空间时,如果命名空间内**存在未清理的资源**或**某些 Finalizer 未完成**,命名空间会进入 `Terminating` 状态且无法自动删除。常见原因包括: 1. **资源残留** 命名空间中仍有未被删除的资源(如自定义资源、未完成的 Job/Pod)。 2. **Finalizer 阻塞** 资源或命名空间本身绑定了 Finalizer(如 `kubernetes`、`metacontroller`),这些 Finalizer 需执行完特定操作才能释放。 3. **APIService 异常** 管理资源的 APIService 不可用,导致无法完成删除操作。 --- ### 常规处理方法 #### 1. 检查残留资源 ```bash kubectl api-resources --verbs=list --namespaced -o name | xargs -n1 kubectl get --show-kind --ignore-not-found -n <NAMESPACE> ``` - **作用**:列出命名空间中所有资源,确认是否有残留。 #### 2. 手动清理残留资源 ```bash kubectl delete <RESOURCE_TYPE>/<NAME> -n <NAMESPACE> --force --grace-period=0 ``` - **关键参数**: `--force`:强制删除 `--grace-period=0`:跳过等待期 --- ### 强制删除命名空间(终极方案) 如果常规方法无效,可通过**移除 Finalizer** 强制删除命名空间: #### 步骤 1:导出命名空间配置 ```bash kubectl get ns <NAMESPACE> -o json > ns.json ``` #### 步骤 2:编辑 JSON 文件 删除 `finalizers` 字段内容: ```json { "spec": { "finalizers": [] // 清空此数组 } } ``` #### 步骤 3:通过 API 直接更新 ```bash kubectl replace --raw "/api/v1/namespaces/<NAMESPACE>/finalize" -f ./ns.json ``` - **原理**:绕过 Finalizer 逻辑,强制解除终止状态。 --- ### 替代方法:使用 `kubectl proxy` 如果 APIServer 访问受限,可通过代理直接操作 API: ```bash kubectl proxy & # 启动代理 curl -X PUT http://localhost:8001/api/v1/namespaces/<NAMESPACE>/finalize \ -H "Content-Type: application/json" \ --data-binary @ns.json ``` --- ### 注意事项 1. **风险提示** - 强制删除可能**导致残留资源泄漏**(如未释放的存储卷、负载均衡器)。 - 操作前务必确认命名空间内**无重要资源**。 2. **预防措施** - 删除命名空间前,先删除其下所有资源: ```bash kubectl delete all --all -n <NAMESPACE> ``` - 检查并清理自定义资源的 Finalizer。 --- ### 总结流程 ```text 检查残留资源 → 强制删除残留 → 清空 Finalizer → 强制更新命名空间 ``` 通过以上方法可解决 99% 的命名空间卡死问题。如果仍无法解决,需检查集群组件(如 APIService、控制器管理器)是否异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弧襪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值