1

我想知道是否有可能多个 PersistentVolumeClaims 绑定到同一个本地持久卷

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

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

我的愿望是:

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

这可能吗?

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

谢谢!

4

1 回答 1

2

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

您可以通过使用 StatefulSet 来解决这个问题,它支持volumeClaimTemplates为每个副本创建一个 PVC,并使其扩展到集群中的节点数量。但是,您的用户 pod 需要知道并选择要使用的特定 PVC,而不是使用该节点上的任何内容。

我认为通过编写CSI 驱动程序可以更好地解决您的用例。它有一个 DaemonSet 组件,在驱动程序启动时可以初始化数据。然后当它实现NodePublishVolume(也就是挂载到 pod 中)时,它可以将数据目录绑定挂载到 pod 的容器中。您可以将此卷类型设为 RWX,并且您可能不需要实现任何用于配置或附加的控制器例程。

于 2019-02-20T00:06:13.747 回答