使用nodejs+ harbor rest api 进行容器镜像迁移
最近因为基础设施调整,需要进行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 进行容器镜像迁移的更多相关文章
- 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...
- Harbor实现容器镜像仓库的管理和运维
本次分享主要讲述了在开发运维中的管理容器镜像方法.为了便于说明原理,较多地使用Harbor作为例子. 内容主要包括: 开发和生产环境中镜像仓库的权限控制: 镜像远程同步(复制)的原理: 大规模应用镜像 ...
- 私有容器镜像仓库harbor
私有镜像仓库Harbor 1.Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用 ...
- 企业级Docker容器镜像仓库Harbor的搭建
Harbor简述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理 ...
- Registry 容器镜像服务端细节
引言 通常我们在使用集群或者容器的时候,都会接触到存储在本地的镜像,也或多或少对本地镜像存储有一定的了解.但是服务端的镜像存储细节呢?本文主要介绍容器镜像的服务端存储结构,对于自建镜像服务或是对容器镜 ...
- 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...
- Harbor镜像迁移
目录 背景说明 方案实现 背景说明 在早期生产环境尝试使用docker的时候,虽然使用了harbor作为镜像仓库,但是并没有做好相关存储规划,所有的镜像都直接存储到了harbor本地.随着业务发展,本 ...
- vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版
vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版 vuejs技术交流QQ群:458915921 有兴趣的可以加入 vuejs 目录结构 build build.js check ...
- 云原生交付加速!容器镜像服务企业版支持 Helm Chart
2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...
随机推荐
- Jenkins 远程启动nodejs失败,使用pm2守护Nodejs
一.概述 使用Jenkins 远程ssh到linux,使用命令: ssh root@192.168.10.1 'cd /data/test;nohup npm start &' 发现linux ...
- Codeforces Round #499 (Div. 1)
Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...
- [cf 1194 D] 1-2-K Game
(当时让这道sb题卡住了,我比sb还sb) 题意: n个东西,两个人轮流取,每次可以取走1个,2个或k个,不能取的人输,求谁必胜. $0\leq n \leq 10^{9},3\leq k \leq ...
- 西门子S7-300 设置IP、子网掩码
=============================================== 2019/7/17_第1次修改 ccb_warlock == ...
- 通过重新上传修改后的docker镜像来在kubeapps上实现k8s上部署的nginx版本更新,回退等
docker操作:制作自定义镜像 # docker下载官方nginx镜像 docker pull nginx # 基于该镜像运行一个容器 docker run -it -d --name nginx_ ...
- windows开机自启动的django服务
做了一个django项目,想部署在win10的笔记本电脑上,可以开机后台自动启动.找了很多的方法.最后成功了. 参考了这个博主的内容. https://blog.csdn.net/qq_3595961 ...
- Matlab责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦,本人根据https://www.ru ...
- Django:基于调试组插件go-debug-toolbar
1.django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息.返回 ...
- 基于webpack的前端工程化开发解决方案探索(三):webpack-dev-server
前两篇中我们使用webpack完成了静态资源(css/js/img)等自动写入HTML模板中,同时还可以为静态资源添加hash版本号,既满足了我们对于静态资源的打包要求,同时又无需开发人员介入打包过程 ...
- iOS多线程GCD简介(二)
在上一篇中,我们主要讲了Dispatch Queue相关的内容.这篇主要讲一下一些和实际相关的使用实例,Dispatch Groups和Dispatch Semaphore. dispatch_aft ...