配置imagePullPolicy: Never仍拉取registry.k8s.io/pause:3.8失败求助
问题:配置
imagePullPolicy: Never后仍拉取registry.k8s.io/pause:3.8失败 问题背景
执行kubectl apply -f nfs-client.yaml部署NFS Provisioner,yaml内容如下:
# nfs-client.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nfs-provisioner spec: selector: matchLabels: app: nfs-provisioner replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-provisioner spec: serviceAccount: nfs-provisioner containers: - name: nfs-provisioner image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 imagePullPolicy: Never volumeMounts: - name: nfs-client mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: example.com/nfs - name: NFS_SERVER value: 192.168.176.134 - name: NFS_PATH value: /srv/nfs volumes: - name: nfs-client nfs: server: 192.168.176.134 path: /srv/nfs
执行kubectl get pod显示Pod处于ContainerCreating状态:
$ kubectl get pod NAME READY STATUS RESTARTS AGE nfs-provisioner-7685bb75f5-4lv67 0/1 ContainerCreating 0 15m
执行kubectl describe pod发现创建Pod沙箱时拉取registry.k8s.io/pause:3.8失败,报错为连接外部仓库被拒绝。已从镜像站拉取该镜像及业务镜像并打标签,Master和Worker节点本地均存在:
$ sudo ctr images list | grep "registry.k8s.io" registry.k8s.io/pause:3.8 application/vnd.docker.distribution.manifest.v2+json sha256:e0cc6dba04bee00badd8b13495d4411060b5563a9499fbc20e46316328efad30 301.3 KiB linux/amd64 - registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 application/vnd.docker.distribution.manifest.v2+json sha256:f741e403b3ca161e784163de3ebde9190905fdbf7dfaa463620ab8f16c0f6423 17.1 MiB linux/amd64 - swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.8 application/vnd.docker.distribution.manifest.v2+json sha256:e0cc6dba04bee00badd8b13495d4411060b5563a9499fbc20e46316328efad30 301.3 KiB linux/amd64 - swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 application/vnd.docker.distribution.manifest.v2+json sha256:f741e403b3ca161e784163de3ebde9190905fdbf7dfaa463620ab8f16c0f6423 17.1 MiB linux/amd64 -
已在Deployment中配置imagePullPolicy: Never,为何仍出现拉取registry.k8s.io/pause:3.8失败的错误?
原因分析
imagePullPolicy: Never仅对Deployment中定义的业务容器生效,而registry.k8s.io/pause:3.8是Kubernetes用来创建Pod沙箱的基础设施容器(Infra Container),它的拉取策略不受业务容器配置的控制。- 容器运行时(如containerd)创建Pod沙箱时,会默认尝试从远程仓库拉取pause镜像,即使本地已有该镜像,可能是因为:
- 镜像未存储在Kubernetes使用的容器运行时命名空间下(比如containerd的
k8s.io命名空间) - 容器运行时的默认镜像拉取策略未设置为
Never
- 镜像未存储在Kubernetes使用的容器运行时命名空间下(比如containerd的
解决方法
方法1:确保pause镜像在容器运行时的正确命名空间下
以containerd为例,Kubernetes默认使用k8s.io命名空间存储集群使用的镜像:
- 检查该命名空间下是否存在pause镜像:
sudo ctr -n k8s.io images list | grep pause
- 如果不存在,将本地镜像导入到
k8s.io命名空间:
# 从本地已有标签复制镜像到目标命名空间 sudo ctr -n k8s.io images tag registry.k8s.io/pause:3.8 registry.k8s.io/pause:3.8
方法2:修改容器运行时配置,强制使用本地镜像
修改containerd的配置文件(通常路径为/etc/containerd/config.toml):
- 找到并修改沙箱镜像配置,同时设置默认拉取策略为
Never:
[plugins."io.containerd.grpc.v1.cri"] # 指定沙箱镜像 sandbox_image = "registry.k8s.io/pause:3.8" [plugins."io.containerd.grpc.v1.cri".image_pull_policy] # 设置默认拉取策略为Never default = "Never"
- 重启containerd服务:
sudo systemctl restart containerd
方法3:配置kubelet使用本地镜像
修改kubelet的配置文件(路径通常为/var/lib/kubelet/config.yaml),添加或修改镜像拉取策略:
imagePullPolicy: Never
然后重启kubelet服务:
sudo systemctl restart kubelet
内容的提问来源于stack exchange,提问作者jimmylynkx
相关产品推荐
相关产品推荐

