Kubernetes无法识别本地构建的containerd镜像问题求助
Kubernetes无法识别本地构建镜像问题排查与解决
问题背景
本地自建K8s集群中,Kubernetes无法识别本地构建的容器镜像,但通过nerdctl --namespace=k8s.io images和crictl images命令可确认镜像存在于k8s.io命名空间中。
集群环境信息
- Kubernetes版本:1.26.1
- 主机操作系统:AlmaLinux 9.1
- CNI及版本:Calico v3.24.5
- 容器运行时:Containerd v1.6.16
节点状态:
[root@alma-kube ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION alma-kube Ready control-plane 62d v1.26.1 alma-kube2 Ready worker 61d v1.26.0
crictl镜像列表:
crictl images IMAGE TAG IMAGE ID SIZE ... docker.io/library/mytestimage latest f240b96f676e1 2.81MB docker.io/library/nginx-test 1 5e34a0811eefb 56.9MB docker.io/library/nginx-test latest 5e34a0811eefb 56.9MB docker.io/nick/nginx latest 5e34a0811eefb 56.9MB docker.io/registry-nick/nginx-test latest 5e34a0811eefb 56.9MB
nerdctl镜像列表(k8s.io命名空间):
nerdctl --namespace=k8s.io images REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE ... mytestimage latest dfb4f2a8f7c9 5 hours ago linux/amd64 5.6 MiB 2.7 MiB nginx-test 1 7f7e7eb6b3c2 2 days ago linux/amd64 146.7 MiB 54.3 MiB registry latest 3f71055ad7c4 2 days ago linux/amd64 23.7 MiB 8.8 MiB registry-nick/nginx-test latest 7f7e7eb6b3c2 3 days ago linux/amd64 146.7 MiB 54.3 MiB
Pod配置文件
尝试多种镜像引用方式均触发相同错误:
apiVersion: v1 kind: Pod metadata: name: nginx-test-pod spec: containers: - name: nginx-test-crp image: mytestimage #image: docker.io/library/nginx-test:1 #image: registry-nick/nginx-test #image: localhost:5000/nginx-test imagePullPolicy: Never
创建命令:
kubectl apply -f pod-test.yaml
错误现象
Pod启动失败,触发ErrImageNeverPull错误:
kubectl get pod -o wide --all-namespaces default nginx-test-pod 0/1 ErrImageNeverPull 0 124m 192.168.48.11 alma-kube2 <none>
日志报错:
kubectl logs nginx-test-pod Error from server (BadRequest): container "nginx-test-crp" in pod "nginx-test-pod" is waiting to start: ErrImageNeverPull
事件详情:
kubectl describe pod nginx-test-pod Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning ErrImageNeverPull 58s (x630 over 136m) kubelet Container image "local-nick/bokluk" is not present with pull policy of Never
解决方法
1. 确认镜像存在于Pod调度节点
从Pod状态可见,Pod被调度到alma-kube2节点,但当前仅在控制节点alma-kube确认了镜像存在。登录alma-kube2节点,执行crictl images或nerdctl --namespace=k8s.io images,确认目标镜像是否存在。
若镜像仅在控制节点,可选择:
- 手动复制镜像到工作节点:
# 在alma-kube导出镜像 nerdctl --namespace=k8s.io save mytestimage -o mytestimage.tar # 复制到alma-kube2 scp mytestimage.tar root@alma-kube2:/tmp/ # 在alma-kube2导入镜像 nerdctl --namespace=k8s.io load -i /tmp/mytestimage.tar - 搭建本地私有仓库:将镜像推送到仓库后,Pod使用仓库地址拉取(需配置仓库为可信任源)。
2. 镜像名称完全匹配
Kubernetes严格校验镜像名称(含仓库前缀):
- 若
crictl images显示镜像全名为docker.io/library/mytestimage:latest,Pod的image字段必须写全该名称,不能省略前缀。 - 确认节点上的镜像名称与Pod配置完全一致,包括标签(如
latest)。
3. 检查Containerd命名空间
确保镜像存在于Kubernetes使用的k8s.io命名空间:
- 若构建镜像时未指定命名空间,可能存于默认
default命名空间,需迁移到k8s.io:nerdctl tag mytestimage:latest k8s.io/mytestimage:latest nerdctl --namespace=k8s.io pull mytestimage:latest # 本地迁移操作
4. 验证kubelet配置
确认kubelet指向正确的Containerd套接字:
- 检查kubelet配置文件(通常为
/var/lib/kubelet/config.yaml):containerRuntimeEndpoint: unix:///run/containerd/containerd.sock - 重启kubelet服务:
systemctl restart kubelet
5. 调整镜像拉取策略
临时将imagePullPolicy改为IfNotPresent,可排除因镜像名称匹配问题导致的拉取失败(镜像不存在时仍会报错,用于排查场景)。
内容的提问来源于stack exchange,提问作者Nikolas Naydenov
相关产品推荐
相关产品推荐

