容灾排障:实例、同步、切换和演练
容灾排障要沿着资源关系看:DisasterInstance 派生 DataSync 和 ResourceSync,用户动作创建 DisasterOperation,演练创建 DisasterDrill。
快速定位
| 现象 | 优先检查 |
|---|---|
实例停在 Pending | 基础配置、集群、仓库、策略是否存在 |
实例停在 Initializing | 首次 DataSync 或 ResourceSync 是否失败 |
实例 ConfigError | 命名空间、策略、恢复策略、集群引用 |
| DataSync 失败 | AppBackup/AppRestore、Velero、对象存储 |
| ResourceSync 失败 | 目标集群 CRD、资源冲突、modifier |
| Failover 失败 | DisasterOperation steps、目标副本、最终同步 |
| Reprotect 失败 | 反向集群访问、反向策略、角色状态 |
实例 Failed 且 reason=RoleDriftDetected | 管理面期望主备、两个下游集群 Deployment/StatefulSet 副本 |
| Drill 失败 | 备份可用性、目标命名空间、清理残留 |
如果错误信息里出现 expectedPrimary=... role=Standby ... expectedSecondary=... role=Standby ... both clusters are scaled to zero,说明两个下游集群都被采样为 0 副本。详细判定逻辑和修复方式见 主备角色漂移与副本一致性检查。
必查资源
kubectl get disasterinstance,datasync,resourcesync,disasteroperation,disasterdrill -A
kubectl get events -A --sort-by=.lastTimestamp | tail -100
kubectl -n disaster-system logs deploy/disaster-operator --tail=300
查看某个实例:
kubectl get disasterinstance <name> -o yaml
kubectl get datasync,resourcesync -l testudo.softcdata.com/instance=<name>
kubectl get disasteroperation -l testudo.softcdata.com/instance=<name>
Failover 卡住
按 step 排查:
PreCheck:实例和同步状态是否健康。PauseSchedules:是否有并发操作。ScaleDownSource:源集群访问和 workload 权限。FinalSync:最后一次备份恢复是否成功。ScaleUpTarget:目标集群资源和副本。CheckReplicas:Pod 是否 Ready,是否需要跳过 Ready 检查。SwitchRoles:status 更新和角色关系。
演练清理失败
检查:
- 演练命名空间是否有 finalizer。
- PVC/PV 是否被保护策略阻止删除。
- 临时 Ingress 或 Service 是否仍被外部控制器占用。
- Drill 对象状态是否允许再次 cleanup。
处理原则
- 不要直接手改 status。
- 不要在一个实例上并发触发多个高风险操作。
- 保留失败 operation 和 events,直到定位完成。
- 修改恢复策略后先手动同步,再执行 Failover。
- 对生产问题,先判断是否需要 Cancel,避免自动重试扩大影响。