Kubernetes - MountVolume.NewMounter 卷“<volume-name>”初始化失败:路径不存在

Kubernetes - MountVolume.NewMounter initialization failed for volume "<volume-name>" : path does not exist

我正在尝试使用 WSL 使用本地存储设置本地持久卷。但是 pod STATUS 停止在 Pending.

kubectl describe pod <pod-name> 给出以下错误。

Warning FailedMount 21s (x7 over 53s) kubelet MountVolume.NewMounter initialization failed for volume "pv1" : path "/mnt/data" does not exist

路径/mnt/data已创建并存在于本地机器上,但容器无法访问。

pod 和持久卷配置如下。

apiVersion : v1
kind : PersistentVolume
metadata :
   name : pv1
spec :
  capacity :
    storage : 2Gi
  accessModes :
    - ReadWriteOnce
  persistentVolumeReclaimPolicy : Retain
  storageClassName : local-storage
  local : 
    fsType : ext4
    path : /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1

---

apiVersion : v1
kind : PersistentVolumeClaim
metadata : 
  name : pvc1
spec :
  resources :
    requests :
      storage : 1Gi
  accessModes :
    - ReadWriteOnce
  storageClassName : local-storage

---

apiVersion : v1
kind : Pod
metadata :
  name : pod1
spec :
  containers:
  - name: www
    image: nginx:alpine
    ports:
      - containerPort: 80
        name: www
    volumeMounts:
      - name: www-store
        mountPath: /usr/share/nginx/html
  volumes :
    - name : www-store
      persistentVolumeClaim :
        claimName : pvc1

如有任何帮助,我们将不胜感激。

您正在使用 nodeSelector 作为 pv,告诉它使用 node1 作为音量,机会是 1. node1 不存在 /mnt/data 目录,即卷的 hostPath 2. node1 可能有 /mnt/data,但是 pod 被安排在其他没有 /mnt/data 的节点上目录:

apiVersion : v1
kind : PersistentVolume
metadata :
   name : pv1
spec :
  capacity :
    storage : 2Gi
  accessModes :
    - ReadWriteOnce
  persistentVolumeReclaimPolicy : Retain
  storageClassName : local-storage
  local : 
    fsType : ext4
    path : /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1

解法: 确保 /mnt/data 出现在所有可调度节点上

尝试修改您的文件以添加 nodeNamenodeSelectornodeAffinity 以强制将其安排在具有正确主机路径的同一节点上。在下面的示例中,假设 node1 存在 /mnt/data 目录。

apiVersion : v1
kind : Pod
metadata :
  name : pod1
spec :
  nodeName: node1 #<------------this
  containers:
  - name: www
    image: nginx:alpine
    ports:
      - containerPort: 80
        name: www
    volumeMounts:
      - name: www-store
        mountPath: /usr/share/nginx/html
  volumes :
    - name : www-store
      persistentVolumeClaim :
        claimName : pvc1

如果 运行 在 Rancher Kubernetes Engine (RKE) 集群上,这个问题可能是因为每个 kubelet 也作为容器运行。因此,它看不到它运行的节点的文件系统。

解决方案是在 cluster.yml 中配置集群时添加额外的绑定安装(用于 kubelet 服务)。例如,要在节点上安装 /data-1 作为 kubelet 上的 /data-1

services:
  ...
  kubelet: 
    extra_binds:
    - "/data-1:/data-1"