最近因为基础设施调整,需要进行harbor 镜像仓库的迁移,主要是旧版本很老了,不想使用,直接
打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间
版本过度进行迁移,但是需要测试,好多功能,而且配置有点费事,尽管官方提供了升级说明,但是没敢
用,就怕出故障

解决方法

  • rest api 请求流程
    还好harbor 提供了rest api,还算比较全,project , repo,tags, 因为harbor 的界面就是基于bff 模式开发
    的,所以直接通过查看web 的api 请求,直接可以方便的了解api 的请求流程。
  • 镜像迁移流程
    容器镜像的额复制功能在harbor早期版本(新版没有太多了解),实际上就是pull push
    所以我的处理方式:
    有两个harbor 服务:新的以及旧的,同时都配置了ssl 证书(可信)
    调用api 获取实际需要的docker image : 格式dockerimagehost/project/image:tag
    处理同步:
 
docker pull dockerimageold/project/image:tag
docker tag dockerimageold/project/image:tag  dockerimagenew/project/image:tag
docker push dockerimagenew/project/image:tag

详细处理

为了简化同步,使用了管理员的权限,同时对于project 的权限,也是可以通过rest api 操作的

准备上边的同步shell

为了方便使用nodejs 开发

  • 项目准备
yarn init -y
  • 添加rest api 请求处理npm 包
yarn add node-fetch 
  • 添加npm scripts 并行处理npm 包
yarn  add  npm-run-all --dev 
  • 简单代码演示

    因为项目原因,只粘贴部分代码,如果后边有时间可以搞成一个通用的服务,同时演示的代码是固定project的,
    当然这样是有原因的,类似分治,可以方便问题project 单独快速处理

 
const fetch = require('node-fetch');
var project_images = []
// fetch project repos
fetch(`https://dockerimageold/api/repositories?project_id=projectid`, {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json',
        "Authorization": "Basic base64username+password"
    }
}).then(res => res.json()).then(repos => {
    repos.forEach(repo => {
        setTimeout(() => {
            fetch(`https://dockerimageold/api/repositories/tags?repo_name=${repo}`, {
                    method: 'GET',
                    headers: {
                        'Content-Type': 'application/json'
                    }
                })
                .then(res => res.json())
                .then(tags => {
                    if (tags.length > 0) {
                        tags.forEach(tag => {
                                let imageinfo = {
                                    reponame: repo,
                                    oldimageinfo: `dockerimageold/${repo}:${tag}`,
                                    newimageinfo: `dockerimagenew/${repo}:${tag}`,
                                    repo_image: `${repo}:${tag}`
                                };
                                project_images.push(imageinfo)
                        });
                    }
                })
                .catch(err => {
                    console.log(repo)
                })
        }, 1000)
    })
})
setTimeout(() => {
    project_images.forEach(item => {
        pull_push_sh = `docker pull dockerimageold/${item.repo_image} && docker tag dockerimageold/${item.repo_image} dockerimagenew/${item.repo_image} && docker push dockerimagenew/${item.repo_image}`
        console.log(pull_push_sh)
    })
}, 10000)
  • 以上代码说明
    代码很简单,就是循环处理docker image,因为我们需要的也是docker image
  • npm script 添加
    为了方便project,快速生成使用了npm-run-all 可以并行以及串行,快速的生成,很灵活,配置如下:
 
"scripts": {
    "run-all":"npm-run-all remove:sh --parallel g:*",
    "remove:sh":"rm -rf sh/*",
    "g:activitycenter": "node activitycenter.js > sh/activitycenter.sh",
    "g:common": "node common.js > sh/common.sh",
    "g:coredns": "node coredns.js > sh/coredns.sh",
    "g:dalong": "node dalong.js > sh/dalong.sh",
    "g:demo-space": "node demo-space.js > sh/demo-space.sh",
    "g:demoapp": "node demoapp.js > sh/demoapp.sh",
    "g:droneci": "node droneci.js > sh/droneci.sh",
    "g:formbuilder": "node formbuilder.js > sh/formbuilder.sh",
    "g:gf-performance-bulletin": "node gf-performance-bulletin.js > sh/gf-performance-bulletin.sh",
    "g:gitbase": "node gitbase.js > sh/gitbase.sh",
    "g:graylog": "node graylog.js > sh/graylog.sh",
    "g:ingress-nginx": "node ingress-nginx.js > sh/ingress-nginx.sh",
    "g:itapiway": "node itapiway.js > sh/itapiway.sh",
    "g:java": "node java.js > sh/java.sh",
    "g:jenkins-docker": "node jenkins-docker.js > sh/jenkins-docker.sh",
    "g:jenkins": "node jenkins.js > sh/jenkins.sh",
    "g:jira": "node jira.js > sh/jira.sh"
  }

说明:
我没生成的使用都是执行 yarn run-all 但是为了保证数据都是新的,每次都先删除老的shell,重新生成,同时对于生成
是并行的,可以快速帮助我们生成shell

  • 项目结构
    项目结构大体如下:(我删除了部分)
 
├── README.md
├── code
│ ├── activitycenter.js
│ ├── app.js
│ ├── common.js
│ ├── coredns.js
│ ├── dalong.js
│ ├── demo-space.js
│ ├── demoapp.js
│ ├── droneci.js
│ ├── formbuilder.js
│ ├── gf-performance-bulletin.js
│ ├── gitbase.js
│ ├── graylog.js
│ ├── ingress-nginx.js
│ ├── itapiway.js
  .......
│ ├── java.js
│ ├── jenkins-docker.js
│ ├── rhel7.js
│ ├── sh
│ │ ├── activitycenter.sh
│ │ ├── common.sh
│ │ ├── coredns.sh
│ │ ├── dalong.sh
│ │ ├── demo-space.sh
│ │ ├── demoapp.sh
 ......
│ │ ├── droneci.sh
│ │ ├── formbuilder.sh
│ │ ├── gf-performance-bulletin.sh
│ │ ├── gitbase.sh
│ │ ├── graylog.sh
│ │ ├── ingress-nginx.sh
│ └── yarn.lock
└── run.sh
  • 一键式同步
    因为上边以及生成的单proejct 的同步shell,所以为了方便,外部有一个run.sh 的文件,可以批量执行同步,之后就是dns 记录的修改了
    新镜像使用以前的域名(这个需要重新生成安装,但是因为数据是使用了数据卷,没关系)
    代码如下:
 
#!/usr/bin/sh
for file in code/sh/*.sh; do
   ./$file
done

同步执行

很简单,我们只需要执行 sh run.sh 就可以了,注意shell 脚本需要添加执行权限

说明

对于用户、权限的额同步,以上没有列出来,但是我们也是可以调用rest api 处理的,而且上边的代码,部分是写死的,后边
找点时间重构下,搞成一个通用的工具,方便迁移

参考资料

https://github.com/goharbor/harbor 
https://github.com/mysticatea/npm-run-all 
https://github.com/bitinn/node-fetch

使用nodejs+ harbor rest api 进行容器镜像迁移的更多相关文章

  1. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

    为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...

  2. Harbor实现容器镜像仓库的管理和运维

    本次分享主要讲述了在开发运维中的管理容器镜像方法.为了便于说明原理,较多地使用Harbor作为例子. 内容主要包括: 开发和生产环境中镜像仓库的权限控制: 镜像远程同步(复制)的原理: 大规模应用镜像 ...

  3. 私有容器镜像仓库harbor

    私有镜像仓库Harbor 1.Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用 ...

  4. 企业级Docker容器镜像仓库Harbor的搭建

    Harbor简述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理 ...

  5. Registry 容器镜像服务端细节

    引言 通常我们在使用集群或者容器的时候,都会接触到存储在本地的镜像,也或多或少对本地镜像存储有一定的了解.但是服务端的镜像存储细节呢?本文主要介绍容器镜像的服务端存储结构,对于自建镜像服务或是对容器镜 ...

  6. 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...

  7. Harbor镜像迁移

    目录 背景说明 方案实现 背景说明 在早期生产环境尝试使用docker的时候,虽然使用了harbor作为镜像仓库,但是并没有做好相关存储规划,所有的镜像都直接存储到了harbor本地.随着业务发展,本 ...

  8. vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版

    vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版 vuejs技术交流QQ群:458915921 有兴趣的可以加入 vuejs 目录结构 build build.js check ...

  9. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

随机推荐

  1. 【题解】Luogu P5324 [BJOI2019]删数

    原题传送门 易知这个数列的顺序是不用考虑的 我们看两个数列 \(1,2,3\)和\(3,3,3\)都能删完,再看两个数列\(1,2,3,4\)和\(2,2,4,4\),也都能删完 不难发现,我们珂以把 ...

  2. HTTP响应状态

    状态码分类 状态码详解 状态码 英文提示 说明 100 Continue 继续 101 Switching Protocols 切换协议.服务器根据客户端的请求切换协议.只能切换到更高级的协议,例如, ...

  3. EgretWing链接微信开发工具调试问题

    EgretWing链接微信开发工具调试问题 EgretWing 编译器支持持三种调试模式,Node.js .Chrome .EgretWing 扩展开发. 开发过程中会遇到工具配置错误. 这就需要在E ...

  4. Mars Sample 使用说明

    Mars Sample 使用说明  https://github.com/Tencent/mars/wiki/Mars-sample-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98 ...

  5. 不安全的验证码Insecure CAPTCHA

    没啥好讲的,当验证不合格时,通过burp抓包工具修改成符合要求的数据包.修改参数标志位.USER-AGENT之类的参数. 防御 加强验证,Anti-CSRF token机制防御CSRF攻击,利用PDO ...

  6. k8s--yml文件

  7. React-Native控件的生命周期

    React-Native控件的生命周期

  8. JS 对象 数组求并集,交集和差集

    一.JS数组求并集,交集和差集 需求场景 最近,自己项目中有一些数组操作,涉及到一些数学集的运算,趁着完成后总结一下. 简化问题之后,现有两数组a = [1, 2, 3],b = [2, 4, 5], ...

  9. Redis中如何发现并优化big key?

    Redis中的大key一直是重点需要优化的对象,big key既占用比较多的内存,也可能占用比较多的网卡资源,造成redis阻塞,因此我们需要找到这些big key进行优化 一.寻找big key 通 ...

  10. centos 宝塔 使用命令行快速导入数据库sql

    先将sql文件上传到服务器,例如上传到www文件夹 然后打开命令行工具 输入 mysql -u 数据库用户名 -p 然后复制密码进去 然后输入 use 数据库名 回车 然后输入 source /www ...