zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    【Distributed】缓存技术
    【Redis】基本数据类型
    【Redis】安装、开启以及关闭
    【Ehcache】基础知识学习
    VS2012 改C# 模版
    C# Windows Services 启动和结束其它进程
    .net Console.ReadLine无效
    VS2012在解决方案资源管理器显示解决方案名称
    Mysql 数据库中9大对象
    C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11067839.html
Copyright © 2011-2022 走看看