ArgoCD 镜像拉取卡住?DaoCloud 镜像加速 3 级配置完整实战
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
ArgoCD 镜像拉取卡在 gcr.io 等境外仓库、Pod 反复 ImagePullBackOff 时,DaoCloud 镜像加速(public-image-mirror)可以接管拉取链路:镜像地址加一个前缀,或替换首段域名,无需改动集群配置。
它凭什么能加速:原理三句话
- public-image-mirror 仅是源 Registry 的 Mirror,所有层哈希(sha256)与源保持一致,采用懒加载机制。
- 支持范围由白名单(allows.txt)决定,新增镜像不需要改代码,每天检查一次同步情况。
- 缓存内容保留 30 天,manifest 内存缓存 1 小时、blob 内存缓存 1 分钟,过期后需重新同步。
最小改动接入方式:加 m.daocloud.io 前缀
认知成本最低的用法:原始地址原样保留,前面加m.daocloud.io/。该方式不依赖域名替换表,是建议的第一步。
docker.io/library/busybox ↓ m.daocloud.io/docker.io/library/busyboxdocker run -d -P m.daocloud.io/docker.io/library/nginx前缀替换查表:只改首段域名的替代写法
常用仓库也可以只替换首段域名,写法更短,适合直接固化到各客户端的镜像源配置里:
| 源站 | 替换为 | 备注 |
|---|---|---|
| docker.elastic.co | elastic.m.daocloud.io | |
| docker.io | docker.m.daocloud.io | |
| dhi.io | dhi.m.daocloud.io | |
| gcr.io | gcr.m.daocloud.io | |
| ghcr.io | ghcr.m.daocloud.io | |
| k8s.gcr.io | k8s-gcr.m.daocloud.io | k8s.gcr.io 已被迁移到 registry.k8s.io |
| registry.k8s.io | k8s.m.daocloud.io | |
| mcr.microsoft.com | mcr.m.daocloud.io | |
| nvcr.io | nvcr.m.daocloud.io | |
| quay.io | quay.m.daocloud.io | |
| registry.ollama.ai | ollama.m.daocloud.io | 实验内测中 |
两点事实说明:前缀替换规则是人工维护的,官方推荐使用加前缀方式;各源站内容不同,不要把 docker.io 之外的站点配进 Docker 的registry-mirrors。
分级实操:从个人到企业内网的三条路径
第一级 · 个人开发者:改 ArgoCD 应用的 image 字段(⭐ 个人推荐)
适用谁:1~2 人使用、Application 数量少。怎么操作:注意要改的不是 Application 本身,而是代码仓库里 workload 清单的image字段——ArgoCD 同步的是清单,镜像地址由清单决定。
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: hello-app spec: source: repoURL: <你的代码仓库地址> targetRevision: main destination: server: https://kubernetes.default.svc namespace: default仓库中 workload 的镜像写法(以 gcr 镜像为例,前缀替换写法同理,如k8s.m.daocloud.io/pause:3.9):
containers: - name: app image: m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.44.0拿到什么:拉取走 DaoCloud 缓存链路,集群零改动;代价是每次换镜像都要手工改清单。
第二级 · 团队规范化:repimage Webhook 自动改写镜像(⭐ 团队推荐)
适用谁:多人协作、镜像变更频繁、难以要求每个人都记得改清单。怎么操作:部署一个 admission Webhook,新建 Pod 时把 image 自动改写为m.daocloud.io前缀,yaml 与 Helm 仓库均不动:
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拿到什么:集群级统一收口,仓库清单保留原始地址,不存在改漏、分支不一致的问题;代价是多了一个 admission 组件,其可用性需要纳入运维管理。
第三级 · 企业内网:registry 代理缓存搭建(⭐ 企业推荐)
适用谁:多节点集群、出口带宽受限,希望把对外网依赖收敛到单点。怎么操作:内网部署一个本地 registry,以 proxy 模式指向m.daocloud.io(完整文档见 docs/local-cache/):
services: registry: image: m.daocloud.io/docker.io/library/registry:3 restart: unless-stopped 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: delete: enabled: true filesystem: rootdirectory: /var/lib/registry http: addr: :8888 proxy: remoteurl: https://m.daocloud.io ttl: 2160h volumes: cache-data: {}关键配置说明:proxy段让本地 registry 成为缓存代理,未命中回源、命中直接本地应答;ttl: 2160h(90 天)决定缓存失效周期。
docker compose up -dDocker 客户端/etc/docker/daemon.json:
{ "insecure-registries": ["<your-registry-ip>:<your-registry-port>"] }写insecure-registries的原因:内网 registry 默认走 HTTP,而 Docker 守护进程只信任 HTTPS registry,必须显式声明例外。改完执行systemctl restart docker。
拿到什么:节点只需把首段换成内网地址,命中后不再出外网:
docker pull <your-registry-ip>:<your-registry-port>/docker.io/library/nginx:latest排障指南:三个高频现象与处理
- 现象:白天拉取仍然缓慢、超时。原因:加速服务高峰期拥挤。处理:非紧急的拉取任务安排在闲时(北京时间 01:00–07:00)执行,定时任务同理错峰。
- 现象:同一镜像地址时好时坏,或内容悄悄变化。原因:缓存 30 天过期需重新同步,且
latest这类可变 tag 在上游变更后 1 小时(manifest 缓存周期)才会更新。处理:优先用@sha256:摘要锁定镜像,其次明确版本号的 tag,最后才考虑latest。 - 现象:某个镜像始终拉不到,怀疑没同步。原因:白名单未覆盖,或同步记录已过期(队列仅保留 1 小时)。处理:到同步队列与服务状态监控确认;未覆盖的镜像可改用完整前缀方式或替换同类镜像。
适用范围
本方案覆盖白名单内的公开镜像(docker.io、gcr.io、quay.io、mcr.microsoft.com 等),适用于国内网络环境的 ArgoCD/Kubernetes 部署;私有镜像与完全离线场景需自行同步。完整白名单与限流规则以 DaoCloud 官方项目 public-image-mirror 仓库 README 的公开信息为准。
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考