跳到主要内容

回滚

回滚用于升级后控制面异常时恢复到上一个可用版本。回滚前应判断问题是否来自 Chart、镜像、CRD、values、webhook 证书或外部依赖。

回滚前判断

先确认 Helm revision:

helm history testudo -n disaster-system

检查当前状态:

kubectl -n disaster-system get pods
kubectl -n disaster-system describe pod <pod-name>
kubectl -n disaster-system get events --sort-by=.lastTimestamp

如果问题来自对象存储、远端集群不可达、镜像仓库或 License,不应优先回滚 Chart。

执行 Helm 回滚

helm rollback testudo <REVISION> -n disaster-system

观察 rollout:

kubectl -n disaster-system rollout status deploy/disaster-server
kubectl -n disaster-system rollout status deploy/disaster-web
kubectl -n disaster-system rollout status deploy/disaster-operator-controller-manager

CRD 回滚注意事项

Helm 回滚不一定会安全回滚 CRD。若新版本已经写入旧版本不认识的字段,直接回滚 controller 可能导致:

  • 旧 controller 忽略新字段。
  • status 解析失败。
  • webhook 校验逻辑不匹配。

因此 CRD 变更版本必须在发布说明中给出迁移和回滚策略。没有明确策略时,不建议自动回滚 CRD。

回滚后验证

kubectl -n disaster-system get disasterinstances.testudo.softcdata.com
kubectl -n disaster-system get disasteroperation
kubectl -n disaster-system get appbackups,apprestores

在控制台确认:

  • 登录正常。
  • 实例列表和详情页正常。
  • Watch 事件流正常。
  • 备份/恢复/容灾操作历史可读。

何时不要回滚

  • 正在执行 failover、reprotect、undo、cancel 或 drill cleanup。
  • 新版本已经完成 CRD 数据迁移,旧版本不兼容。
  • 问题是远端集群或对象存储故障。
  • 问题是业务工作负载自身不可用。

这类情况应先暂停新操作,保留现场,再根据发布说明执行人工恢复。