起因

  • 在最开始学习openstack的过程中一直希望有更方便的openstack部署方法,无论在单机测试还是生产环境
  • 现在经过openstack社区的蓬勃发展,出现了一系列openstack on k8s以及openstack on docker部署项目
  • 然而无论是部署kubernetes(k8s.gcr.io)还是部署openstack(quay.io/docker.io)所需的镜像都来自海外
  • 此外在生产环境中集群化部署时每台节点都需要拉取所需的镜像,不过其中的绝大部分都是重复的
  • 以及若要部署相同版本openstack的多个集群时,也会涉及镜像需要重新拉取耗时耗力的问题
  • 因此本文的多镜像仓库缓存代理方案主要目的有以下三点:
    1. 镜像拉取加速
    2. 拉取同时缓存
      • 同时可将缓存拷贝迁移重复使用
  1. 一站式支持多个常用的镜像仓库,如
    • 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格式的文件,想要修改其配置有两种方式
    1. 写好整个yaml然后挂载进容器
    2. 通过环境变量配置单个配置项,如REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY配置如下代码块中的配置项
      • 可以看出规则是以REGITRY开头,后面配置项的路径以`替换.`,并写英文全部大写
  1. storage:
  2. filesystem:
  3. 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,只是在这里小小记录一下
  • 再次感谢开源世界