在 Kubernetes 中,有时候删除资源对象(如 Namespace)时会卡住无法删除完成,这通常是因为存在 finalizers。以下是几种强制删除资源对象的方式。

1. 仅删除

1
kubectl delete namespace <ns>

2. 强制删除

1
2
# --grace-period=0: 设置优雅删除时间为 0
kubectl delete namespace <ns> --force --grace-period=0

3. 修改 finalizers 字段

1
2
kubectl edit namespace <ns>
# 查找 finalizers,将后面的值置为 []

4. 通过 API 接口修改 finalizers

通过 Kubernetes 提供的 API 接口,修改 .spec.finalizersmetadata.finalizers 字段,将值置为 [],从而让 Kubernetes 直接删除该资源。

1
2
3
4
5
6
7
8
9
10
11
# 1. 导出 namespace JSON
kubectl get namespace <ns> -o json > xx.json

# 2. 编辑该 xx.json 文件,修改 .spec.finalizers 字段,将后面的值置为 []

# 3. 另开一个终端,开启 k8s apiserver 的一个 http 代理,以免必须带上证书才能访问
kubectl proxy --port=8081

# 4. 另开一个界面执行以下命令
curl -k -H "Content-Type: application/json" -X PUT --data-binary @xx.json \
http://127.0.0.1:8081/api/v1/namespaces/<ns>/finalize