使用 Velero 备份 Harbor 的 Chart 与镜像

解读

在国内金融、运营商、政务云等合规场景下,Harbor 作为企业级镜像仓库往往存放了 Helm Chart 与容器镜像双资产,任何误删、勒索病毒、Region 级灾难都可能导致“无镜像可拉”的 P0 故障。面试官问“用 Velero 备份 Harbor”,核心不是让你背命令,而是考察你是否能把“Kubernetes 应用备份”与“非 Pod 资产(镜像层、Chart 包)”两条链路打通,并给出可落地的国产化方案(含 OSS、S3 兼容、商用存储、信创 CPU 适配)。答得太浅(只备份 PV)会被追问“镜像 blob 呢?”;答得太偏(直接 rsync /data)会被质疑“为什么还用 Velero?”必须让 Velero 只做它擅长的事,把 Harbor 自有的“镜像/Chart 冗余机制”与 Velero 的“集群级逻辑备份”互补,才能体现资深 Docker 工程师的边界感与架构能力。

知识点

  1. Harbor 2.x 存储模型:镜像层、Chart 分别存于 registry 容器内的 /storage 与 chartmuseum 的 /chart_storage,底层可对接 阿里云 OSS、华为云 OBS、MinIO、CephRGW、NFS;路径按 digest 两级散列,删除操作先改 PostgreSQL 元数据,再 GC 回收 blob。
  2. Velero 1.11+ 备份维度
    • 逻辑备份:K8s 资源(Deployment、Secret、ConfigMap、CRD 等)→ 存到 S3/OSS 的 /metadata 前缀。
    • 快照备份:PVC 通过 CSI 插件触发底层存储打快照(如阿里云云盘快照、Ceph RBD snap),快照链与 Velero 备份 CR 强绑定
  3. 镜像层“可重建”原则:只要 registry 的 /storage 目录不丢,PostgreSQL 元数据完整即可重建索引;Chart 包同理
  4. 国内云厂商合规要求
    • 跨 Region 复制:阿里云 OSS 跨区域复制需开启“KMS 加密同步”,否则 Velero 恢复时会出现 403。
    • 信创 ARM 环境:Velero 官方镜像为 AMD64,需重新编译 velero/velero-plugin-for-aws 并推送至私有仓库。
  5. 最小 RPO 策略
    • 镜像层:Harbor 自身“复制策略”做实时镜像级同步(主备实例),Velero 仅每日逻辑备份 PostgreSQL 与配置文件,RPO 15 min
    • Chart 包:ChartMuseum 开启 --depth=1 本地缓存,Velero 备份其 PVC;若使用 Harbor 内置 ChartMuseum(已废弃),需迁移到 OCI 存储 Chart,直接走 registry 存储,统一路径降低复杂度
  6. 恢复演练
    • 单 namespace 级恢复velero restore create --from-backup harbor-backup-20240520 --include-namespaces harbor --preserve-nodeports;恢复后需执行 registryctl garbage-collect --delete-untagged 清理悬空层。
    • 全集群级灾难:新集群先装 Velero + 原 Region OSS bucket,恢复 PostgreSQL PVC 后,需手动触发 registryctl migrate 重建项目权限与机器人账户 Secret。

答案

步骤 1:前置条件(国产化场景)

  • 已有 Harbor 2.8 运行在 ACK 1.26,存储使用 阿里云 OSS Bucket A(北京),通过 internal-oss endpoint 内网域名访问;PostgreSQL 为 Harbor 自带 Bitnami PG 13 单实例,PVC 挂在云盘。
  • 安装 Velero 1.11,镜像已重编译为 linux/arm64 & linux/amd64 双架构,插件使用 velero-plugin-alibabacloud v1.9,备份仓库指向 OSS Bucket B(上海),开启 KMS 服务端加密。

步骤 2:拆分备份对象

  1. Kubernetes 逻辑资源:Deployment、Service、Ingress、Secret(core.harbor 域名证书)、ConfigMap(registryctl config)、HarborCluster CR(goharbor.io/v1beta1)。
  2. 持久化数据
    • PostgreSQL PVC:云盘 100 Gi,挂载路径 /bitnami/postgresql。
    • Registry 存储:实际在 OSS Bucket A,Velero 无法打快照,需用 Harbor 复制策略同步到 Bucket C(乌兰察布合规区)。
    • ChartMuseum PVC:若未迁移到 OCI,需备份其本地 /chart_storage;已迁移则跳过。

步骤 3:Velero 备份计划

# 每日 02:00 全量逻辑备份,保留 30 天
velero create schedule harbor-backup \
  --schedule="0 2 * * *" \
  --include-namespaces harbor \
  --default-volumes-to-fs-backup=false \
  --snapshot-volumes=true \
  --storage-location oss-shanghai \
  --volume-snapshot-locations alibabacloud-beijing

解释

  • --snapshot-volumes=true 仅对云盘类 PVC 生效,确保 PostgreSQL 数据一致性。
  • registry 层数据不走 Velero,由 Harbor 复制策略实时同步到 Bucket C,RPO 5 min

步骤 4:备份验证

  • 查看备份完成:velero backup describe harbor-backup-20240520 --details
  • 校验 OSS Bucket B 出现 /metadata/harbor-backup-20240520/ 目录,大小约 180 Mi(含 1.2 万条 K8s 资源)。
  • 校验 Bucket C 镜像层与 Chart 总数与源站一致:aws s3 --endpoint-url=http://oss-cn-wulanchabu-internal.aliyuncs.com ls s3://harbor-backup-bucket/charts/ | wc -l

步骤 5:灾难恢复演练(季度)

  1. 新建 ACK 集群(版本 ≥1.26),安装同版本 Velero,使用原 Bucket B 作为只读备份仓库
  2. 恢复命名空间:velero restore create --from-backup harbor-backup-20240520 --include-namespaces harbor
  3. 恢复后检查:
    • PostgreSQL Pod 启动后,执行 SELECT count(*) FROM project; 项目数量一致。
    • Registry Pod 启动后,手动触发一次 GC 空跑(不加 --delete-untagged),确认 blob 引用链完整。
    • 登录 Harbor UI,重新创建机器人账户 Secret(因 Secret 的 serviceaccount 令牌在新集群失效)。
  4. 业务验证:
    • 任选业务 namespace 创建 Pod,imagePullSecret 指向新 Harbor,kubectl 拉取镜像成功
    • helm install 测试 Chart,chartmuseum 返回 201,确认 Chart 层恢复。

步骤 6:回退策略
若恢复后镜像层出现 “blob unknown” 404,说明 Bucket C 同步延迟,可临时 修改 registry config.yml 增加 redirect->disable: true,让 registry 直接代理回源 Bucket A(北京),保证业务先跑起来,再后台重新同步缺失 blob。

拓展思考

  1. 双引擎备份:Velero 仅解决“K8s 逻辑 + 有状态 PVC”一致性,镜像层必须依赖 Harbor 复制 + 存储桶跨区域复制;若预算充足,可启用 Harbor “双活”模式(主主复制),Velero 降级为“配置备份”,RPO 接近 0。
  2. OCI Artifacts 统一:Helm 3.8+ 支持 Chart 以 OCI 格式存 registry,未来 ChartMuseum 将彻底移除;提前把 Chart 推送到 oci://harbor.xxx.com/chartrepo/project,Velero 只需备份 registry 同一套存储,简化路径
  3. 信创环境适配:鲲鹏 ARM 服务器需重新编译 registry、chartmuseum、velero-plugin-alibabacloud,并验证 ossfs 1.91 的 arm64 rpm;同时把 Velero 的 restic 改为 kopia,性能提升 30%。
  4. 合规审计:金融客户要求备份数据 不可变存储,可在 OSS Bucket B 开启 WORM(合规保留策略)1-10 年,Velero 备份 CR 增加 backup-ttl=0 防止误删,满足等保 2.0 三级“数据完整性”条款