卸载
卸载 Testudo 前必须确认要删除的是控制面、CRD 还是备份数据。不同选择会影响是否还能继续查看历史状态和恢复数据。
卸载模式
| 模式 | 删除内容 | 保留内容 | 场景 |
|---|---|---|---|
| 仅卸载控制面 | operator/server/web Deployment、Service 等 Helm 资源 | CRD、对象存储数据、远端集群 Velero 资源 | 临时下线或迁移控制面 |
| 卸载控制面并保留备份 | Helm 资源和部分平台配置 | 对象存储备份数据 | 停用系统但保留恢复能力 |
| 完全清理 | Helm 资源、CRD、Secret、备份数据 | 无 | 实验环境销毁 |
生产环境默认不建议完全清理。
卸载前检查
kubectl -n disaster-system get disasteroperation
kubectl -n disaster-system get appbackups,apprestores
kubectl -n disaster-system get disasterdrills.testudo.softcdata.com
确认:
- 没有正在执行的长流程操作。
- 已导出需要保留的 CRD。
- 已确认对象存储 bucket 是否保留。
- 已确认远端集群上的 Velero 资源是否保留。
- 已通知使用控制台和 API 的用户。
仅卸载 Helm release
helm uninstall testudo -n disaster-system
检查残留资源:
kubectl -n disaster-system get all
kubectl get crd | grep testudo.softcdata.com
注意:CRD 是否会被删除取决于 Chart 包如何管理 CRD。卸载前应先用 helm get manifest 确认。
卸载时删除 Testudo CRD
Helm 默认不会删除通过 Chart crds/ 目录安装的 CRD。普通安装、升级或仅卸载控制面时不需要设置 uninstallCleanup.enabled;只有明确要在卸载时一并删除 Testudo CRD 和对应 CR 实例,才需要先把当前 release 升级到包含清理 hook 的 Chart,并启用 uninstallCleanup.enabled:
helm repo update
helm upgrade testudo testudo/testudo-chart \
-n disaster-system \
--reuse-values \
--set uninstallCleanup.enabled=true
如果使用离线包或私有 Chart 仓库,把 testudo/testudo-chart 替换为安装或升级时使用的同一个 Chart 引用。不要直接卸载旧 release 后再期望新 Chart 的清理逻辑生效;Helm 只会执行当前 release 中已经保存的 hook。
启用后执行卸载:
helm uninstall testudo -n disaster-system --wait --timeout 10m
清理 hook 会在卸载前运行 testudo-crd-cleanup Job,处理顺序为:
- 删除 Testudo validating webhook,避免删除过程中的 CR 更新被旧 webhook 拦截。
- 清理 Testudo CR 实例上的 finalizer。
- 删除 Testudo CRD。
删除 CRD 会删除对应的全部 Testudo CR 实例数据。生产环境启用前应确认不再需要保留这些 CR,或已完成导出备份。uninstallCleanup.deleteVeleroCrds 默认是 false;不要在仍有其他 Velero 实例或备份数据依赖时删除 Velero CRD。
如果卸载卡在清理 Job,先查看事件和日志:
kubectl -n disaster-system get job,pod | grep testudo-crd-cleanup
kubectl -n disaster-system describe job testudo-crd-cleanup
kubectl -n disaster-system logs job/testudo-crd-cleanup --all-containers
常见原因是清理镜像无法拉取,或镜像不包含 /bin/sh、kubectl。当前 Chart 默认使用 docker.io/dtzar/helm-kubectl:3.17.3 作为清理镜像;离线环境需要提前把该镜像同步到集群可拉取的镜像仓库,并通过以下 values 覆盖:
uninstallCleanup:
enabled: true
kubectlImage:
repository: <registry.example.com>/dtzar/helm-kubectl
tag: "3.17.3"
如果你的集群里残留 CRD 或 CR 数量比较多,或者 apiserver 响应比较慢,可以继续提高 uninstallCleanup.timeoutSeconds。这个值会同时决定单个 CRD 的等待时间和 Job 的整体 deadline;helm uninstall --wait --timeout 也要留出更长的余量。
如果未删除 CRD 和历史 CR 实例,下次重新安装时可能遇到类似错误:
admission webhook "vdisasterinstance.kb.io" denied the request:
ModifierRuleRejected: load disasterConfig <name> failed:
DisasterConfig.testudo.softcdata.com "<name>" not found
该问题通常不是新安装本身失败,而是旧 DisasterInstance 等 CR 残留并带有 finalizer,同时引用的 DisasterConfig 已经被删除。operator 尝试移除 finalizer 时会触发 webhook 更新校验,webhook 又加载不到旧引用对象,最终拒绝更新。
保留数据
如需保留恢复能力,应保留:
- 对象存储 bucket 和备份对象。
- Velero Backup/Restore 元数据。
StorageRepository、Cluster、DisasterInstance等 CRD 导出文件。- values 文件和镜像版本记录。
危险操作
以下操作会造成不可逆数据丢失,生产环境必须二次确认:
kubectl delete crd <name>.testudo.softcdata.com
kubectl delete namespace disaster-system
mc rm --recursive --force <bucket/path>
不要在不确认备份保留策略的情况下删除对象存储 bucket。
卸载后验证
- 控制台入口不可访问。
- Server API 不再响应。
- 业务集群工作负载不应因控制面卸载而被自动删除。
- 对象存储数据按预期保留或删除。
- 如保留 CRD,后续重新安装后应能重新读取现有状态。
如果启用了 CRD 清理,还应确认 Testudo CRD 已删除:
kubectl get crd | grep testudo.softcdata.com || true
kubectl -n disaster-system get job,pod | grep testudo-crd-cleanup || true