跳到主要内容

卸载

卸载 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,处理顺序为:

  1. 删除 Testudo validating webhook,避免删除过程中的 CR 更新被旧 webhook 拦截。
  2. 清理 Testudo CR 实例上的 finalizer。
  3. 删除 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/shkubectl。当前 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 元数据。
  • StorageRepositoryClusterDisasterInstance 等 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