【问题标题】:Kubernetes : Dynamic Persistent Volume provisioning using NFSKubernetes:使用 NFS 的动态持久卷配置
【发布时间】:2017-09-03 20:31:02
【问题描述】:

我有多节点 kubernetes 设置。我正在尝试使用带有 NFS 卷插件的存储类动态分配持久卷。 我找到了 glusterfs、aws-ebs 等的存储类示例。但是,我没有找到 NFS 的任何示例。 如果我只创建 PV 和 PVC,那么 NFS 工作得很好(没有存储类)。 我尝试通过引用其他插件来为 NFS 编写存储类文件。请参考下面,

nfs-storage-class.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  namespace: kube-system
  name: my-storage
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"
  labels:
    kubernetes.io/cluster-service: "true"

provisioner: kubernetes.io/nfs
parameters:
  path: /nfsfileshare
  server: <nfs-server-ip> 

nfs-pv-claim.yaml

apiVersion: v1
metadata:
  name: demo-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: my-storage
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

没有用。所以,我的问题是,我们可以为 NFS 编写一个存储类吗?是否支持动态配置?

【问题讨论】:

标签: docker kubernetes nfs


【解决方案1】:

StorageClass 的目的是创建存储,例如来自云提供商(或他们在 kubernetes 文档中称之为“供应商”)。在 NFS 的情况下,您只想访问 现有存储并且不涉及创建。因此您不需要StorageClass。请参考这个blog

【讨论】:

  • 如果您不想为每个 pvc 手动创建一个 nfs 文件夹怎么办?假设您有一个 statefullset,并且每个副本都有其 nfs pvc,例如
【解决方案2】:

我正在考虑做同样的事情。我找到了https://github.com/kubernetes-incubator/external-storage/tree/master/nfs,我认为你的provisioner 是基于它的?

我认为 nfs 提供者需要在定义的路径下创建一个唯一目录。我不太确定如何做到这一点。

也许这比作为 kubernetes repo 上的 github issue 更好。

【讨论】:

  • 是的,我尝试了 external-storage nfs 配置器,但它对我不起作用。容器给出了一些错误。我没有时间调试它。但我会在之后的某个时间尝试
【解决方案3】:

使用 NFS 的动态存储配置不起作用,最好使用 glusterfs。有一个很好的教程,修复了设置时的常见问题。 http://blog.lwolf.org/post/how-i-deployed-glusterfs-cluster-to-kubernetes/

【讨论】:

  • 现在kubernetes直接支持NFS了。
  • 这是什么意思?我们现在可以在 PC Claims 中使用 NFS 了吗?
  • 可以,我们可以直接在pv中指定nfs ip和path。
【解决方案4】:

我还尝试在我的 kubernetes 集群上启用 NFS 配置器,但起初它没有工作,因为快速入门指南没有提到您也需要应用 rbac.yaml(我打开了 PR 到解决这个问题)。

如果我在集群上按照以下步骤操作,nfs 配置程序对我来说可以正常工作: https://github.com/kubernetes-incubator/external-storage/tree/master/nfs#quickstart

$ kubectl create -f deploy/kubernetes/deployment.yaml
$ kubectl create -f deploy/kubernetes/rbac.yaml
$ kubectl create -f deploy/kubernetes/class.yaml

那么你应该可以像这样创建 PVC:

$ kubectl create -f deploy/kubernetes/claim.yaml

您可能希望更改 deployment.yaml 中用于卷挂载的文件夹,以使其与您的集群匹配。

【讨论】:

    【解决方案5】:

    截至 2020 年 8 月,Kubernetes 上的 NFS 持久性如下所示:

    你可以

    • 直接将 NFS 卷放在 Pod 上:
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pd
    spec:
      containers:
      - image: k8s.gcr.io/test-webserver
        name: test-container
        volumeMounts:
        - mountPath: /test-pd
          name: test-volume
      volumes:
      - name: test-volume
        nfs:
          path: /foo/bar
          server: wherever.dns
    
    • 手动创建一个由 NFS 支持的 Persistent Volume,并使用 Persistent Volume Claim 挂载它(PV 规范如下所示):
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv0003
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: slow
      mountOptions:
        - hard
        - nfsvers=4.1
      nfs:
        path: /tmp
        server: 172.17.0.2
    
    • 使用external-storage 中的(现已弃用)NFS PV provisioner。这是两年前的最后一次更新,并且已经正式 EOL'd,祝你好运。使用此路由,您可以创建如下所示的存储类来满足来自 NFS 服务器的 PVC。
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: example-nfs
    provisioner: example.com/nfs
    mountOptions:
      - vers=4.1
    
    • 显然,CSI 是未来,there is a NFS CSI driver. 但是,它还不支持动态配置,所以它并不是非常有用。
      • 更新(2020 年 12 月): CSI 驱动程序的动态配置显然正在进行中(master,但尚未发布)。
    • 您也许可以将external-storage 的 NFS 配置器替换为来自社区的内容或您编写的内容。在研究这个问题时,我偶然发现了a provisioner written by someone on GitHub,。这些供应商是否表现良好、是否安全或完全可以工作,我无法理解,但它们确实存在。

    【讨论】:

      【解决方案6】:

      如果你使用的是AWS,相信你可以使用这个镜像来创建NFS服务器:

      https://hub.docker.com/r/alphayax/docker-volume-nfs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        • 2018-05-13
        • 2017-03-24
        • 2017-04-08
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多