ArgoCD 镜像拉取慢怎么办:三级加速方案与内网缓存避坑指南
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
ArgoCD 镜像加速方案:国内集群同步应用时,gcr.io 等境外仓库拉取卡顿、超时,DaoCloud 开源的 public-image-mirror 加个前缀就能走国内同步节点;再配一层内网 registry 缓存,外网依赖降到最低。
先看现场:ArgoCD 拉取慢到底卡在哪
最常见的误判是"网络不好",其实多数时候是路径问题:集群要跨公网去境外仓库逐层下载,排队、限速、超时轮番上阵,Pod 事件里反复刷ImagePullBackOff,sync 状态就一直挂在 syncing 不动。ArgoCD 还会把问题放大——一次同步往往涉及多个工作负载,任何一个镜像拉不下来,整个应用就停摆。重灾区是 gcr.io 这类国内镜像覆盖不到的仓库:kubeadm、cert-manager、各类 Operator 的组件镜像基本都住在那儿,稍有更新就得重新拉。
原理一句话:名称映射 + 定时巡检
public-image-mirror 不搬库、不转码,做的是地址映射:境外仓库在国内同步节点上挂一份"别名",拉取请求先落到节点,节点再按需回源;sha256 与源站保持一致,缓存 30 天到期后会自动重新同步。另外它是懒加载机制——没被请求过的 tag 不会提前搬运,所以你只需要关心用哪个前缀,日常维护交给它的定时巡检,把它当成一套现成的 K8s 镜像同步方案即可。
三档落地方案:按侵入程度从轻到重
三种方式按"要动多少东西"排成递进关系:改地址 → Webhook → 内网缓存。个人或小团队,前两档通常就够;规模上来、对外网依赖敏感时,再上第三档。
档位一:改一处镜像地址就能提速
这是最轻的一档:不引入任何组件,只改一行文本,回滚也是一次替换。原始地址前加m.daocloud.io/,或对下表中的域名做前缀替换,两种写法共用同一个同步后端:
docker.io/library/busybox ↓ 加前缀 m.daocloud.io/docker.io/library/busybox gcr.io/google-samples/hello-app:1.0 ↓ 前缀替换 gcr.m.daocloud.io/google-samples/hello-app:1.0在 ArgoCD 里不用碰 Application 定义本身,把 K8s 资源中的containers[].image换成上面任一种写法,下一次 sync 即走加速链路;kubeadm 场景把imageRepository换成k8s.m.daocloud.io同理。注意前缀替换是人工维护的固定清单,清单外的源站请一律用加前缀,映射关系按仓库类型整理如下:
| 分组 | 源站 | 替换为 | 备注 |
|---|---|---|---|
| Docker 系 | docker.io | docker.m.daocloud.io | 使用最频繁 |
| Docker 系 | docker.elastic.co | elastic.m.daocloud.io | |
| Docker 系 | quay.io | quay.m.daocloud.io | |
| Docker 系 | dhi.io | dhi.m.daocloud.io | |
| GCR / K8s 系 | gcr.io | gcr.m.daocloud.io | |
| GCR / K8s 系 | k8s.gcr.io | k8s-gcr.m.daocloud.io | 源站已迁往 registry.k8s.io |
| GCR / K8s 系 | registry.k8s.io | k8s.m.daocloud.io | |
| 其他 | ghcr.io | ghcr.m.daocloud.io | |
| 其他 | mcr.microsoft.com | mcr.m.daocloud.io | |
| 其他 | nvcr.io | nvcr.m.daocloud.io | |
| 其他 | registry.ollama.ai | ollama.m.daocloud.io | 实验内测中 |
补充一句:各源站内容互相独立,不要把 docker.io 之外的站点塞进 Docker 的registry-mirrors,替换表想加新条目则走 Issue。
档位二:让 Webhook 替你改 Pod 镜像
应用一多,逐个改image就不现实了。repimage 用 Webhook 在 Pod 创建时自动改写镜像地址,yaml 与 Helm chart 保持原样不动,部署只有两条命令:
kubectl create -f https://files.m.daocloud.io/github.com/wzshiming/repimage/releases/download/latest/repimage.yaml kubectl rollout status deployment/repimage -n kube-system要留意作用边界:Webhook 只拦新建的 Pod,存量容器不会被原地改写,需要rollout restart之后才切到加速地址。
档位三:内网 registry 缓存代理,外网只走一次
前两档的首次拉取仍会回源。集群规模上来后,在内网垫一层缓存最稳:本地 registry 代理m.daocloud.io,命中缓存直接返回,未命中才由它去回源。完整步骤见 docs/local-cache/README.md,compose 文件的核心内容如下:
services: registry: image: m.daocloud.io/docker.io/library/registry:3 ports: - "8888:8888" command: ["/etc/docker/registry/config.yml"] volumes: - cache-data:/var/lib/registry configs: - source: registry-config target: /etc/docker/registry/config.yml configs: registry-config: content: | version: 0.1 storage: filesystem: rootdirectory: /var/lib/registry http: addr: :8888 proxy: remoteurl: https://m.daocloud.io ttl: 2160h volumes: cache-data: {}启动后,客户端只需在/etc/docker/daemon.json里把内网地址声明为可信仓库,再重启 Docker 即可生效:
{ "insecure-registries": ["<registry-host:port>"] }此后拉取写法与前缀方案完全一致,只是前缀换成内网地址:docker pull <registry-host:port>/docker.io/library/nginx:latest。
拉取仍慢的 4 个自查点 🔎
配置完还是慢?按顺序过一遍这四点:
- 挪到闲时:白天节点比较拥挤,批量拉取任务放到凌晨 1 点到 7 点(北京时间)执行,吞吐会明显更稳。
- 钉死版本:优先用
@sha256:摘要,其次选明确版本号的 tag;latest这类可变 tag 一旦更新就触发后台重新同步,缓存命中率低。 - 验证链路:先在节点上手动
docker pull一次加速地址,把"仓库本身慢"和"节点 DNS、代理、防火墙拦了请求"区分开。 - 查队列与状态:用同步队列(仅保留一小时记录)确认你的镜像是否在排队,再用服务状态监控看后端整体健康度。
下一步:查文档,再提 Issue
白名单、限流、新增源站这类问题,先翻项目文档,解决不了就到仓库提 Issue。需要本地核对同步清单时,git clone https://gitcode.com/GitHub_Trending/pu/public-image-mirror拉一份 DaoCloud 维护的 public-image-mirror 源码看看,项目更新节奏不慢,动手前记得通读一遍 README。
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考