Kubernetes NFS 持久卷 - 对同一卷有多个声明?索赔卡在待定状态?
Kubernetes NFS Persistent Volumes - multiple claims on same volume? Claim stuck in pending?
用例:
我有一个可用的 NFS 目录,我想用它来保存多个部署的数据 & pods。
我创建了一个 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
上创建 50MB 的声明。当我 运行 kubectl get pvc
时,我看到:
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs-pvc-1 Bound nfs-pv 10Gi RWX 35s
我不明白为什么我看到的是 10Gi 容量,而不是 50Mi。
当我更改 PersistentVolumeClaim
部署 yaml 以创建名为 nfs-pvc-2
的 PVC 时,我得到了这个:
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
再问一次,这正常吗?
在多个部署之间 use/re-use 共享 NFS 资源的适当方法是什么/pods?
持久卷声明专门绑定到持久卷。
您不能将 2 个 pvc 绑定到同一个 pv。
我猜你对动态配置感兴趣。我在部署有状态集时遇到了这个问题,它需要 pods 的动态配置。所以你需要在你的集群中部署一个 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 provisioner 总是在你有 NFS 文件夹的同一台机器上运行,因为你的卷是主机路径类型。
发件人:https://docs.openshift.org/latest/install_config/storage_examples/shared_storage.html
正如Baroudi Safwen所说,你不能将两个pvc绑定到同一个pv,但是你可以在两个不同的pods中使用同一个pvc。
volumes:
- name: nfsvol-2
persistentVolumeClaim:
claimName: nfs-pvc-1 <-- USE THIS ONE IN BOTH PODS
基本上你不能为所欲为,因为关系 PVC <--> PV 是一对一的。
如果 NFS 是您唯一可用的存储并且希望在一个 nfs 导出中使用多个 PV/PVC,请使用动态配置和默认存储 class。
它还没有在官方的 K8s 中,但是这个在孵化器中,我已经尝试过并且效果很好:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client
这将极大地简化您的卷配置,因为您只需要处理 PVC,并且 PV 将创建为您定义的 nfs 导出/服务器上的一个目录。
关于动态配置的几点..
使用 nfs 的动态配置可防止您更改任何默认的 nfs 安装选项。在我的平台上,它使用 1M 的 rsize/wsize。在一些使用小文件或块读取的应用程序中,这可能会导致巨大的问题。 (我刚刚在很大程度上解决了这个问题)
动态是一个不错的选择,如果它适合您的需要。我现在坚持为我的应用程序创建 250 pv/pvc 对,由于 1-1 关系,这些应用程序由动态处理。
为了我未来的自己和其他正在寻找官方文档的人:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#binding
Once bound, PersistentVolumeClaim binds are exclusive, regardless of
how they were bound. A PVC to PV binding is a one-to-one mapping,
using a ClaimRef which is a bi-directional binding between the
PersistentVolume and the PersistentVolumeClaim.
用例:
我有一个可用的 NFS 目录,我想用它来保存多个部署的数据 & pods。
我创建了一个 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
上创建 50MB 的声明。当我 运行 kubectl get pvc
时,我看到:
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
nfs-pvc-1 Bound nfs-pv 10Gi RWX 35s
我不明白为什么我看到的是 10Gi 容量,而不是 50Mi。
当我更改 PersistentVolumeClaim
部署 yaml 以创建名为 nfs-pvc-2
的 PVC 时,我得到了这个:
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
再问一次,这正常吗?
在多个部署之间 use/re-use 共享 NFS 资源的适当方法是什么/pods?
持久卷声明专门绑定到持久卷。
您不能将 2 个 pvc 绑定到同一个 pv。
我猜你对动态配置感兴趣。我在部署有状态集时遇到了这个问题,它需要 pods 的动态配置。所以你需要在你的集群中部署一个 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 provisioner 总是在你有 NFS 文件夹的同一台机器上运行,因为你的卷是主机路径类型。
发件人:https://docs.openshift.org/latest/install_config/storage_examples/shared_storage.html
正如Baroudi Safwen所说,你不能将两个pvc绑定到同一个pv,但是你可以在两个不同的pods中使用同一个pvc。
volumes:
- name: nfsvol-2
persistentVolumeClaim:
claimName: nfs-pvc-1 <-- USE THIS ONE IN BOTH PODS
基本上你不能为所欲为,因为关系 PVC <--> PV 是一对一的。
如果 NFS 是您唯一可用的存储并且希望在一个 nfs 导出中使用多个 PV/PVC,请使用动态配置和默认存储 class。
它还没有在官方的 K8s 中,但是这个在孵化器中,我已经尝试过并且效果很好:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client
这将极大地简化您的卷配置,因为您只需要处理 PVC,并且 PV 将创建为您定义的 nfs 导出/服务器上的一个目录。
关于动态配置的几点..
使用 nfs 的动态配置可防止您更改任何默认的 nfs 安装选项。在我的平台上,它使用 1M 的 rsize/wsize。在一些使用小文件或块读取的应用程序中,这可能会导致巨大的问题。 (我刚刚在很大程度上解决了这个问题)
动态是一个不错的选择,如果它适合您的需要。我现在坚持为我的应用程序创建 250 pv/pvc 对,由于 1-1 关系,这些应用程序由动态处理。
为了我未来的自己和其他正在寻找官方文档的人:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#binding
Once bound, PersistentVolumeClaim binds are exclusive, regardless of how they were bound. A PVC to PV binding is a one-to-one mapping, using a ClaimRef which is a bi-directional binding between the PersistentVolume and the PersistentVolumeClaim.