39

用例:

我有一个可用的 NFS 目录,我想用它来为多个部署和 pod 保存数据。

我创建了一个PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: http://mynfs.com
    path: /server/mount/point

我希望多个部署能够使用它PersistentVolume,所以我对所需要的理解是我需要创建多个PersistentVolumeClaims都指向这一点PersistentVolume

kind: PersistentVolumeClaim
apiVersion: v1
metaData:
  name: nfs-pvc-1
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Mi

我相信这会在PersistentVolume. 当我运行时kubectl get pvc,我看到:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1   Bound      nfs-pv    10Gi        RWX           35s

我不明白为什么我看到的是 10Gi 容量,而不是 50Mi。

然后,当我更改PersistentVolumeClaim部署 yaml 以创建名为 PVC时,nfs-pvc-2我得到以下信息:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-1   Bound      nfs-pv    10Gi        RWX           35s
nfs-pvc-2   Pending                                        10s

PVC2 从不绑定到 PV。这是预期的行为吗?我可以有多个 PVC 指向同一个 PV 吗?

当我删除nfs-pvc-1时,我看到了同样的事情:

NAME        STATUS     VOLUME    CAPACITY    ACCESSMODES   AGE
nfs-pvc-2   Pending                                        10s

再次,这是正常的吗?

在多个部署/吊舱之间使用/重用共享 NFS 资源的适当方法是什么?

4

5 回答 5

29

基本上你不能做你想做的事,因为关系 PVC <--> PV 是一对一的。

如果 NFS 是您唯一可用的存储并且希望在一个 nfs 导出上使用多个 PV/PVC,请使用动态配置和默认存储类。

它还没有在官方的 K8s 中,但是这个在孵化器中,我已经尝试过了,效果很好:https ://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

这将极大地简化您的卷配置,因为您只需要处理 PVC,并且 PV 将作为您定义的 nfs 导出/服务器上的目录创建。

于 2018-02-02T09:58:14.127 回答
23

来自:https ://docs.openshift.org/latest/install_config/storage_examples/shared_storage.html

正如 Baroudi Safwen 提到的,您不能将两个 pvc 绑定到同一个 pv,但您可以在两个不同的 pod 中使用同一个 pvc。

volumes:
- name: nfsvol-2
  persistentVolumeClaim:
    claimName: nfs-pvc-1 <-- USE THIS ONE IN BOTH PODS   
于 2017-05-31T15:09:53.387 回答
11

持久卷声明专门绑定到持久卷。
您不能将 2 pvc 绑定到同一个 pv

我猜你对动态配置感兴趣。我在部署 statefulsets 时遇到了这个问题,这需要对 pod 进行动态配置。所以你需要在你的集群中部署一个 NFS Provisioner,NFS provisioner(pod) 将有权访问 NFS 文件夹(hostpath),并且每次 Pod 请求一个卷时,NFS provisioner 会代表它挂载到 NFS 目录中的豆荚。
这是部署它的 github 存储库:
https ://github.com/kubernetes-incubator/external-storage/tree/master/nfs/deploy/kubernetes
但是您必须小心,您必须确保 nfs 配置程序始终在您拥有 NFS 文件夹的同一台机器上运行,因为您的卷是 hostpath 类型的,因此您需要使用节点选择器。

于 2017-05-27T11:42:41.760 回答
1

对于我未来的自己和其他正在寻找官方文档的人:

https://kubernetes.io/docs/concepts/storage/persistent-volumes/#binding

一旦绑定,PersistentVolumeClaim 绑定是独占的,无论它们是如何绑定的。PVC 到 PV 的绑定是一对一的映射,使用 ClaimRef,它是 PersistentVolume 和 PersistentVolumeClaim 之间的双向绑定。

于 2020-12-22T13:05:20.440 回答
0

关于动态配置的几点..

使用 nfs 的动态配置会阻止您更改任何默认的 nfs 挂载选项。在我的平台上,这使用 1M 的 rsize/wsize。在某些使用小文件或块读取的应用程序中,这可能会导致巨大的问题。(我刚刚在很大程度上解决了这个问题)

如果满足您的需求,动态是一个不错的选择。我现在坚持为我的应用程序创建 250 个 pv/pvc 对,由于 1-1 关系,这些对由动态处理。

于 2019-09-04T02:25:42.613 回答