前言
Deployment 中能够随意的关闭和启动一个 Pod,Pod 之间的关系是平等的。html
当 Pod 之间有主从关系,以及每一个 Pod 对应特定的存储卷中的内容时,没法使用 Deployment 控制器来随意的操做 Pod。linux
咱们须要使用一个叫作 StatefulSet 的控制器来处理这种有状态应用 Pod。web
更新历史
StatefulSet 控制器工做原理
管理有状态应用 Pod 的秘诀是,提供稳定不变的 Pod 标识和稳定不变的存储。服务器
稳定不变的拓扑状态,即不变的主机名
- 该标识和 Pod 是绑定的,无论 Pod 被调度到哪一个节点上
- StatefulSet 中每一个 Pod 将被分配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是惟一的
- 每一个 Pod 根据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。组合主机名的格式为 $(StatefulSet 名称)-$(序号)
- StatefulSet 名称为 web,replicas 为 3,那么将会建立三个名称分别为 web-0、web-一、web-2 的 Pod。一旦每一个 Pod 建立成功,就会获得一个匹配的 DNS 名称,格式为:<pod-name>. <service-name>.<namespace>.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网络
