Velero 接 RustFS 实操:K8s 集群备份落到自建对象存储

K8s 备份分两层:集群资源对象(yaml)直接序列化进备份桶;PV 数据要另选路径。云上有卷快照插件,自建存储通常没有对等能力,所以走 Velero 的 File System Backup(FSB):每个节点跑 node-agent,把 PV 数据当文件复制进桶。这篇把备份后端接到自建的 RustFS 上,从装到恢复演练走一遍,Velero 当前最新版 v1.18。

FSB 用之前对齐三件事:官方定性 beta 质量,前提 K8s v1.16.0+ 且启用 MountPropagation;实现实际走 kopia,restic 路径已进弃用流程(v1.17 起禁 restic 备份,v1.19 起连恢复也关);限制有四条------hostPath 卷不支持(local PV 支持)、只能备被 Pod 挂载的卷(孤儿 PVC 要先起 staging pod)、增量链只对 PVC 保持、大文件去重扫描慢。安全上记住一条:FSB 备份仓库用静态公共密钥,官方原话"任何能访问你备份存储的人都能解密你的备份数据",桶策略按"看到桶=看到全部数据"收紧。

第一步:起 RustFS,建桶

bash 复制代码
docker run -d \
  --name rustfs \
  --restart unless-stopped \
  -p 9000:9000 \
  -p 9001:9001 \
  -v rustfs-data:/data \
  -e RUSTFS_ACCESS_KEY="<your-access-key>" \
  -e RUSTFS_SECRET_KEY="<your-secret-key>" \
  -e RUSTFS_ADDRESS=":9000" \
  -e RUSTFS_CONSOLE_ADDRESS=":9001" \
  -e RUSTFS_CONSOLE_ENABLE=true \
  rustfs/rustfs:latest \
  /data

建一个 Velero 专用桶,凭证单发(给备份系统单独一把 key,权限面小):

bash 复制代码
export AWS_ACCESS_KEY_ID=<your-access-key>
export AWS_SECRET_ACCESS_KEY=<your-secret-key>
aws --endpoint-url http://localhost:9000 s3 mb s3://velero

第二步:凭证文件与 velero install

AWS 风格凭证文件 credentials-velero:

ini 复制代码
[default]
aws_access_key_id = <your-access-key>
aws_secret_access_key = <your-secret-key>

装服务端(全文最关键的一条命令):

bash 复制代码
velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.14.x \
    --bucket velero \
    --secret-file ./credentials-velero \
    --use-volume-snapshots=false \
    --use-node-agent \
    --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://<rustfs-host>:9000 \
    --wait

参数里最要命的是 s3ForcePathStyle="true":不设时 AWS SDK 走 virtual-host 寻址(桶名进域名),自建服务默认只认 path-style(桶名进路径),不匹配的后果是 Velero 能把备份传上去、但下载不了,恢复时才炸。官方给了真实 issue 作例子,另一条解法是服务端配 MINIO_DOMAIN 支持 virtual-host,多数场景设 true 更省事。插件版本按兼容表对齐:插件 v1.14.x 对 Velero v1.18.x(v1.13.x 对 1.17.x、v1.12.x 对 1.16.x)。

第三步:第一个备份

bash 复制代码
velero backup-location get
velero backup create demo-backup --selector app=demo --default-volumes-to-fs-backup
velero backup describe demo-backup --details

--default-volumes-to-fs-backup 让 PV 数据走 FSB(也可以在 install 时带上,对所有备份生效)。describe 看两个东西:Phase 是否 Completed、FSB 条目有没有挂错误。桶里此时应出现备份 tarball 和 FSB 数据对象,node-agent 日志是 FSB 排障第一入口。

第四步:恢复演练

bash 复制代码
kubectl delete namespace <demo-ns>
velero restore create --from-backup demo-backup
velero restore get

STATUS 走到 Completed、WARNINGS 和 ERRORS 都是 0 才算数。有错就 velero restore describe <name> --details。另有一类静默失败:官方文档写明,属主权限由挂载配置强制的卷(Azure Files SMB、blobfuse、GCP FUSE 这类),恢复时 chown/chmod 返回成功但什么都没改、零告警;自建 ext4/xfs PVC 不在此列,但演练时抽查一两个文件的属主权限,成本很低。

定时备份一条命令:

bash 复制代码
velero schedule create demo-daily --schedule="0 1 * * *" --selector app=demo --default-volumes-to-fs-backup

自建后端的五个坑

1. describe 打不开下载链接 。预签名 URL 默认指向 s3Url 的集群内地址,笔记本上打不开。修法:BackupStorageLocation 加 publicUrl(集群外可达地址,NodePort 或 Ingress,必须带 http:// 或 https:// 前缀)。

2. 自签名证书 。HTTPS 自签时两条路:BSL config 设 insecureSkipTLSVerify: "true",或提交 CA 证书。官方自己标注前者有中间人风险、不推荐生产,生产配 CA。

3. 上传报校验类错误 。AWS 插件默认给上传对象附 CRC32 校验和(BSL config 键 checksumAlgorithm,默认 CRC32),自建端点不支持时设为空字符串关掉。注意这和 JuiceFS 的 disable-checksum 不是一层:Velero 这个管 AWS SDK 请求头校验和,JuiceFS 那个管自身写进对象元数据的 CRC。

4. 签名版本 。预签名 URL 默认 SigV4,极少数实现只认 V1,BSL config 里 signatureVersion: "1" 是官方留的开关。

5. 桶上别叠 lifecycle / object lock / 版本控制 。Velero 备份自带 --ttl 管理(默认 30 天,GC 每小时清理),v1.11 起备份完成时要改写桶内对象元数据,配了不可变保留备份删除会出问题;object lock 只作用于版本化桶,此时删备份只打 delete marker、旧版本不删、空间不回收。备份桶默认不开版本控制;防误删非要开,就自己补一条非当前版本的过期规则。

小结

Velero 把备份的调度、资源序列化、PV 数据搬运全做了,对后端的要求只有三个词:S3 兼容、path-style、稳定可达。RustFS 单二进制起服务,S3 全兼容,接进来就是建一个桶加三条 config 的成本。备份系统里最不该薄的是演练,第四步每周跑一次,比任何配置优化都值钱。

相关推荐
leo在掘金27 分钟前
2.8万亿MoE跑昇腾:0 Day适配改了啥
后端·架构
小兔子28 分钟前
proxy_pass 末尾写不写路径,是两套规则:上线后接口路径莫名多了一段
后端
IT枫斗者枫哥30 分钟前
用了BigDecimal还差一分?用四组Java代码查清原因
java·后端
时光不老杰33 分钟前
01 总体架构与模块边界
后端
贾公子37 分钟前
从单条内容到账号维度——AIGC 风险评分的工程实现
后端·python
一条泥憨鱼1 小时前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
孟陬3 小时前
Foobar 技术周刊#160:大模型让大规模形式化软件验证成为现实丨AI写C++代码之后会发生什么?丨我们真的需要alpha() 函数吗丨重试,有时会让故障更
前端·后端·typescript
BingoGo3 小时前
PHP 标准库的价值远不止少写几行代码
后端·php
JaguarJack3 小时前
PHP 标准库的价值远不止少写几行代码
后端·php·服务端