无法在Kubernetes Pod上挂载NFS

3

我正在部署Hyperledger Fabric测试网络到Kubernetes minikube集群上。我打算使用PersistentVolume在各个peer和orderer之间共享cytpo-config和channel artifacts。以下是我的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 的 pod。
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

NFS已在我的EC2实例上设置。 我已经验证了NFS服务器运行良好,并且我能够将其挂载到minikube中。 我不明白我做错了什么,但是位于3.128.203.245:/nfsroot内的任何文件都不存在于test-shell:/data中。

我错过了什么要点。 我甚至尝试了hostPath挂载,但无济于事。 请帮助我解决问题。


你能否检查一下你的NFS服务器是否已经导出?NFS服务器配置参考链接 - Rohit
Kubernetes文档称,您可以在卷下直接将NFS服务器挂载到Pod上。唯一的问题是,您应该导出NFS服务器以使其可供Pod使用,或在Pod内访问预填充数据存储在NFS服务器上。参考链接 - Rohit
你好,您使用的是哪个版本的k8s? - Piotr Malec
@Rohit 我在 EC2 上设置了 NFS 服务器。上面提到的 IP 是 NFS 服务器的正确 IP。我已经成功导出,并在 /etc/exports 中允许了 *。同时,我能够在我的 minikube 和实际的 Ubuntu 系统中连接到它。只有在 Pod 中,文件似乎丢失了。如果导出和挂载没有正确完成,kubectl 是否会告诉它无法在 Pod 上挂载卷。相反,我能够通过在 Pod 容器内执行 touch 命令来创建文件。 - Abhijeet Bhowmik
你弄清楚问题出在哪里了吗?是 PV 和 PVC 之间的差异吗? - P....
你解决了这个问题吗?请提供更多细节:kubectl get sc,pv,pvc-o wide,kubectl describe pod test-shell。 - Mark
2个回答

1

我认为您应该检查以下内容以验证NFS是否已成功挂载

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

    $showmount -e nfs-server-ip

例如,在我的情况下 $showmount -e 172.16.10.161 172.16.10.161的导出列表: /opt/share *

  • 使用$ df -hT命令查看NFS是否已经挂载,例如在我的情况下,它会输出172.16.10.161:/opt/share nfs4 91G 32G 55G 37% /opt/share

  • 如果没有挂载,则使用以下命令

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

  • 如果上述命令显示错误,则检查防火墙是否允许NFS

    $sudo ufw status

  • 如果没有允许,则可以使用以下命令进行允许

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

  • 我已经做了相同的设置,没有遇到任何问题。我的fabric k8s集群正在成功运行。hf k8s yaml文件可以在我的GitHub存储库中找到。在那里,我部署了银行联盟在hyperledger fabric上,这是一个动态的多主机区块链网络,这意味着您可以在现有的运行中的区块链网络中添加组织、节点、加入节点、创建通道、安装和实例化链码。


    0

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

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

    例如,NFS不提供内部provisioner,但可以使用外部provisioner。还有一些情况是第三方存储供应商提供自己的外部provisioner。

    更改默认的StorageClass

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

    minikube addons list 
    

    要列出集群中的所有StorageClasses,请使用以下命令:

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

    请注意,最多只能将一个StorageClass标记为默认。如果有两个或更多的StorageClass被标记为默认,则无法创建未明确指定storageClassName的PersistentVolumeClaim。
    在您的示例中,最可能的情况是您已经有了默认的StorageClass。应用这些资源会导致新的PV创建(没有StoraglClass),新的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
    

    这个例子无法工作,原因如下:

    • new persistentvolume/nfs已被创建(没有参考pvc)
    • new persistentvolume/pvc-8aeb802f-cd95-4933-9224-eb467aaa9871使用默认的StorageClass被创建。在声明部分中,我们可以注意到此pv是由于使用默认的StorageClass参考default/pvc-nfs声明(persistentvolumeclaim/pvc-nfs)而创建的。

    解决方案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类型,需要helper程序/sbin/mount.nfs来支持挂载NFS文件系统。

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

    注意

    控制平面可以将PersistentVolumeClaims绑定到集群中匹配的PersistentVolumes。但是,如果您想要PVC绑定到特定的PV,则需要预先绑定它们。
    通过在PersistentVolumeClaim中指定PersistentVolume,您声明了该特定PV和PVC之间的绑定关系。如果PersistentVolume存在并且没有通过其claimRef字段保留PersistentVolumeClaims,则PersistentVolume和PersistentVolumeClaim将被绑定。
    绑定发生的条件不受某些卷匹配标准(包括节点亲和性)的影响。控制平面仍会检查存储类、访问模式和请求的存储大小是否有效。
    一旦创建了PV/PVC或者在PV/PVC绑定方面出现问题,请使用以下命令来查看当前状态:
    kubectl get pv,pvc,sc
    kubectl describe pv
    kubectl describe pvc
    kubectl describe pod 
    kubectl get events
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接