K8s 镜像拉取超时重试?DaoCloud public-image-mirror 镜像加速完整配置
凌晨三点 CI 卡在拉镜像,初始化脚本重试到超时——这是国内连 gcr.io 的日常。DaoCloud 开源的 public-image-mirror 把海外镜像同步到国内加速节点,靠一层名称映射就能拉取同一份镜像,内容不动。问题本质:大量基础镜像托管在海外 registry,直连延迟高、超时多,集群部署被拖慢。下面从"改一行名字"讲到企业内网落地。
两种改法:加前缀,还是换域名
项目的映射规则分两类,都能覆盖全部场景。
加前缀(推荐)。把 m.daocloud.io/ 直接拼在原镜像名最前面:
docker.io/library/busybox → m.daocloud.io/docker.io/library/busybox
规则通用,任何 registry 的镜像都适用,也是 README 里的第一推荐。
替换域名前缀。部分 registry 可以直接换域名,比如 gcr.io/google-containers/pause 写成 gcr.m.daocloud.io/google-containers/pause。这份映射是人工维护的,只覆盖支持列表,算是快捷通道。
💡 两种方式都只是改"地址":镜像 sha256 与源仓库保持一致,基于摘要的内容校验逻辑不受影响。
把 kubeadm、kind、新建 Pod 都指向加速域名
部署方式不同,动手的层级就不同。
kubeadm:改掉两个镜像源字段
kubeadm 初始化集群时,把 ClusterConfiguration 里的 imageRepository 和 dns.imageRepository 指向加速域名,控制面组件与 CoreDNS 就全部从 mirror 出:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
dns:
imageRepository: k8s.m.daocloud.io/coredns # CoreDNS 镜像源
imageRepository: k8s.m.daocloud.io # 控制面组件镜像源
kind:换掉 create 命令的 --image 参数
kind 建本地测试集群时,把节点镜像改写一下,拉取就走 mirror:
kind create cluster --name kind --image m.daocloud.io/docker.io/kindest/node:v1.22.1
新建 Pod:交给 Webhook 代写镜像
不想逐个改 YAML 和 Helm Chart,就上 repimage。它是 Webhook 组件,新建 Pod 时自动把 image 改写成 mirror 域名,交付物零改动:
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
Containerd:在运行时层配 mirror
运行 Containerd 的节点,参考官方文档的 registry hosts 章节追加镜像配置即可。环境是 kubespray 搭的,只需用上 containerd_registries_mirrors 变量。⚠️ 注意:各 registry 的前缀替换规则适用范围不同,别把 A 站点的域名配到 B 站点的 registry-mirrors 里。
常用海外仓库加速域名速查
| 源域名 | 加速域名 | 备注 |
|---|---|---|
| gcr.io | gcr.m.daocloud.io | |
| k8s.gcr.io | k8s-gcr.m.daocloud.io | 上游已退役,镜像迁往 registry.k8s.io |
| registry.k8s.io | k8s.m.daocloud.io | |
| docker.io | docker.m.daocloud.io |
README 里还有 ghcr.io、quay.io 等更多 registry,新仓库可以提 Issue 扩展。
企业内网:把 mirror 架到自己机房
内网里多台节点反复拉同一批镜像时,再垫一层本地缓存很值。思路:用 Docker Compose 在内网起一个 registry,把它配成 m.daocloud.io 的代理(文档默认 TTL 2160 小时),客户端只动两处:
/etc/docker/daemon.json把内网 registry 写进insecure-registries,重启 Docker;- 之后的拉取命令,把
m.daocloud.io/换成<ip:port>/:
docker pull <your-registry-ip>:<your-registry-port>/docker.io/library/nginx:latest
效果:首次拉取回源并回填缓存,后续节点拉同一镜像走内网,对外网依赖明显下降。完整的 docker-compose 配置见 内网缓存部署文档。
使用细节与资源入口
- 排期:白天拉取拥挤,项目方建议把同步任务放在北京时间凌晨 1–7 点的闲时窗口;
- 固定引用:优先
@sha256:摘要,其次明确版本 tag;latest这类可变 tag 更新后要重新同步,还会命中旧数据; - 缓存时效:镜像内容保留 30 天,过期再拉会重新回源。
仓库的 README 里有完整 registry 列表与常见问题入口。踩到文中没覆盖的坑,欢迎在项目 Issue 区留言反馈。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



