You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

解决方法

方法1:确保pause镜像在容器运行时的正确命名空间下

以containerd为例,Kubernetes默认使用k8s.io命名空间存储集群使用的镜像:

  1. 检查该命名空间下是否存在pause镜像:
sudo ctr -n k8s.io images list | grep pause
  1. 如果不存在,将本地镜像导入到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):

  1. 找到并修改沙箱镜像配置,同时设置默认拉取策略为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"
  1. 重启containerd服务:
sudo systemctl restart containerd

方法3:配置kubelet使用本地镜像

修改kubelet的配置文件(路径通常为/var/lib/kubelet/config.yaml),添加或修改镜像拉取策略:

imagePullPolicy: Never

然后重启kubelet服务:

sudo systemctl restart kubelet

内容的提问来源于stack exchange,提问作者jimmylynkx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:25:57