You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Harbor的/data/registry文件迁移到Rook Ceph持久卷

Harbor镜像数据从Docker部署本地盘迁移到K8s Rook-Ceph持久卷操作步骤

前置准备(避免迁移数据不一致)

  • 停止原Docker部署的Harbor所有服务,阻断新写入:进入原Docker部署Harbor的工作目录(存放docker-compose.yml的路径),执行docker-compose down,确认所有Harbor相关容器完全退出,无残留进程写/data/registry路径。
  • 停止K8s集群中Helm部署的Harbor Registry组件,避免目标存储出现无关写入:执行kubectl scale deployment <你的Harbor Helm发布名>-registry --replicas=0 -n <Harbor所在K8s命名空间>,等待Registry Pod完全终止后再执行后续操作。

步骤1:定位目标存储并准备全量备份

  • 在原Harbor部署机上打包Registry数据,保留完整权限、扩展属性,避免迁移后服务读文件报错:
cd /data
tar -zcvf registry-backup.tar.gz registry/ --selinux --acls --xattrs
  • 打包完成后,将registry-backup.tar.gz传输到K8s集群任意一台工作节点的/tmp目录下,记好这台节点的主机名。
  • 查询K8s中Harbor Registry绑定的PVC名称:
kubectl get pvc -n <Harbor所在K8s命名空间> | grep registry
# 输出结果中类似<harbor-release-name>-harbor-registry的资源就是目标PVC,记好名称

步骤2:启动临时迁移Pod挂载目标PVC

临时Pod使用和现有Helm部署Harbor完全一致的Registry镜像,保证UID/GID匹配,避免权限问题。新建migrate-harbor.yaml配置文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: harbor-data-migrate
  namespace: <Harbor所在K8s命名空间>
spec:
  containers:
  - name: migrate
    image: goharbor/registry-photon:<和你现有Harbor版本匹配的镜像tag>
    command: ["sleep", "36000"]
    volumeMounts:
    - name: target-registry-storage
      mountPath: /var/lib/registry
    - name: backup-storage
      mountPath: /backup
  volumes:
  - name: target-registry-storage
    persistentVolumeClaim:
      claimName: <之前查到的Registry PVC名称>
  - name: backup-storage
    hostPath:
      path: /tmp
      type: Directory
  nodeSelector:
    kubernetes.io/hostname: <你存放备份包的K8s节点主机名>
  restartPolicy: Never

执行kubectl apply -f migrate-harbor.yaml启动Pod,等待Pod状态变为Running。

步骤3:解压数据并校验一致性

  • 进入临时Pod:
kubectl exec -it harbor-data-migrate -n <Harbor所在K8s命名空间> -- bash
  • 先确认目标挂载路径为空,再解压备份包:
ls -l /var/lib/registry # 新部署无数据时该目录为空
tar -zxvf /backup/registry-backup.tar.gz -C /var/lib/registry --strip-components=1

注意:--strip-components=1参数是为了去掉打包时带的registry父目录,保证解压后/var/lib/registry路径下直接是docker目录,和Harbor默认存储结构一致。

  • 校验文件数量一致性:
    • 原Harbor宿主机执行find /data/registry -type f | wc -l统计文件数
    • 临时Pod内执行find /var/lib/registry -type f | wc -l统计文件数,两个结果一致说明全量数据无丢失
  • 修复目录权限(如果解压后权限不对):
chown -R 10000:10000 /var/lib/registry
# Harbor官方Registry镜像默认使用UID/GID 10000的用户运行服务

步骤4:恢复服务并验证

  • 退出临时Pod,删除迁移用资源:
kubectl delete -f migrate-harbor.yaml
  • 恢复Registry组件副本数:
kubectl scale deployment <你的Harbor Helm发布名>-registry --replicas=1 -n <Harbor所在K8s命名空间>
  • 等待所有Harbor组件Pod状态恢复为Running后,登录Harbor UI检查镜像列表完整性,分别验证镜像拉取、推送功能正常即可。

补充:如果你的镜像总量很大,业务中断窗口要求短,可以在第一次全量迁移完成后,短暂启动原Docker Harbor做一次增量rsync同步,再停服做最终切流,大幅缩短中断时间。

内容的提问来源于stack exchange,提问作者Alejandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:24:13