观察 DataSync:Trafficless Restore 与 PVC 数据同步
DataSync 负责把源集群 PVC 数据同步到目标集群。它通常通过 AppBackup 和 AppRestore 驱动 Velero 完成备份和恢复。
如果需要先理解底层机制,见 数据同步原理。
执行链路
- DataSync 根据策略触发。
- 在源集群创建 AppBackup。
- AppBackup 创建 Velero Backup。
- 备份数据写入对象存储。
- 在目标集群创建 AppRestore。
- AppRestore 创建 Velero Restore。
- 目标集群 PVC 数据恢复完成。
- DataSync 记录 last backup、last restore 和 history。
Trafficless Restore
Trafficless Restore 的目标是让 PVC 数据先到达目标集群,但不让 standby 工作负载提前对外服务。它通常与 ResourceSync 的 standby modifier 一起使用。
无 PVC 时的跳过行为
DataSync 只负责 PVC 数据。如果源端保护范围内没有可恢复 PVC,系统会把本次数据同步收敛为成功跳过:
- 不创建或触发
AppBackup。 - 不创建
AppRestore。 - 不要求
StorageRepository已经就绪。 DataSync.status.history记录为Skipped,统计时计入 completed,不计入 failed。
PVC 发现会同时检查两类来源:
- 直接匹配保护命名空间和实例
labelSelector的 PVC。 - 匹配到的 Pod 所引用的 PVC。
因此,如果实例使用了 label selector,selector 需要能覆盖需要保护的 PVC,或者至少覆盖引用这些 PVC 的 Pod。否则 DataSync 会认为没有可恢复 PVC 并跳过。
跳过指定 PVC
如果只想在数据同步时跳过个别 PVC,例如 bk-job-pv-claim-job-local 或 license-pvc-claim,优先在 PVC 上添加 Velero 排除注解:
kubectl -n blueking annotate pvc bk-job-pv-claim-job-local \
velero.io/exclude-from-backup=true --overwrite
kubectl -n blueking annotate pvc license-pvc-claim \
velero.io/exclude-from-backup=true --overwrite
如果该 PVC 仍被工作负载 Pod 通过文件系统备份路径挂载,还需要在工作负载 Pod template 上排除对应 volume 名称。示例:
kubectl -n blueking patch deploy <workload-name> --type merge -p '{
"spec": {
"template": {
"metadata": {
"annotations": {
"backup.velero.io/backup-volumes-excludes": "job-local,license"
}
}
}
}
}'
backup.velero.io/backup-volumes-excludes 的值是 Pod 中的 volume 名称,不是 PVC 名称。执行前用下面命令确认映射:
kubectl -n blueking get pod <pod-name> \
-o jsonpath='{range .spec.volumes[*]}{.name}{" -> "}{.persistentVolumeClaim.claimName}{"\n"}{end}'
查看状态
kubectl get datasync -l testudo.softcdata.com/instance=<name>
kubectl get datasync <name> -o yaml
kubectl get appbackup,apprestore -l testudo.softcdata.com/datasync=<name>
在控制台中,可以从实例详情或任务事件查看同步结果。

健康标准
- 最近一次数据同步成功。
- DataSync history 中有备份和恢复名称。
- 目标集群 PVC 已恢复。
- 目标侧工作负载没有提前对外服务。
- 对象存储容量增长符合预期。
常见问题
- 数据量大导致 RPO 达不到策略周期。
- 目标 StorageClass 不兼容。
- Velero PodVolumeRestore 失败。
- 备份成功但目标集群 BSL 不可用。
- standby Pod 被错误扩容,提前访问外部系统。
- 实例 label selector 没有命中 PVC 或挂载 PVC 的 Pod,导致 DataSync 被判定为无 PVC 并跳过。