直接结论:不用硬扛 k8s.gcr.io,国内镜像源 + 镜像预拉取 + 配置参数覆盖,三步就能绕过所有网络卡点。用 --image-repository 指定阿里云镜像源是第一层稳妥替换,kubeadm 1.19+ 全版本支持,自动拼接为 registry.aliyuncs.com/google_containers/xxx 形式拉取;需验证源可用性,注意 coredns 等镜像 tag 必须严格匹配版本,缺失时手动指定 imageTag;离线环境则需提前 pull、save、load 全量镜像,包括 pause,否则 kubelet 启动失败。

直接结论:不用硬扛 k8s.gcr.io,国内镜像源 + 镜像预拉取 + 配置参数覆盖,三步就能绕过所有网络卡点。
用 --image-repository 指定阿里云镜像源
这是最常用也最稳妥的第一层替换。kubeadm 1.19+ 全版本都支持该参数,它会把所有核心组件镜像(kube-apiserver、kube-controller-manager、coredns 等)自动拼接成 registry.aliyuncs.com/google_containers/<image>:<tag></tag></image> 的形式去拉取。
执行前确认你的镜像源可用:
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
如果返回正常镜像列表,说明源通;若报错 Get https://registry.aliyuncs.com/v2/: net/http: request canceled,则可能是网络或 DNS 问题,可临时加 --v=5 查看详细错误。
- 注意:
coredns版本必须与 kubeadm 版本严格匹配,比如 kubeadm v1.21.2 对应coredns:v1.8.0,而阿里云镜像库中该 tag 可能缺失 —— 这时得单独补拉 - 不要混用多个镜像源,
--image-repository是全局生效的,不支持 per-image 覆盖 - 该参数只影响
kubeadm init和kubeadm config images pull,不影响你后续自己kubectl apply的 YAML 中写的镜像
手动补拉缺失的 coredns 或其他镜像
阿里云镜像源偶尔会滞后或漏推某些小版本(尤其是 coredns、etcd),遇到 failed to pull image "registry.aliyuncs.com/google_containers/coredns:v1.8.0" 时别急着换方案,先查实际存在哪些 tag:
curl -s "https://registry.aliyuncs.com/v2/google_containers/coredns/tags/list" | jq -r '.tags[]' | grep v1.8
如果返回为空或只有 v1.8.1,就改用那个可用的 tag,并在初始化配置里显式指定:
- 生成默认配置:
kubeadm config print init-defaults > kubeadm.yaml - 编辑
kubeadm.yaml,在dns段下添加:dns: imageRepository: registry.aliyuncs.com/google_containers imageTag: v1.8.1
- 同时检查
etcd和pause镜像是否匹配,它们的 tag 通常由 kubeadm 自动推导,但也可在etcd段手动锁定
离线环境用 kubeadm config images pull + docker save/load
如果你的集群节点完全断网(比如金融或军工内网),不能靠实时拉取,那就得提前在有网机器上把所有镜像打包好再导入。
关键不是“下载完就行”,而是确保镜像名和 tag 完全一致 —— 否则 kubeadm init 仍会去 registry 查找:
- 在联网机器运行:
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.2 - 用
docker images | grep google_containers确认全部拉齐,再批量保存:docker save $(docker images --format '{{.Repository}}:{{.Tag}}' | grep google_containers) -o k8s-images.tar - 把
k8s-images.tar拷到目标节点,执行:docker load -i k8s-images.tar - 此时
kubeadm init不会再尝试联网,它优先检查本地是否存在对应镜像
容易被忽略的一点是:pause 镜像(如 registry.aliyuncs.com/google_containers/pause:3.4.1)常被误认为系统级镜像而跳过保存,但它其实是 kubeadm 初始化必需的,漏掉会导致 kubelet 启动失败并报 Failed to run kubelet。


















