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以上版本适用)的主要内容,如果未能解决你的问题,请参考以下文章

担心Harbor数据丢失?谈谈Harbor的备份和恢复方法。

往harbor上传的镜像存在服务器哪里了呢

Harbor本地镜像库安装与使用

Harbor认证:K8S无法正常拉取harbor镜像

NVIDIA Jetson之TF卡系统镜像备份与恢复

使用nodejs+ harbor rest api 进行容器镜像迁移