非minikube环境的Kubernetes部署如何使用本地Docker镜像
问题根因
你遇到的镜像识别异常核心原因是kubeadm部署的Kubernetes集群默认使用containerd作为容器运行时,与Docker daemon的镜像存储完全隔离:
- 你执行
docker系列命令操作的是Docker服务独立维护的镜像库,Kubernetes无法访问该存储路径下的镜像,所以就算你加载了镜像到Docker中、指定了镜像拉取策略,集群仍然会尝试从公网拉取镜像 - Kubernetes自行拉取的镜像存储在containerd的
k8s.io命名空间下,自然无法通过docker images命令查询到
无需私有镜像仓库的本地镜像使用方案
方案1:直接将镜像导入Kubernetes使用的containerd镜像库(最推荐)
这是改动最小的实现方式:
- 如果你已经提前导出了镜像tar包,执行以下命令将镜像导入containerd的K8s专用命名空间:
ctr -n k8s.io images import 你的镜像压缩包名.tar - 导入完成后执行以下命令确认镜像存在:
ctr -n k8s.io images ls | grep app:test - 后续创建Pod/Deployment时指定
imagePullPolicy: IfNotPresent或者imagePullPolicy: Never,即可正常调用本地镜像启动容器
方案2:切换Kubernetes容器运行时为Docker(适合习惯使用Docker命令的场景)
如果希望Docker加载的镜像能直接被Kubernetes识别,可以切换集群的容器运行时为Docker:
- 安装cri-dockerd适配组件
- 修改kubelet启动配置,将容器运行时端点指定为
unix:///var/run/cri-dockerd.sock - 重启kubelet、containerd服务后,Docker与Kubernetes将共用镜像存储,你之前加载到Docker中的
app:test镜像可以直接被集群调用
额外注意事项
- 不要给本地镜像使用
latest标签,Kubernetes默认对latest标签的镜像执行强制拉取策略,就算手动指定拉取规则也可能触发公网拉取逻辑,建议给本地镜像打带具体版本的标签如app:v1 - 确认Pod配置中的镜像名称、标签与你导入的镜像完全一致,大小写、标签错误也会触发集群拉取未知镜像的行为
内容的提问来源于stack exchange,提问作者Olivier
相关产品推荐
相关产品推荐

