前言
Deployment 中能够随便的敞开和启动一个 Pod,Pod 之间的关系是平等的。
当 Pod 之间有主从关系,以及每个 Pod 对应特定的存储卷中的内容时,无奈应用 Deployment 控制器来随便的操作 Pod。
咱们须要应用一个叫做 StatefulSet 的控制器来解决这种有状态利用 Pod。
更新历史
- 20200605 – 初稿 – 左程立
- 原文地址 – https://blog.zuolinux.com/2020/06/05/about-controller-statefulset.html
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 名称,格局为:<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