k8s镜像仓库迁移

背景

1
2
3
在k8s集群迁移场景中,镜像仓库之间迁移和同步是基本需求。
在迁移中当镜像个数较少时可以通过docker pull/push完成镜像迁移,如果涉及到成百上千个镜像,甚至上TB级别的镜像仓库数据时,迁移过程就变得非常漫长,并且可能丢失数据。
本文通过阿里云开源工具image-syncer进行镜像迁移。

image-syncer简介和特点

  • image-syncer
1
2
3
4
5
6
7
8
9
10
11
12
image-syncer的定位是一个简单、易用的批量镜像迁移和镜像同步复制工具。
支持几乎所有目前主流的基于docker registry V2搭建的镜像存储服务。
对硬件资源几乎没要求(因为 image-syncer 严格控制网络连接数目=并发数,所以只有在单个镜像层过大的情况下,并发数目过大可能会打满内存,内存占用 <= 并发数 x 最大镜像层大小)

# 特点
1. 支持多对多镜像仓库同步
2. 支持基于Docker Registry V2搭建的Docker镜像仓库服务
3. 镜像同步复制只经过内存和网络,不依赖磁盘存储,同步速度快。
4. 支持增量同步,通过对同步过的镜像blob信息落盘,不会对已同步的镜像进行重复同步。
5. 支持并发同步,可以通过配置文件调整并发数。
6. 支持自动重试失败的同步任务,解决大部分镜像同步中的网络抖动问题。
7. 不依赖Docker以及其他程序。
  • 使用传统脚本方式docker pull/push镜像方式有如下局限性:
1
2
3
1. 依赖磁盘存储,需要及时进行本地镜像的清理,并且落盘造成多余的时间开销;难以胜任生产场景中大量镜像的迁移。
2. 依赖docker程序,docker daemon对pull/push的并发数进行了严格的限制,无法进行高并发同步。
3. 一些功能只能通过HTTP api进行操作,仅使用docker cli无法做到,使脚本变得复杂。

安装和使用

  • 安装

    1
    2
    3
    4
    5
    # 连接
    https://github.com/AliyunContainerService/image-syncer/releases
    wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.1.0/image-syncer-v1.1.0-linux-amd64.tar.gz
    # 解压
    tar zxvf image-syncer-v1.1.0-linux-amd64.tar.gz
  • 设置配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    {
    "auth": {
    "registry.cn-shanghai.aliyuncs.com": {
    "username": "xxxx",
    "password": "xxx"
    },
    "ccr.ccs.tencentyun.com": {
    "username": "xxxxxx",
    "password": "xxxxxx"
    }
    },
    "images": {
    "registry.cn-shanghai.aliyuncs.com/key1024/test": "ccr.ccs.tencentyun.com/key1024/test",
    "registry.cn-shanghai.aliyuncs.com/key1024/mysql": "ccr.ccs.tencentyun.com/key1024/mysql",
    "registry.cn-shanghai.aliyuncs.com/key1024/liyk": "ccr.ccs.tencentyun.com/key1024/liyk",
    "registry.cn-shanghai.aliyuncs.com/key1024/demo": "ccr.ccs.tencentyun.com/key1024/demo1"
    }
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# harbor同步到阿里云镜像仓库
{
"auth": {
"harbor.myk8s.paas.com:32080": {
"username": "admin",
"password": "xxxxxxxxx",
"insecure": true
},
"registry.cn-beijing.aliyuncs.com": {
"username": "acr_pusher@1938562138124787",
"password": "xxxxxxxx"
}
},
"images": {
"harbor.myk8s.paas.com:32080/library/nginx": ""
}
}
  • 镜像同步测试
    1
    2
    3
    ./image-syncer --proc=6 --config=./ali-2-tencent.json
    # 或者在运行时指定目的端的namespace和仓库地址
    ./image-syncer --proc=6 --config=./ali-2-tencent.json --namespace=key1024 --registry=ccr.ccs.tencentyun.com --retries=2 --log=./ali-2-tencent.log
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。