拆除赛博防盗门:如何安全卸载 Sealed Secrets
🏗️ 拆迁前的致命警告 (The OwnerReference Trap)
Section titled “🏗️ 拆迁前的致命警告 (The OwnerReference Trap)”在动用挖掘机之前,包工头必须先弄清楚 Kubernetes 底层极其冷酷的垃圾回收逻辑:属主引用 (OwnerReferences)。
当我们使用 Sealed Secrets 时,Controller 会读取我们提交的乱码 (SealedSecret 资源),并在同命名空间下生成一个真实的密码 (Secret 资源)。
在这个过程中,Controller 会给真实的 Secret 打上一个烙印:“你的主人是那个 SealedSecret”。
致命后果:
如果你直接卸载 Sealed Secrets 并删除了它的 CRD(自定义资源定义),集群里所有的 SealedSecret 会瞬间消失。K8s 垃圾回收器一看“主人死了”,就会把底层真实的 Secret 全部一起拉去陪葬。
你的数据库、网盘、可视化面板会在下一次重启时,因为找不到密码而全部崩溃瘫痪!
🔐 第一阶段:跑路前的保命操作 (备份主密钥)
Section titled “🔐 第一阶段:跑路前的保命操作 (备份主密钥)”无论你是想重装集群,还是想迁移到其他加密方案(如 SOPS 或 External Secrets),备份主密钥都是重中之重。丢失了这把私钥,你存在 GitHub 上的所有加密乱码将永远变成解不开的死数据。
打开终端,从系统核心区 (kube-system) 提取你的主密钥并保存到本地安全的地方:
# 提取带有特定标签的主密钥 Secret,并导出为 YAMLkubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > sealed-secrets-master-key-backup.yaml✂️ 第二阶段:无损剥离与拆除 (Safe Teardown)
Section titled “✂️ 第二阶段:无损剥离与拆除 (Safe Teardown)”如果你希望在卸载 Sealed Secrets 之后,集群里的应用依然能拿着现有的明文密码继续运行(无损拆除),你需要遵循以下步骤。
步骤 1:解除密码的“主仆契约”
Section titled “步骤 1:解除密码的“主仆契约””我们需要切断真实 Secret 与 SealedSecret 之间的属主绑定。这可以通过批量 Patch 抹除 ownerReferences 来实现(需要宿主机安装 jq 工具)。
执行以下硬核除名脚本(遍历所有命名空间):
# 找出所有由 SealedSecret 生成的真实 Secret,并切断它们的从属关系kubectl get secrets --all-namespaces -o json | jq '.items[] | select(.metadata.ownerReferences != null) | select(.metadata.ownerReferences[].kind == "SealedSecret") | .metadata.namespace + " " + .metadata.name' | tr -d '"' | while read -r ns name; do echo "正在解放密码: $ns / $name" kubectl patch secret $name -n $ns --type=json -p='[{"op": "remove", "path": "/metadata/ownerReferences"}]'done执行完毕后,所有的业务密码都变成了自由的 K8s 原生对象,不再受 Sealed Secrets 牵连。
步骤 2:纯手工物理强拆解密守卫
Section titled “步骤 2:纯手工物理强拆解密守卫”既然密码已经自由,且我们准备对集群进行彻底重置,我们就不再依赖任何自动化工具,直接使用 K8s 原生命令进行“物理强拆”。
我们需要把部署在核心区 (kube-system) 的 Controller、Service 以及配套的 RBAC 权限全部清理干净。为了精准打击且不误伤其他核心组件,我们利用标签 (Label) 进行批量扫荡:
# 1. 拆除运行中的核心建筑(Pod、Service、Deployment 等)kubectl delete all -l app.kubernetes.io/name=sealed-secrets -n kube-system
# 2. 清扫遗留的系统权限(Role、ClusterRole 等),不留任何幽灵后门kubectl delete clusterrole,clusterrolebinding -l app.kubernetes.io/name=sealed-secrets 2>/dev/nullkubectl delete role,rolebinding -l app.kubernetes.io/name=sealed-secrets -n kube-system 2>/dev/null(💡 监理提示:如果你当初是直接使用原生的 helm install 命令安装的,这里也可以更优雅地使用 helm uninstall sealed-secrets -n kube-system 一键卸载。但使用上述的标签扫荡法作为兜底,是最为彻底的。)
步骤 3:深度清理地基与残骸
Section titled “步骤 3:深度清理地基与残骸”为了保证赛博堡垒的绝对干净,我们需要把底层的 CRD 协议和留存的主密钥彻底铲平。
1. 销毁加密协议图纸 (CRD):
# 这会删除集群中所有的 SealedSecret 乱码对象,但因为我们在步骤 1 解除了绑定,真实 Secret 不会受影响kubectl delete crd sealedsecrets.bitnami.com2. 销毁集群中的主密钥:
虽然 Controller 死了,但主密钥可能还静静地躺在 kube-system 里。
kubectl delete secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key🎉 验收与后续规划
Section titled “🎉 验收与后续规划”巡查集群状态:
kubectl get pods -n kube-system | grep sealed如果没有任何输出,恭喜你!这扇“赛博防盗门”已经被你完美拆除,而且大楼里的所有业务都在照常营业。