Zot 镜像同步:一套配置跑通跨区域分发
【免费下载链接】zotzot - A scale-out production-ready vendor-neutral OCI-native container image/artifact registry (purely based on OCI Distribution Specification)项目地址: https://gitcode.com/GitHub_Trending/zo/zot
业务部署在华东,镜像拉取却全走华北的源 registry。链路一抖,华东的 Pod 排队 ImagePullBackOff,值班的人只能手动补推镜像救火。Zot 镜像同步做的就是这件事:把源仓库指给 Zot,它会按你定的节奏把镜像搬到本地仓库,华东从此从本地拉,链路从跨区长途变成局域网。
跑通最小配置
一份 Zot sync 配置其实只要三样东西:打开扩展、给一个源 registry、给一条 content 规则。下面这段贴进 config-sync.json 的 extensions.sync 节点里,就能启动同步:
{ "enable": true, "credentialsFile": "./sync-credentials.json", "registries": [ { "urls": ["https://registry-src:5000"], "pollInterval": "6h", "content": [ { "prefix": "library/nginx" } ] } ] }这是一次典型的镜像定时同步:每 6 小时 Zot 从源仓库拉一次 library/nginx 的最新 tag 列表,新增或变化的 tag 会被复制到本地。源仓库如果需要鉴权,把账号密码写进 credentialsFile 指向的文件;匿名仓库可以删掉这一行。
定时还是按需?
两种模式按 registry 粒度配置,按需模式只要翻一个开关:
{ "urls": ["https://index.docker.io"], "onDemand": true, "syncTimeout": "10m" }定时模式则只加一个 pollInterval,两者还可以开在同一个 registry 上,定时保证主干版本,按需兜住其余部分。
| 模式 | 什么时候跑 | 适合什么 |
|---|---|---|
| pollInterval 定时 | 按固定间隔扫描,如 6h | 镜像少、版本稳定,需要提前预热 |
| onDemand 按需 | 有人拉缺失镜像时立即复制 | 镜像长尾,大部分 tag 根本没人用 |
怎么选:镜像集小(几十个仓库、每个仓库少数版本)就用定时,pollInterval 设成 1h,发版时生产已经热好了;镜像集大(上百个基础镜像加各种版本)就用镜像按需同步,拉到什么才复制什么,存储和带宽都不浪费。
只同步我要的:过滤与路径改写
每条 content 规则就是一个小漏斗,每个字段各解决一个问题:
- prefix:圈定同步哪些仓库。"/repo3/**" 表示它下面全部,只写一个仓库名就只同步那个。
- tags.regex / tags.excludeRegex:按 tag 过滤。"4.*" 只复制 4.x 版本;excludeRegex 用来排除平台后缀之类的 tag。
- tags.semver:只认合法语义化版本号的 tag,把 build123 这类杂音挡在外面。
- destination + stripPrefix:路径改写,把 /repo2/repo 同步成本地的 /repo,拉平上游目录结构。
"content": [ { "prefix": "/repo3/**" }, { "prefix": "/repo1/repo", "tags": { "regex": "4.*", "semver": true } }, { "prefix": "/repo2/repo", "destination": "/repo", "stripPrefix": true } ]这三条规则分别覆盖子路径全量、版本过滤和路径改写三种最常见的用法,组合起来就能精确圈出你要的镜像范围。
上线前查这几项
- tlsVerify:保持 true,内部私有 CA 放进 certDir 指向的目录。
- maxRetries / retryDelay:比如 5 次、间隔 1m,网络抖动不至于一次失败就放弃。
- syncTimeout:单次同步总超时,默认 3h,慢链路同步大镜像时调大。
- onlySigned:只同步带签名的镜像,和 cosign / notation 验签流程配套。
- ⚠️ credentialsFile 里是源仓库的明文凭证,别跟着配置一起提交进 git。
各字段默认值以 sync 扩展源码为准,拿不准时翻一遍比凭印象改参数安全。
三种落地场景
多区域分发。每个区域放一个 Zot,源都指向中心仓库,pollInterval 设成 1h,content 里 prefix 只圈住生产真正用的仓库。这套跨区域镜像同步跑起来之后,各区域集群从本地 Zot 拉镜像,跨区长传基本消失。
镜像灾备。备机房的 Zot 指向主站,pollInterval 放宽松到 12h,加 semver: true 只留正式版本。主站挂掉时业务切到备站,拉取路径不用改,存储也不会被测试 tag 撑爆。
开发到生产的版本管控。生产 Zot 的源指向开发 Zot,Zot 镜像复制在这里当守门员:prefix 只圈 prod- 开头的仓库,regex 再收紧到稳定版本。开发随便推,能进生产的只有发过版的。
Zot 镜像复制不需要改任何业务代码,在现有 registry 的配置里加一个 sync 扩展,它就成了会自己更新的本地图像源。定时与按需两种模式的具体实现可以看 extensions/sync 目录下的源码,完整配置样例在 examples/config-sync.json,里面四种 registry 写法的组合都能直接抄。
【免费下载链接】zotzot - A scale-out production-ready vendor-neutral OCI-native container image/artifact registry (purely based on OCI Distribution Specification)项目地址: https://gitcode.com/GitHub_Trending/zo/zot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考