K8S实战(五)| 控制器 StatefulSet 的原理

K8S实战(五)| 控制器 StatefulSet 的原理

前言

Deployment 中可以随意的关闭和启动一个 Pod,Pod 之间的关系是平等的。

当 Pod 之间有主从关系,以及每个 Pod 对应特定的存储卷中的内容时,无法使用 Deployment 控制器来随意的操作 Pod。

我们需要使用一个叫做 StatefulSet 的控制器来处理这种有状态应用 Pod。

更新历史

StatefulSet 控制器工作原理

管理有状态应用 Pod 的秘诀是,提供稳定不变的 Pod 标识和稳定不变的存储。

稳定不变的拓扑状态,即不变的主机名

  • 该标识和 Pod 是绑定的,不管 Pod 被调度到哪个节点上

  • StatefulSet 中每个 Pod 将被分配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是唯一的

  • 每个 Pod 根据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。组合主机名的格式为 $(StatefulSet 名称)-$(序号)

  • StatefulSet 名称为 web,replicas 为 3,那么将会创建三个名称分别为 web-0、web-1、web-2 的 Pod。一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 名称,格式为:..svc.cluster.local,其中 service-name 由 StatefulSet 的 serviceName 域来设定

  • 并且这些 Pod 的创建,是严格按照编号顺序进行的。比如,在 web-0 进入到 Running 状态、并且 Conditions 成为 Ready 之前,web-1 会一直处于 Pending 状态

  • 当我们把这几个 Pod 删除之后,Kubernetes 会按照原先编号的顺序,创建出新的 Pod。并且,Kubernetes 依然为它们分配了与原来相同的“网络身份”

  • 通过这种严格的对应规则,StatefulSet 就保证了 Pod 网络标识的稳定性

稳定不变的存储

  • 每个 Pod 都会绑定一个固定编号的 PVC,这些 PVC 的名字都是 <PVC名>-<Pod名>

  • 名叫 web-0 的 Pod,会声明使用名叫 www-web-0 的 PVC

  • PV/PVC 通过动态卷的方式存储于远程存储服务器

  • 当一个 Pod 被删除后,对应的 PVC 和 PV 并不会被删除,数据依然存在于远程服务器,Pod 被重建后,StatefulSet 会重新查找对应名称的 PVC 来进行绑定

结束语

StatefulSet 扩展了 Deployment,对 Pod 和对应的存储卷都进行了固定名称和编号,不管 Pod 如何处理,这些对应关系都不会有变化,从而将业务逻辑关系以及存储关系固定了下来,确保了有状态应用正常运行。

联系我

微信公众号:zuolinux_com

K8S实战(五)| 控制器 StatefulSet 的原理