StatefulSet 是 Kubernetes 中用于管理有状态应用步伐的工作负载资源对象。它提供了一种管理有状态服务的方式,确保每个 Pod 都有一个唯一的、持久的身份,并支持持久化存储。它在 Kubernetes v1.9 版本中成为 GA 版本。StatefulSet 设计用于管理和部署有状态服务,其管理的 Pod 拥有固定的名称(通常是 - 形式)和有序的启动和停止顺序。
在 StatefulSet 中,Pod 名称可以用作网络标识符,并且通常与 Headless Service 联合使用。Headless Service 没有 Cluster IP,直接袒露 Pod 的 IP 地址或 DNS 名称。解析 Headless Service 的名称时,会返回所有 Pod 的 IP 地址或 DNS 名称。
此外,StatefulSet 在 Headless Service 的根本上为每个 Pod 创建了一个 DNS 域名,这些域名通常形如 ...svc.cluster.local。
StatefulSet 支持持久化存储,它可以使用多种持久化存储范例,包罗本地存储、网络文件体系(NFS)等。
二、引入"有状态"需求
1、管理无状态服务的 Deployment 实现了什么
起首它支持界说一组 Pod 的盼望数量,Controller 会为我们维持 Pod 的数量在盼望的版本以及盼望的数量;
第二它支持配置 Pod 发布方式,配置完成后 Controller 会按照我们给出的策略来更新 Pod,同时在更新的过程中,也会包管不可用 Pod 数量在我们界说的范围内;
第三,如果我们在发布的过程中遇到问题,Deployment 也支持一键来回滚。
简朴来说,Deployment 认为:它管理的所有相同版本的 Pod 都是一模一样的副本。也就是说,在 Deployment Controller 看来,所有相同版本的 Pod,不管是里面部署的应用还是举动,都是完全相同的。
1.1、创建 Deployment
VolumeClaimTemplates:PVC 模板列表,如果在 spec 中界说了这个,PVC 会先于 Pod 模板 Template 进行创建。在 PVC 创建完成后,把创建出来的 PVC name 作为一个 volume 注入到根据 Template 创建出来的 Pod 中。
ServiceName:对应 Headless Service 的名字。当然如果有人不必要这个功能的时候,会给 Service 定一个不存在的 value,Controller 也不会去做校验,所以可以写一个 fake 的 ServiceName。但是这里推荐每一个 Service 都要配置一个 Headless Service,不管 StatefulSet 下面的 Pod 是否必要网络标识;