velero 不提供官方 go client,无法直接 import 或用 client-go 创建 backup 对象;正确方式是调用 velero cli 或开发 go 插件。

Velero 本身是用 Go 写的,但它不是 Go 库,不能直接 import 到你的 Go 程序里当 SDK 用;它是个独立 CLI + 控制器,Golang 在这里只负责写 Velero 插件或定制备份逻辑,而不是“用 Go 调 Velero 备份”。
Velero 没有官方 Go client 可直接调用 velero backup create
很多人以为能像操作 kubernetes/client-go 那样,用 Go 构造一个 Backup 对象然后 Create() —— 实际上 Velero 的 CRD(如 Backup, Restore)虽然存在,但它的控制器不接受裸对象创建,必须经由 velero CLI 或其内部 HTTP API(非公开、未文档化)触发。直接写 YAML + kubectl apply 也不行:Velero 控制器会拒绝非 CLI 签名的资源。
- CLI 创建时会在
Backup对象里注入velero.io/cli-version和签名 annotation,控制器校验失败就跳过 - 你用
client-go提交的Backup对象会被忽略,日志里只显示 “skipping invalid backup” - 想绕过?可以 patch annotation 模拟 CLI 签名,但版本不匹配或签名算法变更就会失效,不推荐
真正该用 Go 做的事:写 Velero 插件或封装 CLI 调用
如果你的灾备流程需要动态生成备份策略、过滤特定 label 的 Pod、或集成到现有 Go 后台服务中,正确路径是:
- 用
os/exec.Command("velero", "backup", "create", ...)调起 CLI,捕获 stdout/stderr 解析结果 —— 注意加--kubeconfig和--namespace参数,否则默认连不到目标集群 - 写
VolumeSnapshotter插件(Go 实现)来支持自定义存储后端,比如对接私有对象存储的非 S3 兼容接口 - 实现
ObjectStore插件处理备份数据上传/下载逻辑,这时才真正用到 Go 语言能力,且必须遵守 Velero 插件接口(如GetObjectStore方法)
示例:调 CLI 备份带 label 的 namespace
立即学习“go语言免费学习笔记(深入)”;
cmd := exec.Command("velero", "backup", "create",
"backup-"+time.Now().Format("20060102150405"),
"--include-namespaces", "prod",
"--selector", "app.kubernetes.io/managed-by=our-system")
备份一致性依赖 Kubernetes 原生机制,Go 代码无法绕过
Velero 的应用一致性靠的是 Velero Restic(已弃用)或 volume snapshots + pre/post hooks,这些和你的 Go 程序无关。你在 Go 里调一次 velero backup create,不代表备份就“成功”了 —— 它只是发起了一个异步任务。
- 必须轮询
Backup对象的.status.phase字段(InProgress/Completed/Failed),不能只看 CLI 返回 0 - hook 脚本(如
pre-backup.sh)必须放在 Pod 里,Go 程序没法替它执行数据库 flush - 如果用了
restic,备份速度受节点磁盘 IO 影响,Go 层无法加速或干预
最常被忽略的一点:Velero 的 BackupStorageLocation 必须提前配置好,且对应对象存储的 credential secret 必须存在于 velero namespace;Go 程序调 CLI 之前,得先检查这个资源是否存在、condition 是否为 Available,否则报错信息只会显示 “no backup storage locations available”,根本看不出是权限还是 endpoint 写错了。










