【问题标题】:Dynamic storages in KubernetesKubernetes 中的动态存储
【发布时间】:2022-01-12 13:34:02
【问题描述】:

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

我面临几个困难:

  • 我不想要“a”存储,我想要明确指定的 SMB 共享
  • 这些共享是在应用程序中动态定义的,事先不知道
  • 我有可变数量的共享,并且单个 pod 需要能够访问所有这些

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

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

  • HostPath 卷存在安全风险
  • 对于这个解决方案,我需要 Kubernetes 之外的东西,在每个 Kubernetes 节点上自动挂载 SMB 共享

有没有更好的解决方案我错过了?

似乎与这种方法最匹配的 Kubernetes 对象是 Projected Volume,因为它“将现有的卷源映射到同一目录中”。但是,它不支持我需要的卷源类型,我认为在不重新启动使用此 Projected Volume 的 Pod 的情况下动态添加/删除卷源是不可能的。

【问题讨论】:

  • 所以所有 pod 的 SMB 共享都不相同?您说 SMB 共享是动态配置的 - 它(SMB 共享)是否在一个 pod 上发生变化?您使用的是哪个 Kubernetes 版本?
  • 所有 pod 的 SMB 共享相同。份额是可配置的。添加共享后,除了其他共享,所有 pod 都必须能够访问该新共享(在需要时)。我们使用 Kubernetes 1.21。

标签: kubernetes dynamic persistent-volumes


【解决方案1】:

确定您当前在节点上使用 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 scripta helm chart 安装SMB CSI 驱动程序。

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

在这两种情况下,您都必须将先前创建的密钥与凭据一起使用。

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

CSI Driver的优势在于newer, currently maintained solution and it replaced FlexVolume

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

同时检查:

【讨论】:

  • 很好的解释。
  • 非常感谢您的深入解释。如果我正确理解了图表,CSI 插件仍然依赖于幕后的 Hostpath 卷。这里也没有什么神奇之处:“privileged: true”是必需的,这也是我们最终在节点上本地安装共享的原因(也是一个安全问题)。除非我错过了什么,否则这也不能解决我从同一个容器访问可变数量的存储的需要。回想起来,这可能是解决此要求的错误方法。更好的方法是为每个存储设置专用的 pod。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多