跳转到内容

K8s 焦土政策:网关与证书系统的终极卸载指南

🌱 创建: 2026/04/27 ⏱️ 更新: 2026/05/22

这是一份针对 Kubernetes 集群的**“彻彻底底、连根拔起”**清理方案。

当你的网关和证书系统因为各种改动搅得一团糟,且面临诸如 ArgoCD 陷入死锁、命名空间卡在 Terminating 无法删除等极其顽固的底层状态错误时,**“焦土政策(物理核平)”**绝对是最有效、最干净的排障手段。

严格按照以下顺序执行。这套连招能保证把系统里的残留基因拔得干干净净,绝不影响下一次重装。


☢️ 第一阶段:斩断源头 (切断 ArgoCD 重建链)

Section titled “☢️ 第一阶段:斩断源头 (切断 ArgoCD 重建链)”

在使用 GitOps (如 ArgoCD) 时,决不能直接去删底层资源,否则 ArgoCD 会发现“建筑没了”,并立刻把它们重新拉起来。我们必须先切断图纸的下发。

Terminal window
kubectl delete application cert-manager traefik -n argocd

2. 遭遇死锁?强行剥夺 ArgoCD 的遗愿清单

Section titled “2. 遭遇死锁?强行剥夺 ArgoCD 的遗愿清单”

如果上面的命令卡住转圈(报错 metadata.finalizers: Forbidden),说明 ArgoCD 本身陷入了死结。立刻打开新终端,执行强制“拔管”:

Terminal window
kubectl patch application cert-manager -n argocd -p '{"metadata": {"finalizers": null}}' --type merge
kubectl patch application traefik -n argocd -p '{"metadata": {"finalizers": null}}' --type merge

执行后,ArgoCD 面板上的应用会瞬间消失,系统不再自动重建。


💣 第二阶段:深度扫荡 (清理 Webhooks 与 全局 CRDs)

Section titled “💣 第二阶段:深度扫荡 (清理 Webhooks 与 全局 CRDs)”

这是 99% 的人重装失败的根源! 命名空间好删,但全局注册的蓝图规范(CRD)和拦截器(Webhook)如果不清空,下次安装必定会报出各种版本冲突。

Cert-manager 会向 K8s API Server 注入拦截器,必须优先干掉,否则它会拦截你接下来的所有安装请求:

Terminal window
kubectl delete validatingwebhookconfiguration cert-manager-webhook --ignore-not-found
kubectl delete mutatingwebhookconfiguration cert-manager-webhook --ignore-not-found
Terminal window
# 删光 Traefik 和 Cert-manager 的残留基因
kubectl get crd -o name | grep -E 'traefik|cert-manager' | xargs kubectl delete

3. 扫荡残留的“全局权限” (RBAC)

Section titled “3. 扫荡残留的“全局权限” (RBAC)”

这一步经常被忽视,导致重装时报 Ownership/Adoption 错误:

Terminal window
# 清理集群级别的角色与绑定
kubectl get clusterrole,clusterrolebinding -o name | grep -E 'cert-manager|traefik' | xargs kubectl delete
# 清理隐藏在 kube-system 核心区的领导者选举权限
kubectl get role,rolebinding -o name -n kube-system | grep cert-manager | xargs -I {} kubectl delete {} -n kube-system

🧨 第三阶段:核平街区 (强制清理 Namespace 内部残留)

Section titled “🧨 第三阶段:核平街区 (强制清理 Namespace 内部残留)”

如果你发现 Namespace 删不掉,或者里面总剩下一堆 Role, Service, ServiceAccount,那是它们身上带着 Finalizers(保护锁)

在删除 Namespace 之前,先手动清除这些顽固住户的遗愿清单:

Terminal window
# 定义目标命名空间
TARGET_NS=("cert-manager" "traefik")
for ns in "${TARGET_NS[@]}"; do
echo "正在强制碎锁 $ns 中的局部资源..."
# 批量清除 Role, RoleBinding, ServiceAccount, Service 的保护锁
kubectl get rolebinding,role,serviceaccount,service -n $ns -o name | xargs -I {} kubectl patch {} -n $ns -p '{"metadata":{"finalizers":null}}' --type merge
done

现在执行删除指令,由于内部资源已碎锁,它们会随街区一并消失:

Terminal window
kubectl delete namespace cert-manager traefik --force --grace-period=0

💀 第四阶段:物理超度 (清理僵尸命名空间)

Section titled “💀 第四阶段:物理超度 (清理僵尸命名空间)”

如果执行完第三步,使用 kubectl get ns 发现它们依然死死卡在 Terminating 状态,说明遭遇了**“僵尸命名空间”**。动用最后的 API 接口直连手段:

Terminal window
kubectl proxy &

2. 发射核弹指令,清空命名空间的 Finalizers

Section titled “2. 发射核弹指令,清空命名空间的 Finalizers”

直接调用 API 接口,强行抹除 Namespace 最后的执念:

Terminal window
# 针对 cert-manager
curl -H "Content-Type: application/json" -X PUT --data-binary "{\"kind\":\"Namespace\",\"apiVersion\":\"v1\",\"metadata\":{\"name\":\"cert-manager\"},\"spec\":{\"finalizers\":[]}}" http://localhost:8001/api/v1/namespaces/cert-manager/finalize
# 针对 traefik
curl -H "Content-Type: application/json" -X PUT --data-binary "{\"kind\":\"Namespace\",\"apiVersion\":\"v1\",\"metadata\":{\"name\":\"traefik\"},\"spec\":{\"finalizers\":[]}}" http://localhost:8001/api/v1/namespaces/traefik/finalize
Terminal window
# 确认僵尸已经彻底消失
kubectl get ns
# 杀掉后台开启的 kubectl proxy
kill %1

💡 架构师总结 走完这完整的四阶段,你的集群就真正回到了**“像素级纯净”**的状态。所有的 Role、ServiceAccount 和全局权限都已化为灰烬。现在,你可以放心地去推送你配置了 OpenDNS 5353 端口 的新图纸,享受一次零报错的全新丝滑安装体验!

最近更新: