Kubernetes 中的动态存储

Dynamic storages in Kubernetes

我在 Kubernetes 上有一个应用程序 运行,它需要访问在所述应用程序中动态配置的 SMB 共享(主机、凭据等)。我正在努力通过 Kubernetes(干净地)实现这一目标。

我面临几个困难:

我们目前有一个解决方案,在每个 kubernetes 工作节点上,所有共享都挂载到公共文件夹中的挂载点。然后将此文件夹作为 HostPath 卷提供给需要访问这些存储的容器。最后,这些容器中的每一个都有一个逻辑来访问与他需要的存储匹配的子文件夹。

缺点以及我寻找更清洁的替代品的原因是:

有没有我遗漏的更好的解决方案?

似乎最符合这种方法的 Kubernetes 对象是 Projected Volume,因为它“将现有的卷源映射到同一目录”。但是,它不支持我需要的体积源类型,我认为如果不重新启动使用此 Projected Volume 的 pods 就不可能动态 add/remove 体积源。

可以肯定的是,您当前在节点上使用 HostPath 的解决方案不灵活、不安全,因此这不是一个好的做法。

我认为您应该考虑为您的 SMB 共享使用一种自定义驱动程序:


CIFS FlexVolume 插件:

此解决方案较旧,已被 CSI 驱动程序取代。与 CSI 相比的优点是您可以指定 SMB shares directly from the pod definition (including credentials as Kubernetes secret) as you prefer.

Here 您可以找到有关如何在集群上安装此插件的说明。

SMB CSI 驱动程序:

此驱动程序将自动处理 mounting SMB shares on all nodes by using DaemonSet

您可以通过 bash script or by using a helm chart.

安装 SMB CSI 驱动程序

假设您已准备好 SMB 服务器,您可以使用以下解决方案之一从您的 pod 访问它:

在这两种情况下,您都必须使用先前创建的密码和凭据。

在您的情况下,您应该为每个 SMB 共享创建一个存储 class / PV 并将其安装到 pod。

CSI驱动的优势在于newer, currently maintained solution and it replaced FlexVolume.

下图展示了 CSI 插件的运作方式:

同时检查: