为什么有状态集?一个无状态的Pod不能使用持久卷吗?

Lai*_*son 53 kubernetes kubernetes-statefulset

我是Kubernetes的新手,可能会被推测,所以请原谅我,如果我对术语的使用不太正确的话.我希望我的问题的意图是明确的.

我试图围绕有状态集合.它们的使用与使用持久卷的"无状态"Pod有何不同?也就是说,假设一个"正常"的Pod可能声称持久存储,我错过了哪些显而易见的东西需要这个新的构造(有序的启动/停止等)?

Oli*_*ain 93

是的,常规pod可以使用持久卷.但是,有时您有多个逻辑上形成"组"的pod.这方面的例子是数据库副本,ZooKeeper主机,Kafka节点等.在所有这些情况下,有一堆服务器,它们一起工作并相互通信.他们的特别之处在于,团队中的每个人都有自己的身份.例如,对于数据库集群,一个是主数据库,两个是关注者,每个关注者与主服务器通信,让它知道它有什么并且没有同步.因此,关注者知道"db-x-0"是主人,主人知道"db-x-2"是一个追随者,并且所有数据都达到某一点,但仍然需要超出该数据的数据.

在这种情况下,您需要从常规pod中轻松获得的一些东西:

  1. 一个可预测的名称:你想要开始你的pod告诉他们在哪里找到对方,这样他们就可以组成一个集群,选出一个领导等等,但你需要事先知道他们的名字才能做到这一点.普通的pod名称是随机的,因此您无法提前知道它们.
  2. 稳定的地址/ DNS名称:您希望步骤(1)中可用的任何名称保持不变.如果正常的pod在另一台主机上重新启动(重新部署,运行它的主机等),它将获得一个新名称和一个新的IP地址.
  3. 组中的个人与其持久卷之间的持久链接:如果运行其中一个数据库主服务器的主机死机,它将被移动到新主机,但应连接到同一个持久卷,因为只有一个且只有1个卷包含该"个人"的正确数据.因此,例如,如果您重新部署3个数据库主机组,您希望同一个人(通过DNS名称和IP地址)获得相同的持久卷,以便主服务器仍然是主服务器并且仍具有相同的数据,replica1获取它数据等

StatefulSets解决了这些问题,因为它们提供了(引自https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/):

  1. 稳定,独特的网络标识符.
  2. 稳定,持久的存储.
  3. 有序,优雅的部署和扩展.
  4. 有序,优雅的删除和终止.

我没有真正谈论过(3)和(4),但是这也可以帮助群集,因为你可以告诉第一个部署成为主人,下一个找到第一个并将其视为主人等.

正如一些人所指出的那样,通过使用常规的pod和服务,你确实可以获得一些相同的好处,但它的工作要多得多.例如,如果您需要3个数据库实例,则可以手动创建3个部署和3个服务.请注意,您必须手动创建3个部署,因为您无法将服务指向部署中的单个窗格.然后,为了扩展,您需要手动创建另一个部署和另一个服务.这确实有效,并且在PetSet/PersistentSet出现之前有点常见.请注意,它缺少上面列出的一些好处(例如,持久性卷映射和固定启动顺序).

  • 这是一个非常明确的答案,它正是我所需要的.干得好,谢谢! (6认同)
  • 您必须手动将persistentVolume 从一个节点移动到另一个节点。StatefulSet 也将负责将 PersistentVolume 与 pod 一起移动。 (3认同)
  • 此外,您需要为每个pod手动创建一个服务,这意味着您无法使用部署,因此您需要手动创建每个pod.然后按比例放大意味着手动创建更多的pod和服务.它可以完成(我曾经在添加petset之前这样做),但这很痛苦. (2认同)
  • @ChristianSchmitt确实,你可以拥有一个服务范围多个pod.我认为答案是在集团中为每个独特个体提供1项服务,这样您就可以单独处理主服务器,第一个副本等,以及与您所描述的"任何旧成员"对话的服务. . (2认同)