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

上一篇:GraphQL:使用Golang构建一个博客引擎API


下一篇:使用Mapviz和天地图API绘制gvins算法的轨迹