多个PersistentVolumeClaims是否可以绑定到相同的本地存储PersistentVolume?

时间:2019-02-19 23:03:51

标签: kubernetes persistent-volumes persistent-volume-claims

我想知道是否有多个PersistentVolumeClaims绑定到同一local persistent volume

我的用例是否满足以下条件:我想构建一个守护程序集,该守护程序集将在群集的每个节点上(节点的本地磁盘上)写入一些数据(实际上是相同的数据)。然后,在任何节点上调度的任何其他Pod应该能够读取该数据。基本上是一种在节点级别上一次写入多次读取的策略。

我知道我可以使用 hostPath 类型的卷来做到这一点,但是管理起来有点困难,所以我发现本地存储将是一个更好的方法。

我希望是这样:

  • 使用 ReadWriteOnce ReadOnlyMany 访问模式
  • 创建本地持久卷(名为pv)
  • 使用 ReadWriteOnce 访问模式创建第一个持久性卷声明(pvc1),并在将数据写入卷的DaemonSet中使用它。因此 pvc1 应该绑定到 pv
  • 使用 ReadOnlyMany 访问模式创建第二个持久卷声明(pvc2),该访问模式在读取该数据的任何其他Pod中使用(因此 pvc2 也应绑定到 pv

这可能吗?

我读到,如果PVC绑定到PV,则PV被“锁定”,这意味着没有其他PVC可以绑定到它。这真的是这样吗?对于这种情况,如果我们有一次写入多次读取操作,这似乎有点限制。

谢谢!

1 个答案:

答案 0 :(得分:1)

用于RWO卷类型的DaemonSet和PVC不能很好地混合,因为所有DaemonSet将共享同一PVC。对于本地卷,这将导致仅计划一个副本,因为它将使用该PVC的所有Pod限制为仅计划到一个节点。

您可以使用StatefulSet解决此问题,StatefulSet支持volumeClaimTemplates,该NodePublishVolume为每个副本创建PVC,并将其缩放到群集中的节点数。但是,您的用户吊舱随后需要知道并选择要使用的特定PVC,而不是使用该节点上的任何东西。

我认为编写CSI driver可以更好地解决您的用例。它具有DaemonSet组件,该组件在驱动程序启动时可以初始化数据。然后,当它实现def longestPalindrome(s): pal = [] longestpalin = s l = list(s) if len(s)>0: if len(s)==2: p = l if p[0]==p[1]: return s else: return l[0] else: for i in range(0,len(l)): for j in range(i+1,len(l)+1): p = l[i:j] if p == p[::-1]: if len(p)>len(pal): pal = p p = ''.join(p) longestpalin = p return longestpalin else: return longestpalin (又称挂载到Pod中)时,可以将数据目录绑定挂载到Pod的容器中。您可以将这种卷类型设置为RWX,并且可能不需要实现任何用于提供或附加的控制器例程。