【问题标题】:Kubernetes Persistent Volume for Pod in Production生产中 Pod 的 Kubernetes 持久卷
【发布时间】:2020-06-08 19:40:50
【问题描述】:

我执行了一个场景,我使用 PV 和 PVC 在我的 K8s 集群上部署了 Microsoft SQL 数据库。它运作良好,但我看到一些奇怪的行为。我创建了 PV,但它只在一个节点上可见,而在其他工作节点上不可见。我在这里遗漏了什么,请输入什么?

背景:

服务器 1 - 主服务器

服务器 2 - 工作人员

服务器 3 - 工作人员

服务器 4 - 工作人员

Pod:“MyDb”在没有任何副本集的服务器(节点)4 上运行。我猜是因为我的 POD 在 server-4 上运行,PV 在创建 POD 时在服务器 4 上创建并在其中引用 PVC(声明)。

请让我知道您对此问题的看法或分享您对在生产集群中安装共享磁盘的意见。

想要在 K8s 集群上部署 SQL DB,可以参考 Philips 的博客。链接如下,

https://www.phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-1/(无 PV)

https://www.phillipsj.net/posts/sql-server-on-linux-on-kubernetes-part-2/(带有 PV 和声明)

问候, 法鲁克


请在下面查看我对原始问题陈述的发现。 问题:创建了 SQL Server 的 POD。在运行时,K8s 在 server-4 上创建了这个 pod,因此在 server-4 上创建了 PV。但是,在其他节点上没有创建 PV 路径(/tmp/sqldata_.

  • 我关闭了 server-4 节点并运行删除 SQL pod 的命令(最初没有使用副本)。
  • POD 的状态更改为“终止”POD
  • 有一段时间没有发生任何事情。
  • 我重新启动了 server-4 并注意到 POD 立即被删除。

下一步: - 我再次停止了 server-4 并创建了相同的 pod。 - POD 是在运行时在 server-3 节点上创建的,我看到 PV (/tmp/sqldata) 也在 server-3 上创建。但是,我的所有数据(示例样本表)都丢失了。现在是服务器 3 上的全新 PV。

我假设 PV 将安装在外部存储卷上,而不是来自集群中任何节点的存储/磁盘。

【问题讨论】:

  • 您需要发布您的 kubernetes 配置以及您看到的任何错误,以获得有用的帮助。
  • 嗨,Paul,我没有收到错误,而是注意到 K8s 的行为不是很清楚。我创建了 PV 并在我的 POD 中引用它。但是,该 PV 在其他节点上不可见,所以我想知道由 K8s 创建 POD 的服务器是否关闭并且 POD 会在其他活动节点上创建,它可能无法查看旧数据。

标签: kubernetes sqldatasource kubernetes-pod


【解决方案1】:

我猜是因为我的 POD 正在服务器 4 上运行,PV 是在创建 POD 时在服务器 4 上创建的,并在其中引用 PVC(声明)。

这或多或少是正确的,您应该能够通过简单地删除 Pod 并重新创建它来验证这一点(因为您说您没有 ReplicaSet 为您执行此操作)。然后,PersistentVolume 将在 Pod 被调度到的节点上可见。

编辑:以上假设您使用的是外部存储提供商,例如 NFS 或 AWS EBS(请参阅 Kubernetes 的 possible storage providers)。对于HostPath,上述内容不适用,PV 将在一个节点上本地创建(并且不会挂载到另一个节点)。

没有理由将PersistentVolume 也安装到其他节点。想象一下有数百个节点,您是否想将 PersistentVolume 挂载到所有节点上,而您的 Pod 仅在一个节点上运行?

您还询问“共享”磁盘。在您链接的博客文章中创建的 PersistentVolume 使用的是 ReadWriteMany,因此您实际上可以启动多个 Pod 访问同一卷(假设您的存储也支持该卷)。但是您的软件(在您的情况下是数据库)需要支持多个进程访问相同的数据。

特别是在考虑数据库时,您还应该查看StatefulSets,因为这基本上允许您定义始终使用相同存储的 Pod,这对于数据库来说可能非常有趣。无论你在哪里should run or not run databases on Kubernetes 都是一个完全不同的话题......

【讨论】:

  • 感谢您的回复西蒙。我想知道如果我删除 POD 并关闭服务器 4,集群会发生什么行为。如果 K8s 在其他节点上创建 POD,例如服务器 2 或 3,我的 pod 将没有旧数据,因为数据写入 PV 是由 K8s 在服务器 4 上创建的。我不清楚的是 PV 与 K8s 集群的映射。我的理解是,PODS 可以在任何节点上来来去去,如果是这样的话,PV 如何对所有节点上的 POD 可见,因此应用程序不会丢失数据(例如,在我的情况下是没有副本的 SQL DB)。
  • 这是一个很好的问题,并且很大程度上取决于您用于 PV 的存储。有很多不同类型的 PV 可用:kubernetes.io/docs/concepts/storage/persistent-volumes/… 通常,存储独立于节点和 Pod,这意味着 PV 仍将包含所有数据,即使节点关闭。但是根据您的描述,我猜您正在使用“HostPath”?在这种情况下你是对的,Pod 只能在节点 4 上运行。要拥有一个可以在所有节点上使用的 PV,请使用不同类型的 PV。
  • 嗨,西蒙,你是对的。我在虚拟机中使用主机路径。我发布了用于创建 PV 的 yaml 文件,后来发现路径是在 Node-4 上创建的,因为 POD 是在 Node-4 上创建的。我认为在非外部 PV(示例主机)的情况下,它由 Master 决定并在当时可用节点上随机创建。就我而言,它是 node-4(而不是所有节点,例如 node-2、3 等)。
  • 感谢您的澄清。正如预期的那样,我在上面的答案中添加了有关 HostPath 的信息。在您的情况下,您可以调查如何使用外部存储提供商(例如 NFS、AWS EBS、...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2021-01-29
  • 2018-10-01
  • 2017-04-08
相关资源
最近更新 更多