kubernetes - 为什么使用 StatefulSet?无状态 Pod 不能使用持久卷吗?

标签 kubernetes kubernetes-statefulset

我试图理解Stateful Sets 。它们的使用与使用具有持久卷的“无状态”Pod 有什么不同?也就是说,假设一个“普通”Pod 可能声称拥有持久存储,那么我缺少什么明显的东西需要这个新的构造(具有有序的启动/停止等)?

最佳答案

是的,常规 Pod 可以使用持久卷。但是,有时您有多个 pod,它们在逻辑上形成一个“组”。例如数据库副本、ZooKeeper 主机、Kafka 节点等。在所有这些情况下,都有一堆服务器,它们一起工作并相互通信。他们的特别之处在于,团体中的每个人都有自己的身份。例如,对于数据库集群,一个是主服务器,两个是从服务器,每个从服务器都与主服务器通信,让它知道它已经同步和尚未同步的内容。因此,follower 知道“db-x-0”是 master,master 知道“db-x-2”是 follower,并且拥有某个点之前的所有数据,但仍需要超出该点的数据。

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

  1. 可预测的名称:您希望在启动 Pod 时告诉它们在哪里可以找到彼此,以便它们可以形成集群、选举领导者等。但您需要提前知道它们的名称才能做到这一点。普通的 Pod 名称是随机的,因此您无法提前知道它们。
  2. 稳定的地址/DNS 名称:您希望步骤 (1) 中可用的任何名称保持不变。如果一个普通的 Pod 在另一台主机上重新启动(您重新部署、运行它的主机死亡等),它将获得一个新名称和一个新 IP 地址。
  3. 组中个体与其持久卷之间的持久链接:如果运行其中一个数据库主服务器的主机出现故障,它将移至新主机,但应连接到相同持久卷,因为只有一个卷包含该“个人”的正确数据。因此,举例来说,如果您重新部署 3 个数据库主机组,您希望同一个人(通过 DNS 名称和 IP 地址)获得相同的持久卷,以便主服务器仍然是主服务器并且仍然具有相同的数据,replica1 得到它的数据等

StatefulSet 解决了这些问题,因为它们提供了(引用自 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ ):

  1. 稳定、唯一的网络标识符。
  2. 稳定、持久的存储。
  3. 有序、优雅的部署和扩展。
  4. 有序、优雅地删除和终止。

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

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

关于kubernetes - 为什么使用 StatefulSet?无状态 Pod 不能使用持久卷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732819/

相关文章:

amazon-web-services - 为特定路径设置 Ingress-Nginx 速率限制 rps

kubernetes - Minikube速度慢且无响应

kubernetes - 如何在将 API 服务器部署为系统服务的 k8s 上启用准入 Controller 插件?

kubernetes - 在 kubernetes/docker swarm 中部署 mariadb galera 集群

docker - 将持久卷声明添加到容器中的现有文件

Kubernetes StatefulSet - 在配置的其他地方获取 spec.replicas 元数据和引用

kubernetes - Kubernetes将变量固定在pod上

docker - Kubernetes pod 未将卷绑定(bind)到容器

kubernetes - 如何保证每个kubernetes节点运行2个或更多Pod?

kubernetes - 即使有可用资源,也无法安排广告连播