Harbor API实现镜像备份与恢复方案(2.0以上版本适用)
Posted 帮我起个名
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Harbor API实现镜像备份与恢复方案(2.0以上版本适用)相关的知识,希望对你有一定的参考价值。
一、需求
只需要备份Harbor上的镜像,Harbor中存在很多不同的公有和私有项目,每个项目下又有很多镜像,每个镜像有不同版本的标签,考虑服务器成本,不能再搭一台Harbor来备份了,主备模式的备份方案无法使用;
较完整的Harbor备份可查看专栏《Harbor实战宝典》
二、方案设计
1、编写一个shell脚本(在备份主机上):
1)获取Harbor中所有的镜像;
2)通过docker下载获取到的镜像列表;
3)将下载到本地的镜像打成tar包,以便恢复;
4)删除下载到本地的镜像,减少磁盘空间的占用;
2、在备份主机安装docker,配置文件中指定Harbor的地址;
3、执行备份的shell脚本进行备份;
4、定期备份的设定,观察镜像上传频率,只需要每周备份一次即可;
该方案仅占用备份主机的磁盘空间,通过Harbor的管理界面看到需要备份镜像总大小为2T,
该方案的难点再于如何获取镜像的列表,查看官方文档,可以通过调用API接口的方式来获取镜像列表。
三、实战操作
3.1、备份主机上安装docker
本处以192.168.2.250:443为Harbor服务地址。
192.168.2.266为备份主机,用于备份镜像操作,本文所有操作皆在备份主机完成。
注意:需要在/etc/docker/damon.json文件中指定Harbor地址。
# yum install -y docker
# systemctl enable --now docker.service
# cat > /etc/docker/damon.json << EOF
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"insecure-registries":["192.168.2.250:443"],
"exec-opts": ["native.cgroupdriver=systemd"]
EOF
# systemctl restart docker && systemctl status docker
3.2、编写shell脚本
Go、python可参考该处
# vim Harback-v2.sh
#!/bin/bash
Harbor_Address=192.168.2.250:443 #Harbor主机地址
Harbor_User=admin #登录Harbor的用户
Harbor_Passwd=Harbor12345 #登录Harbor的用户密码
Images_File=harbor-images-`date '+%Y-%m-%d'`.txt #镜像清单文件
Tar_File=/backup/Harbor-backup/ #镜像tar包存放路径
###【】调用API接口获取Harbor中所有仓库的所有镜像及镜像的所有标签(tag):
#获取Harbor中所有的项目(含私有项目)
Project_List=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_Address/api/projects | grep name | awk '/"name": /' | awk -F '"' 'print $4'`
#获取项目下所有的镜像名称与标签:
for Project in $Project_List;do
Image_Names=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_Address/api/search?q=$Project | grep "repository_name" | awk -F "\\"" 'print $4'`
for Image in $Image_Names;do
Image_Tags=`curl -u $Harbor_User:Harbor_Passwd -X GET http://$Harbor_Address/api/repositories/$Image/tags | awk '/"name": /' | awk -F '"' 'print $4'`
for Tag in $Image_Tags;do
echo "$Harbor_Address/$Image:$Tag" | grep -v Base | grep -v Image >> $Images_File
done
done
done
###使用docker从镜像文件中下载镜像——将下载的镜像进行打包保存——删除下载到本地的镜像——将封装好的镜像包移动到备份目录
Image_tags=$(cat $Images_File)
for image_tag in $Image_tags;do
image_Name=$(echo $image_tag | awk -F/ 'print $3' | awk -F: 'print $1')
image_Lable=$(echo $image_tag | awk -F/ 'print $3' | awk -F: 'print $2')
docker pull $image_tag
docker save $image_tag -o $image_Name-$image_Lable.tar
docker rmi $image_tag
mv $image_Name-$image_Lable.tar $Tar_File
done
注🐖:
脚本分为上下两部分,上部分为获取Harbor中所有项目下所有的镜像(含私有项目),下部分为根据获取到的镜像清单使用docker执行镜像下载、打包、清理、tar包移到到镜像存放目录等。
3.3、执行镜像备份脚本
执行脚本前请确保本地的镜像为空
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# chmod +x Harback-v2.sh
# sh Harback-v2.sh
对于镜像较大,脚本执行时间长的,可通过以下命令将脚本放入后台执行。
# nohup sh Harback-v2.sh &
3.4、定时备份镜像
每周六晚上10点执行备份
编写计划任务
# crontab -e
0 22 * * 6 cd /root/ && nohup sh Harback-v2.sh &
然后到镜像备份目录下查看镜像包数量与镜像清单数量是否一致。
以上是关于Harbor API实现镜像备份与恢复方案(2.0以上版本适用)的主要内容,如果未能解决你的问题,请参考以下文章