如何将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统计文件数,两个结果一致说明全量数据无丢失
- 原Harbor宿主机执行
- 修复目录权限(如果解压后权限不对):
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
相关产品推荐
相关产品推荐

