内网镜像站
背景
在企业内部的日常构建中,我们需要频繁地拉取外网资源(系统工具,lib库,编译好的二进制文件等),其中也有部分需要访问 GitHub,Google,Docker Hub 等的需求。因此,有必要在内网维护一些常用的“热”资源,加速下载,节省流量,减少构建时间。也有部分没有公网访问的构建环境,只允许部分机器通过其他代理访问。
方案
目前,各大厂商和高校提供了一些镜像源服务,我们可以使用开源社区的Nexus工具,将大厂的开源镜像站设置为上游,同步和更新上游镜像来解决问题。
- 网易云:https://mirrors.163.com/
- 阿里云:https://mirrors.aliyun.com/
- 腾讯云:https://mirrors.cloud.tencent.com/
- 中科大:https://mirrors.ustc.edu.cn/
- 清华源:https://mirrors.tuna.tsinghua.edu.cn
搭建nexus服务
为了方便测试,这里通过docker-compose本地启动一个nexus服务:
|
|
当然,也可以作为一个POD部署在K8S集群中,通过ingress和service来访问服务和做高可用。对于这些缓存的内容,建议对接MinIO提供的S3存储,速度上会有优势。而且,这些内容丢了也没有关系,重新缓存就行了。如果服务异常了,可以直接删除挂载目录,重启POD快速恢复服务。
配置nexus仓库
首先,根据具体情况来设置清理策略,防止占满磁盘。我这边设置了一个月不常用的内容就会不清理掉,每天凌晨一点执行。
其次,设置需要缓存的仓库并绑定对应的清理策略。一般需要镜像的内容有:编程语言相关的包,操作系统相关的工具和容器镜像。如果使用它作为容器镜像的缓存,则需要打开匿名拉取,同时将(setting -> security -> Realms -> Docker Bearer Token)激活。具体配置可以参考这篇文章 ,这里就不过多介绍。
最后,比如Golang相关的包,有的是直接引用内部的是有仓库。这时需要使用nexus的route功能,配合其他工具来解决这类问题。
使用
加速容器镜像拉取
修改docker的config文件:/etc/docker/daemon.json
|
|
加速系统工具安装
这里以apt的修改为例:
|
|
实践
通过观察可以发现,虽然各大厂商的镜像域名不一致,但是后端的内容都大同小异。比如:alpine,ubuntu,centos
等。这样就可以通过nexus里的一个raw group来组合,达到较少配置的目的。另外,alpine仓库配置的时候比较特殊,需要关闭storage里的 Strict Content Type Validation. 否则的化会一直提示要执行apk update
来更新仓库。其他编程语言相关的包,也能在大厂的网站上找到,选择对应的format类型同构group类的仓库添加两个以上的proxy类型的仓库,来提升可用性。