离线环境k3s导入本地镜像部署仍报pause镜像拉取失败如何解决
问题根因
imagePullPolicy: Never仅对Deployment中声明的业务容器(即Nexus应用镜像)生效。报错中拉取失败的rancher/mirrored-pause:3.6是Pod沙箱(pause基础设施容器)镜像,由kubelet直接调用容器运行时拉取,完全不受业务工作负载的镜像拉取规则约束。
之前操作未生效的两个核心原因:
- 预拉取的镜像未导入k3s内置containerd的对应命名空间,多数情况是导入到了Docker的本地镜像存储,k3s默认使用内置containerd作为运行时,无法识别Docker存储中的镜像
- 代理配置仅添加到k3s服务进程的环境变量中,未覆盖kubelet、containerd的镜像拉取链路,同时节点本地DNS无法解析公网镜像仓库域名,直接触发解析失败报错
修复操作
1. 正确导入pause镜像到k3s运行时
如果镜像之前存在本地Docker环境,先导出镜像包:
docker save rancher/mirrored-pause:3.6 -o pause.tar
将镜像导入k3s内置containerd的k8s.io命名空间(k8s系统组件、沙箱镜像都存在这个命名空间下):
k3s ctr images import pause.tar -n k8s.io
导入完成后执行校验,能查到对应镜像记录即为导入成功:
k3s crictl images | grep mirrored-pause
2. 强制k3s使用本地pause镜像,跳过公网拉取
编辑k3s配置文件/etc/rancher/k3s/config.yaml,添加如下配置明确指定沙箱镜像,避免运行时自动触发公网拉取:
kubelet-arg: - "pod-infra-container-image=rancher/mirrored-pause:3.6"
3. (可选)需要代理拉取其他公网镜像时的正确配置
不要仅在k3s.service、k3s.server.env中配置代理,需要通过systemd drop-in方式给所有k3s相关组件注入代理环境变量:
- 创建配置目录:
mkdir -p /etc/systemd/system/k3s.service.d
- 编辑代理配置文件
/etc/systemd/system/k3s.service.d/http-proxy.conf,替换为实际代理地址:
[Service] Environment="HTTP_PROXY=http://你的代理IP:代理端口" Environment="HTTPS_PROXY=http://你的代理IP:代理端口" Environment="NO_PROXY=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local,集群内部业务网段"
- 重载systemd配置并重启k3s:
systemctl daemon-reload systemctl restart k3s
注意事项
- 多节点集群需要在所有控制面、worker节点上执行上述镜像导入、配置修改操作,否则调度到未配置节点的Pod仍会报相同错误
- 操作完成后删除之前创建失败的Nexus Pod,等待重新调度即可正常启动
内容的提问来源于stack exchange,提问作者PabloM
相关产品推荐
相关产品推荐

