无法在Kubernetes Pod上挂载NFS 解决方案 1解决方案 2

问题描述

我正在在Kubernetes minikube集群上部署Hyperledger Fabric测试网络。我打算使用PersistentVolume在各个对等点和订购者之间共享cytpo-config和通道构件。以下是我的PersistentVolume.yaml和PersistentVolumeClaim.yaml

kind: PersistentVolume
apiVersion: v1
Metadata:
  name: persistent-volume
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: "/nfsroot"
    server: "3.128.203.245"
    readOnly: false

kind: PersistentVolumeClaim
apiVersion: v1
Metadata:
  name: persistent-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

以下是上面声明位于/ data上的吊舱

kind: Pod
apiVersion: v1
Metadata:
  name: test-shell
  labels:
    name: test-shell
spec:
  containers:
    - name: shell
      image: ubuntu
      command: ["/bin/bash","-c","while true ; do sleep 10 ; done"] 
      volumeMounts:
      - mountPath: "/data"
        name: pv
  volumes:
    - name: pv
      persistentVolumeClaim:
        claimName: persistent-volume-claim

在我的EC2实例上设置了NFS。我已验证NFS服务器工作正常,并且能够将其安装在minikube中。我不明白我在做什么错,但是3.128.203.245:/nfsroot中存在的任何文件都不在test-shell:/ data中。

我错过了什么?我什至尝试过hostPath挂载,但无济于事。请帮帮我。

解决方法

我认为你应该检查以下几点来验证 NFS 是否成功挂载

  1. 在要挂载的节点上运行此命令。

    $showmount -e nfs-server-ip

就像我的情况$showmount -e 172.16.10.161 172.16.10.161 的导出列表: /opt/share *

  1. 使用 $df -hT 命令查看 NFS 是否已挂载,就像我的情况一样,它会给出输出 172.16.10.161:/opt/share nfs4 91G 32G 55G 37% /opt/share>

  2. 如果没有挂载则使用下面的命令

    $sudo mount -t nfs 172.16.10.161:/opt/share /opt/share

  3. 如果上述命令显示错误,请检查防火墙是否允许 nfs

    $sudo ufw status

  4. 如果没有,则允许使用该命令

    $sudo ufw allow from nfs-server-ip to any port nfs

我做了同样的设置,我没有遇到任何问题。 My k8s cluster of fabric is running successfully 。 hf k8s yaml 文件可以在我的 GitHub repo 中找到。我在超级账本结构上部署了银行联盟,这是一个动态的多主机区块链网络,这意味着您可以在现有运行的区块链网络中随时随地添加组织、节点、加入节点、创建通道、安装和实例化链代码。

,

默认情况下,在 minikube 中你应该有默认的 StorageClass

每个 StorageClass 包含字段 provisioner、parameters 和 reclaimPolicy,当属于该类的 PersistentVolume 需要动态配置时使用。

例如,NFS 不提供内部配置器,但可以使用外部配置器。在某些情况下,第 3 方存储供应商也会提供自己的外部供应商。

Change the default StorageClass

在您的示例中,此属性可能会导致问题。 要在 minikube 中列出已启用的插件,请使用:

minikube addons list 

要列出集群中的所有 StorageClass,请使用:

kubectl get sc
NAME                 PROVISIONER
standard (default)   k8s.io/minikube-hostpath

请注意,最多可以将一个 StorageClass 标记为默认。如果其中两个或多个被标记为默认值,则无法创建没有明确指定 storageClassName 的 PersistentVolumeClaim。

在您的示例中,最可能的情况是您已经默认 StorageClass。应用这些资源导致:新的 PV 创建(没有 StorageClass),新的 PVC 创建(参考现有的默认 StorageClass)。在这种情况下,您的自定义 pv/pvc 绑定之间没有参考)作为示例,请看:

kubectl get pv,pvc,sc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
persistentvolume/nfs                                        3Gi        RWX            Retain           Available                                             50m
persistentvolume/pvc-8aeb802f-cd95-4933-9224-eb467aaa9871   1Gi        RWX            Delete           Bound       default/pvc-nfs   standard                50m

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-nfs   Bound    pvc-8aeb802f-cd95-4933-9224-eb467aaa9871   1Gi        RWX            standard       50m

NAME                                             PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  103m

由于以下原因,此示例不起作用:

  • 新的persistentvolume/nfs已创建(不涉及pvc)
  • 新的 Persistentvolume/pvc-8aeb802f-cd95-4933-9224-eb467aaa9871 已使用默认 StorageClass 创建。在声明部分,我们可以注意到,由于使用默认 StorageClass 参考 default/pvc-nfs 声明 (persistentvolumeclaim/pvc-nfs) 进行动态 pv 配置,因此已创建此 pv。

解决方案 1。

根据评论中的信息:

此外,我还可以在我的 minikube 和我的实际 ubuntu 系统中连接到它。 我可以从 minikube 主机内部挂载这个 nfs 共享

如果您将 nfs 共享挂载到您的 minikube 节点,请尝试直接从您的 pod 中使用带有 hostpath 卷的示例:

apiVersion: v1
kind: Pod
metadata:
  name: test-shell
  namespace: default
spec:
  volumes:
  - name: pv
    hostPath:
      path: /path/shares # path to nfs mount point on minikube node
  containers:
  - name: shell
    image: ubuntu
    command: ["/bin/bash","-c","sleep 1000 "]
    volumeMounts:
    - name: pv
      mountPath: /data

解决方案 2。

如果您使用的是 PV/PVC 方法:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: persistent-volume
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: "" # Empty string must be explicitly set otherwise default StorageClass will be set / or custom storageClassName name
  nfs:
    path: "/nfsroot"
    server: "3.128.203.245"
    readOnly: false
  claimRef:
    name: persistent-volume-claim
    namespace: default  

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: persistent-volume-claim
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: "" # Empty string must be explicitly set otherwise default StorageClass will be set / or custom storageClassName name
  volumeName: persistent-volume

注意:

如果您没有引用与您的 StorageClass 在集群中使用 PersistentVolume 可能需要与卷类型相关的帮助程序。在这个例子中,PersistentVolume 是 NFS 类型,需要帮助程序 /sbin/mount.nfs 来支持 NFS 文件系统的挂载。

请记住,当您创建 pvc kubernetes 时,persistent-controller 正在尝试将 pvc 与适当的 pv 绑定。在此过程中,会考虑不同的因素,例如:storageClassName(默认/自定义)、accessModesclaimRef卷名称。 在这种情况下,您可以使用: PersistentVolume.spec.claimRef.name:persistent-volume-claim PersistentVolumeClaim.spec.volumeName:persistent-volume

Note

控制平面可以将 PersistentVolumeClaims 绑定到集群中匹配的 PersistentVolume。但是,如果你想让一个 PVC 绑定到一个特定的 PV,你需要预先绑定它们。

通过在 PersistentVolumeClaim 中指定 PersistentVolume,您可以声明该特定 PV 和 PVC 之间的绑定。如果 PersistentVolume 存在并且没有通过它的 claimRef 字段保留 PersistentVolumeClaims,那么 PersistentVolume 和 PersistentVolumeClaim 将被绑定。

无论某些卷匹配标准如何,包括节点亲和性,绑定都会发生。控制平面仍会检查存储类别、访问模式和请求的存储大小是否有效。

一旦创建了 PV/pvc 或者如果 pv/pvc 绑定有任何问题,请使用以下命令来计算当前状态:

kubectl get pv,sc
kubectl describe pv
kubectl describe pvc
kubectl describe pod 
kubectl get events