利用集群节点磁盘的 Kubernetes 存储提供程序
Kubernetes storage provider that leverages cluster node disk(s)
我正在 Kubernetes 之上构建一个平台,除其他要求外,它应该:
- 成为 OS 不可知论者。任何具有正常内核和 cgroup 挂载的 Linux。
- 利用集群节点磁盘提供持久存储。
- 提供 ReadWriteMany 卷或实现共享存储的方法。
- PODs 不应绑定到特定节点(如本地持久卷)
- 迁移 PODs 时(例如由于节点耗尽或节点丢失情况)自动重新附加卷
- 在存储级别提供数据复制
- 不假设每个节点都有可用的专用原始块设备。
我通过为 k8s 组件和容器引擎使用静态二进制文件来解决第一点。再加上也是静态二进制文件的最小主机工具。
我仍在寻找持久存储的解决方案。
我 evaluated/used 到目前为止:
- Rook:虽然在功能上满足要求,但有一个bug,卷没有随POD一起移动https://github.com/rook/rook/issues/1507
- OpenEBS:它不符合 OS 不可知论者的要求。每个节点上都需要 iSCSI 客户端和工具,这取决于主机 O/S https://docs.openebs.io/docs/next/prerequisites.html
所以问题是在使用集群节点磁盘时,对于 Kubernetes 持久存储我还有什么其他选择。
可以考虑以下选项
wards 上的 kubernetes 版本 1.14.0 支持本地持久卷。您可以使用节点标签来使用本地 pv。您可能必须 运行 HA(主从)模式下的有状态工作负载,以便在节点出现故障时数据可用
您可以在集群节点之一上安装 nfs 服务器,并将其用作工作负载的存储。 nfs 存储支持 ReadWriteMany。如果您在 baremetal
上设置集群,这可能会很好地工作
Rook 也是您已经尝试过的不错的选择之一,但它还没有准备好生产。
三者之中,第一个符合你的要求。想听听社区的任何其他选择。
根据官方 documentation 截至目前 (v1.16),K8S 支持在几种不同类型的卷上使用 WriteMany。
即这些是:cephfs, glusterfs and nfs
一般来说,有了所有这些,卷的内容就会被保留下来,而当 Pod 被移除时,卷只会被卸载。这意味着卷可以预先填充数据,并且可以在 Pods 之间“移交”数据。这些文件系统可以同时被多个写入器挂载。
在这些 FS 中,glusterfs can be deployed on each kubernetes cluster Node (at least 3 required). Data can be accessed in different ways 其中一个是 NFS。
persistentVolumeClaim
卷用于将 PersistentVolume 安装到 Pod 中。 PersistentVolumes 是用户在不知道特定云环境的详细信息的情况下“声明”持久存储(例如 GCE PersistentDisk 或 iSCSI 卷)的一种方式
以下类型的卷支持 ReadWriteMany:
- AzureFile
- CephFS
- Glusterfs
- 量子字节
-NFS
- PortworxVolume
但这不是一个无法控制底层基础设施的选项。
local
volume选项表示挂载的本地存储设备,如磁盘、分区或目录。本地卷只能用作静态创建的 PersistentVolume。缺点是如果一个节点变得不健康,那么本地卷也会变得不可访问,使用它的 Pod 将无法 运行.
所以目前没有适合所有开箱即用要求的解决方案。
您可以使用 OpenEBS Local PV,它可以使用默认存储为一个应用程序消耗整个磁盘 class openebs-device
并且您可以使用安装的磁盘来使用默认存储共享多个应用程序 class openebs-hostpath
。 User Guide
部分下的 OpenEBS 文档中提供了更多信息。这不需要open-iscsi。如果您使用的是直接设备,那么使用 OpenEBS 节点磁盘管理器,磁盘将被自动检测和消耗。
为了满足 RWM 用例,您可以使用本地 PV 使用此配置卷作为使用 NFS 供应器的多个应用程序的底层卷。 Stateful Application
部分下的 OpenEBS 文档中提到了相同的实现。
我正在 Kubernetes 之上构建一个平台,除其他要求外,它应该:
- 成为 OS 不可知论者。任何具有正常内核和 cgroup 挂载的 Linux。
- 利用集群节点磁盘提供持久存储。
- 提供 ReadWriteMany 卷或实现共享存储的方法。
- PODs 不应绑定到特定节点(如本地持久卷)
- 迁移 PODs 时(例如由于节点耗尽或节点丢失情况)自动重新附加卷
- 在存储级别提供数据复制
- 不假设每个节点都有可用的专用原始块设备。
我通过为 k8s 组件和容器引擎使用静态二进制文件来解决第一点。再加上也是静态二进制文件的最小主机工具。
我仍在寻找持久存储的解决方案。
我 evaluated/used 到目前为止:
- Rook:虽然在功能上满足要求,但有一个bug,卷没有随POD一起移动https://github.com/rook/rook/issues/1507
- OpenEBS:它不符合 OS 不可知论者的要求。每个节点上都需要 iSCSI 客户端和工具,这取决于主机 O/S https://docs.openebs.io/docs/next/prerequisites.html
所以问题是在使用集群节点磁盘时,对于 Kubernetes 持久存储我还有什么其他选择。
可以考虑以下选项
wards 上的 kubernetes 版本 1.14.0 支持本地持久卷。您可以使用节点标签来使用本地 pv。您可能必须 运行 HA(主从)模式下的有状态工作负载,以便在节点出现故障时数据可用
您可以在集群节点之一上安装 nfs 服务器,并将其用作工作负载的存储。 nfs 存储支持 ReadWriteMany。如果您在 baremetal
上设置集群,这可能会很好地工作
Rook 也是您已经尝试过的不错的选择之一,但它还没有准备好生产。
三者之中,第一个符合你的要求。想听听社区的任何其他选择。
根据官方 documentation 截至目前 (v1.16),K8S 支持在几种不同类型的卷上使用 WriteMany。
即这些是:cephfs, glusterfs and nfs
一般来说,有了所有这些,卷的内容就会被保留下来,而当 Pod 被移除时,卷只会被卸载。这意味着卷可以预先填充数据,并且可以在 Pods 之间“移交”数据。这些文件系统可以同时被多个写入器挂载。
在这些 FS 中,glusterfs can be deployed on each kubernetes cluster Node (at least 3 required). Data can be accessed in different ways 其中一个是 NFS。
persistentVolumeClaim
卷用于将 PersistentVolume 安装到 Pod 中。 PersistentVolumes 是用户在不知道特定云环境的详细信息的情况下“声明”持久存储(例如 GCE PersistentDisk 或 iSCSI 卷)的一种方式
以下类型的卷支持 ReadWriteMany:
- AzureFile
- CephFS
- Glusterfs
- 量子字节
-NFS
- PortworxVolume
但这不是一个无法控制底层基础设施的选项。
local
volume选项表示挂载的本地存储设备,如磁盘、分区或目录。本地卷只能用作静态创建的 PersistentVolume。缺点是如果一个节点变得不健康,那么本地卷也会变得不可访问,使用它的 Pod 将无法 运行.
所以目前没有适合所有开箱即用要求的解决方案。
您可以使用 OpenEBS Local PV,它可以使用默认存储为一个应用程序消耗整个磁盘 class openebs-device
并且您可以使用安装的磁盘来使用默认存储共享多个应用程序 class openebs-hostpath
。 User Guide
部分下的 OpenEBS 文档中提供了更多信息。这不需要open-iscsi。如果您使用的是直接设备,那么使用 OpenEBS 节点磁盘管理器,磁盘将被自动检测和消耗。
为了满足 RWM 用例,您可以使用本地 PV 使用此配置卷作为使用 NFS 供应器的多个应用程序的底层卷。 Stateful Application
部分下的 OpenEBS 文档中提到了相同的实现。