K8s 焦土政策:网关与证书系统的终极卸载指南
This content is not available in your language yet.
这是一份针对 Kubernetes 集群的**“彻彻底底、连根拔起”**清理方案。
当你的网关和证书系统因为各种改动搅得一团糟,且面临诸如 ArgoCD 陷入死锁、命名空间卡在 Terminating 无法删除等极其顽固的底层状态错误时,**“焦土政策(物理核平)”**绝对是最有效、最干净的排障手段。
请严格按照以下顺序执行。这套连招能保证把系统里的残留基因拔得干干净净,绝不影响下一次重装。
☢️ 第一阶段:斩断源头 (切断 ArgoCD 重建链)
Section titled “☢️ 第一阶段:斩断源头 (切断 ArgoCD 重建链)”在使用 GitOps (如 ArgoCD) 时,决不能直接去删底层资源,否则 ArgoCD 会发现“建筑没了”,并立刻把它们重新拉起来。我们必须先切断图纸的下发。
1. 尝试常规删除应用
Section titled “1. 尝试常规删除应用”kubectl delete application cert-manager traefik -n argocd2. 遭遇死锁?强行剥夺 ArgoCD 的遗愿清单
Section titled “2. 遭遇死锁?强行剥夺 ArgoCD 的遗愿清单”如果上面的命令卡住转圈(报错 metadata.finalizers: Forbidden),说明 ArgoCD 本身陷入了死结。立刻打开新终端,执行强制“拔管”:
kubectl patch application cert-manager -n argocd -p '{"metadata": {"finalizers": null}}' --type mergekubectl patch application traefik -n argocd -p '{"metadata": {"finalizers": null}}' --type merge执行后,ArgoCD 面板上的应用会瞬间消失,系统不再自动重建。
💣 第二阶段:深度扫荡 (清理 Webhooks 与 全局 CRDs)
Section titled “💣 第二阶段:深度扫荡 (清理 Webhooks 与 全局 CRDs)”这是 99% 的人重装失败的根源! 命名空间好删,但全局注册的蓝图规范(CRD)和拦截器(Webhook)如果不清空,下次安装必定会报出各种版本冲突。
1. 摧毁潜伏的 Webhook
Section titled “1. 摧毁潜伏的 Webhook”Cert-manager 会向 K8s API Server 注入拦截器,必须优先干掉,否则它会拦截你接下来的所有安装请求:
kubectl delete validatingwebhookconfiguration cert-manager-webhook --ignore-not-foundkubectl delete mutatingwebhookconfiguration cert-manager-webhook --ignore-not-found2. 屠宰所有相关 CRD (蓝图基因)
Section titled “2. 屠宰所有相关 CRD (蓝图基因)”# 删光 Traefik 和 Cert-manager 的残留基因kubectl get crd -o name | grep -E 'traefik|cert-manager' | xargs kubectl delete3. 扫荡残留的“全局权限” (RBAC)
Section titled “3. 扫荡残留的“全局权限” (RBAC)”这一步经常被忽视,导致重装时报 Ownership/Adoption 错误:
# 清理集群级别的角色与绑定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(保护锁)。
1. 强制“碎锁”局部资源
Section titled “1. 强制“碎锁”局部资源”在删除 Namespace 之前,先手动清除这些顽固住户的遗愿清单:
# 定义目标命名空间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 mergedone2. 物理超度 Namespace
Section titled “2. 物理超度 Namespace”现在执行删除指令,由于内部资源已碎锁,它们会随街区一并消失:
kubectl delete namespace cert-manager traefik --force --grace-period=0💀 第四阶段:物理超度 (清理僵尸命名空间)
Section titled “💀 第四阶段:物理超度 (清理僵尸命名空间)”如果执行完第三步,使用 kubectl get ns 发现它们依然死死卡在 Terminating 状态,说明遭遇了**“僵尸命名空间”**。动用最后的 API 接口直连手段:
1. 开启通向集群心脏的后门
Section titled “1. 开启通向集群心脏的后门”kubectl proxy &2. 发射核弹指令,清空命名空间的 Finalizers
Section titled “2. 发射核弹指令,清空命名空间的 Finalizers”直接调用 API 接口,强行抹除 Namespace 最后的执念:
# 针对 cert-managercurl -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
# 针对 traefikcurl -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/finalize3. 验尸与关门
Section titled “3. 验尸与关门”# 确认僵尸已经彻底消失kubectl get ns
# 杀掉后台开启的 kubectl proxykill %1💡 架构师总结 走完这完整的四阶段,你的集群就真正回到了**“像素级纯净”**的状态。所有的 Role、ServiceAccount 和全局权限都已化为灰烬。现在,你可以放心地去推送你配置了 OpenDNS 5353 端口 的新图纸,享受一次零报错的全新丝滑安装体验!