起因
- 在最开始学习openstack的过程中一直希望有更方便的openstack部署方法,无论在单机测试还是生产环境
- 现在经过openstack社区的蓬勃发展,出现了一系列openstack on k8s以及openstack on docker部署项目
- 然而无论是部署kubernetes(k8s.gcr.io)还是部署openstack(quay.io/docker.io)所需的镜像都来自海外
- 此外在生产环境中集群化部署时每台节点都需要拉取所需的镜像,不过其中的绝大部分都是重复的
- 以及若要部署相同版本openstack的多个集群时,也会涉及镜像需要重新拉取耗时耗力的问题
- 因此本文的多镜像仓库缓存代理方案主要目的有以下三点:
- 镜像拉取加速
- 拉取同时缓存
- 一站式支持多个常用的镜像仓库,如
- registry-1.docker.io
- k8s.gcr.io
- gcr.io
- quay.io
镜像加速功能
- 不用我多说了
- 方案选择上有两个点:
- 从哪来
- 其实就是配置在OUTPUT 还是 PREROUTING的问题
- 最后因为容器网络的特殊性和方案简洁性,选择了OUTPUT,所有容器共用同一个网络namespace
- 怎么走:
- TCP可以走REDIRECT,但不能走TPROXY
- UDP可以走TUNNEL,也可以走TPROXY,但不能走REDIRECT
- 最后综合选择了TCP(REDIRECT) + UDP(TUNNEL)
镜像缓存功能
- 镜像缓存功能由docker官网提供的registry镜像提供
- 官网registry镜像的使用和配置,在docker官方文档中都详细介绍
- registry的配置文件就是一个yaml格式的文件,想要修改其配置有两种方式
- 写好整个yaml然后挂载进容器
- 通过环境变量配置单个配置项,如
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
配置如下代码块中的配置项
- 可以看出规则是以REGITRY开头,后面配置项的路径以`
替换
.`,并写英文全部大写
storage:
filesystem:
rootdirectory: /var/lib/registry
- 有关镜像缓存代理的配置非常简单,只有三项:
remoteurl
: 想要代理的镜像仓库的地址,必填username
password
:连接本代理使用的用户名密码,可选- 根据上面的配置项转换规则,只需要把目标仓库地址写在REGISTRY_PROXY_REMOTEURL环境变量即可
多库集成功能
- 方案中的镜像缓存代理都没有使用ssl,因此四个仓库代理都会开在80端口
- 因此我们需要一个根据url路径选择反代对象的功能,这个是nginx本行
- 所以写好一个nginx反代配置,挂在进官方nginx镜像就好了
- 最后如果需要添加新的仓库代理的话,记得在nginx.conf里面也添加相应的配置
How-To说明
- 如何使用镜像缓存代理
- 本节指当镜像代理启动好后,内网其他主机如何使用本机提供的服务
- 因此本节配置都是写在其他使用本机服务的主机上
- docker官方仓库:
- 内容:
"registry-mirrors": ["http://10.122.1.164"]
- 路径:
/etc/docker/daemon.json
- 其他仓库:
- 内容:
"insecure-registries": ["k8s.gcr.io", "quay.io", "gcr.io"]
- 路径:
/etc/docker/daemon.json
- 需要在集群DNS或本机hosts文件中把这三个域名指向缓存代理的IP地址
- 记得把IP替换成你的IP
- 修改配置后需要重启docker
- 最后daemon.json可以总结为
{"mtu": 1350, "registry-mirrors": ["http://10.122.1.164"], "insecure-registries": ["k8s.gcr.io", "quay.io", "gcr.io"]}
- 如何迁移镜像的缓存
- 本文方案的所有registry的数据文件全部挂载在
/var/lib/registry
- 因此无论是备份还是复制迁移,只需要操作
/var/lib/registry
,再启动新的compose,就可以使用之前缓存好的镜像文件了
Finally
- docker-compose中的bridge类型network是可选的
- 之所以添加是因为我们底层网络的mtu不是1500,而是由于底层是overlay的网络而mtu减小的网络
- 因此必须在容器网络中配置mtu相应的减小,不然传输大文件时会丢数据包
- 底层网络是物理以太网络时就不是必须修改mtu,但配置的小一点也没有问题
- 如果要删除这个network的话,记得把容器连接网络的配置也删掉
- 一个有意思的事情是
- 去年的时候(2019)quay.io还不支持v2版本的manifest
- 所以其他三个仓库使用2.7版本的registry,而quay.io只能用2.3.0版本的
- 当时被quay.io着实恶心了一下,然而2.3.0版本是proxy功能 与 manifest v1功能的交集版本
- 所以又因为自己灵机一动找到了这个版本作为解决方式很开心哈哈
- 不过都已经是过去时了,现在(2020)quay.io已经支持了manifest v2,只是在这里小小记录一下