Kubernetes 为什么是州政府?Can';无状态Pod是否使用持久卷?

Kubernetes 为什么是州政府?Can';无状态Pod是否使用持久卷?,kubernetes,kubernetes-statefulset,Kubernetes,Kubernetes Statefulset,我在努力理解。它们的使用与使用具有持久卷的“无状态”POD有何区别?也就是说,假设一个“正常”的Pod可以声称拥有持久性存储,那么我缺少什么明显的东西需要这种新构造(具有有序的启动/停止等)?是的,一个常规的Pod可以使用持久性卷。然而,有时你有多个豆荚,逻辑上形成一个“组”。例如,数据库副本、ZooKeeper主机、Kafka节点等。在所有这些情况下,都有一组服务器,它们一起工作并相互通信。他们的特殊之处在于团队中的每个人都有自己的身份。例如,对于一个数据库集群,一个是主集群,两个是跟随集群,

我在努力理解。它们的使用与使用具有持久卷的“无状态”POD有何区别?也就是说,假设一个“正常”的Pod可以声称拥有持久性存储,那么我缺少什么明显的东西需要这种新构造(具有有序的启动/停止等)?

是的,一个常规的Pod可以使用持久性卷。然而,有时你有多个豆荚,逻辑上形成一个“组”。例如,数据库副本、ZooKeeper主机、Kafka节点等。在所有这些情况下,都有一组服务器,它们一起工作并相互通信。他们的特殊之处在于团队中的每个人都有自己的身份。例如,对于一个数据库集群,一个是主集群,两个是跟随集群,每个跟随集群都与主集群通信,让主集群知道它已经同步了什么和没有同步什么。因此,跟随者知道“db-x-0”是主控者,而主控者知道“db-x-2”是跟随者,拥有到某一点的所有数据,但仍然需要超出该点的数据

在这种情况下,你需要一些你不容易从普通豆荚中获得的东西:

  • 一个可预测的名字:你想开始你的播客,告诉他们在哪里可以找到彼此,这样他们就可以组成一个集群,选举一个领导者,等等。但是你需要提前知道他们的名字才能做到这一点。普通的吊舱名称是随机的,所以你不能提前知道它们
  • 稳定的地址/DNS名称:您希望在步骤(1)中可用的任何名称保持不变。如果一个正常的pod在另一台主机上重新启动(你重新部署,它运行的主机死机,等等),它将获得一个新的名称和一个新的IP地址
  • 组中的个人与其持久卷之间的持久链接:如果运行数据库主机的主机死亡,它将被移动到新主机,但应连接到相同的持久卷,因为只有一个卷包含该“个人”的正确数据。因此,例如,如果您重新部署由3台数据库主机组成的组,您希望相同的个体(通过DNS名称和IP地址)获得相同的持久卷,以便主服务器仍然是主服务器,并且仍然具有相同的数据,replica1将获得其数据,等等
  • StatefulSet解决了这些问题,因为它们提供(引用自):

  • 稳定、唯一的网络标识符
  • 稳定、持久的存储
  • 有序、优雅的部署和扩展
  • 有序、优雅的删除和终止
  • 我并没有真正提到(3)和(4),但这对集群也有帮助,因为您可以告诉第一个部署的集群成为主集群,下一个集群找到第一个集群并将其视为主集群,等等


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

    这是一个非常明确的答案,它正好提供了我所需要的。干得好,谢谢!为了完整起见,稍微消化一下,Kubernetes服务不给我(你的)1和2吗?(我得到(你的)3是唯一的。)我不能用一个服务前置我所有(相关)的pod,并通过这样做获得可预测的名称和地址吗?你必须手动将persistentVolume从一个节点移动到另一个节点。StatefulSet也将负责将persistentVolume与pod一起移动。此外,您需要手动为每个pod创建一个服务,这意味着您无法使用部署,因此您需要手动创建每个pod。然后,扩展意味着手动创建更多的pod和服务。这是可以做到的(在他们添加Petset之前我经常这么做),但这很痛苦。@ChristianSchmitt确实可以跨多个Pod提供服务。我认为答案是,除了与您所描述的“任何旧成员”对话的服务之外,还需要为组中每个唯一的个人提供一个服务,这样您就可以单独处理主副本、第一个副本等。