加一个前缀,Kafka 镜像同步不再绕远路
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
docker pull bitnami/kafka 的进度条半天不走,瓶颈在跨国链路,不在带宽。DaoCloud 开源的 public-image-mirror 把镜像同步到国内链路,地址前加一个前缀就能改走加速通道。本文讲清这个镜像加速服务的原理、白名单机制和 containerd 集群的接法。
镜像加速原理:按需同步、哈希对齐与缓存期限
这个服务本质是源仓库的 mirror:不重新构建镜像,只把镜像数据搬到国内存储。拉取时的体验由三条规则决定:
按需同步:没人要过的镜像不提前搬。首次拉取没命中缓存时,请求先进同步队列,后台从源站取回数据写入国内存储,之后再次拉取直接命中。这意味着冷镜像的第一次拉取要陪跑一次同步,但同一环境的第二台机器再拉同一个镜像,基本就是本地速度。
哈希对齐:同步过来的所有 sha256 都和源站相同。这意味着你不用怀疑镜像被二次加工,digest 可以直接拿去和源站核对。
缓存有期限:同步内容只保留 30 天,过期后重新同步;Manifest 内存缓存 1 小时,Blob 内存缓存 1 分钟。这意味着 latest 这类可变 tag 的内容最多滞后 1 小时,生产环境建议优先用 @sha256 固定,其次用明确版本号。
同步范围由一份白名单控制,只有命中的镜像才会被搬运,条目支持*与**两级通配,加仓库不用改代码。同步队列的状态页(queue.m.daocloud.io/status/)可以看到进行中和刚完成的同步任务。
整个按需同步流程画出来是这样的:
操作篇:确认白名单,三步切换 Kafka 镜像加速前缀
第一步,确认目标镜像在白名单里。白名单文件 allows.txt 里有整站通配条目,这条命令就是查它:
grep "^docker.io" allows.txt输出包含docker.io/*,一行覆盖整个 docker.io 命名空间,bitnami/kafka 就在其中。这意味着这类镜像不用申请白名单,直接能拉。
第二步,加前缀拉取(以 3.9.0 为例):
docker pull m.daocloud.io/docker.io/bitnami/kafka:3.9.0也可以直接换域名,比如docker.m.daocloud.io/bitnami/kafka:3.9.0;gcr.io、ghcr.io 等仓库各有一个替换域名,对照表在 README.md 里。
第三步,核对 digest。这两条命令把源站 manifest 摘要和拉下来的本地镜像摘要打出来对比:
docker manifest inspect docker.io/bitnami/kafka:3.9.0 | grep digest docker images --digests --no-trunc | grep bitnami/kafka两边一致,说明拉到的是源站原始内容。
进阶篇:containerd 集群镜像配置与队列预热
containerd 集群镜像配置
新版 containerd 不再用 config.toml 里的 registry-mirrors 段,改按 host 配独立的 hosts.toml。在每台节点写:
# /etc/containerd/certs.d/docker.io/hosts.toml server = "https://registry-1.docker.io" [host."https://docker.m.daocloud.io"] capabilities = ["pull", "resolve"]改完重启 containerd,集群里所有节点拉 docker.io 镜像都走加速链路。项目 README.md 特别提醒:各源站内容互不相同,不要把 docker.io 之外的站点配进 docker 的 mirror。用 kubespray 部署的话,也可以直接设 containerd_registries_mirrors 参数。
如何用同步队列给大镜像预热
发布窗口前,先手工拉一遍目标镜像,让它提前进同步队列,发布时全员命中缓存。项目建议批量拉取放在闲时——北京时间凌晨 01 点到 07 点,其余时段比较拥挤;状态页的记录只保留 1 小时,排查问题要趁早。
白名单维护脚本与内网本地缓存
白名单的日常维护靠 hack/ 目录里的四个脚本:verify-allows.sh 校验条目是否覆盖目标镜像,fmt-image-match.sh 整理通配规则并去重,verify-image-match.sh 检查单个镜像是否命中,correct-image.sh 把各种写法的镜像地址归一成标准格式。
如果集群出不去公网,docs/local-cache/README.md 里还有一层内网缓存方案:用 docker-compose 起一个 registry 作本地代理,节点只访问内网地址,和加速前缀叠加使用。
接入路径到这里就齐了:单机加前缀,集群写一份 hosts.toml,内网叠一层本地缓存。白名单维护脚本都在 hack/ 里,照着跑一遍就能看懂规则。
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考