在 Kubernetes 中,Deployment 用来管理无状态应用,而 StatefulSet 则是有状态服务的核心控制器。
数据库、消息队列、分布式存储……这些服务都依赖它来确保稳定、安全、身份持久的运行。
本文将深入解析 StatefulSet 的核心工作机制,并探讨如何基于它构建可靠的有状态服务架构。
为什么有状态服务不能用 Deployment?
无状态应用的特点:
- Pod 可随意扩缩
- 任意 Pod 都一样
- 谁处理请求都没关系
但有状态服务(例如 MySQL、Redis Cluster、Kafka、etcd)就完全不同:
- 每个节点都有 独立身份
- 节点之间有 主从/集群角色
- 数据必须存储在 稳定的持久化卷
- 节点的上线顺序可能影响集群状态
如果使用 Deployment:
- Pod 名称是随机的
- 删除/重建后身份会丢失
- PVC 与 Pod 不绑定
- 节点顺序无法保证
最终将导致集群混乱甚至数据损坏。
因此,Kubernetes 专门设计了 StatefulSet 来应对这一挑战。
StatefulSet 的三大核心能力
① 稳定的网络身份
StatefulSet 中每个 Pod 都有稳定且可预测的名称,遵循<statefulset-name>-<ordinal-index>的格式:
mydb-0
mydb-1
mydb-2
无论如何重启或调度,这个名称不会改变。
同时它还配套一个 Headless Service,为每个 Pod 提供唯一的 DNS 域名,例如:
mydb-0.mydb-headless.default.svc.cluster.local
这让集群内部能够准确、稳定地识别和访问每一个节点,这是构建数据库/中间件集群的基础。
② 稳定的存储绑定
StatefulSet 会为每个 Pod 创建并绑定独立的 PersistentVolumeClaim (PVC):
pvc-mydb-0
pvc-mydb-1
pvc-mydb-2
Pod 被删除后,其对应的 PVC 及数据会得以保留。当 Pod 重建时,会自动挂载回相同的 PVC,从而确保数据不会因 Pod 的重新调度而丢失。这是确保 MySQL、PostgreSQL 等数据库/中间件能稳定运行的关键。
③ 有顺序的创建、删除与滚动升级
StatefulSet 遵循严格的序列化操作:
- 创建:按序号升序执行(0 → 1 → 2)
- 删除:按序号降序执行(2 → 1 → 0)
- 滚动升级:从最高序号 Pod 开始,逐个向下进行
这种顺序控制对于有状态集群至关重要。例如,etcd 集群必须逐个升级以确保法定人数(quorum)的可用性;在 MySQL 主从架构中,通常也需要先升级从节点,再升级主节点,StatefulSet 的有序性为此提供了基础保障。
StatefulSet 的滚动升级:慎重且有序
StatefulSet 支持两种升级策略:
✓ RollingUpdate(默认策略)
虽然是滚动升级,但顺序是固定的:
- 从最大序号的 Pod 开始升级。
- 等待新 Pod 完全就绪(Readiness Probe 通过)且运行健康。
- 才继续升级下一个序号更小的 Pod。
如果某个 Pod 的就绪检查失败,升级过程会自动暂停,从而避免整个集群状态被破坏。
✓ OnDelete(手动触发策略)
这是一种更保守的“运维式”升级策略:
- StatefulSet 不会主动删除任何 Pod 以触发更新。
- 必须由运维人员手动删除某个 Pod,该 Pod 重建时才会使用新的镜像模板。
此策略适用于对稳定性要求极高、变更需要严格审批的生产级数据库/中间件集群(如核心业务数据库的主从架构)。
StatefulSet 在有状态架构中的典型设计模式
① 单节点数据库
适用场景:
- MySQL/PostgreSQL 单机版
- Redis 单点模式
特点:
- StatefulSet 主要提供稳定的网络身份和持久化存储。
- 无需处理复杂的多节点协调逻辑。
- 优势:架构简单,易于维护和排障。
② 主从(Primary-Replica)架构
常见于:
- MySQL 主从复制
- PostgreSQL 流复制
- Redis 主从集群
架构特点:
- 通常约定序号为 0 的 Pod (
app-0) 作为主节点(Primary)。
- 序号更高的 Pod 作为从节点(Replica)。
- StatefulSet 的升序创建和降序删除/升级规则,天然契合“先操作从节点,最后操作主节点”的最佳实践,减少了主节点切换的风险。
③ 多节点分布式集群
例如:
- Kafka
- RabbitMQ
- Etcd
- Elasticsearch
架构要求:
- 每个节点的唯一 ID(Identity)必须固定不变。
- 节点间的数据复制、一致性协议(如 Raft)高度依赖稳定的成员身份。
- 严格的顺序滚动升级是保障数据安全性和集群可用性的前提。
StatefulSet 在这类复杂的云原生/IaaS服务中价值最为凸显。
StatefulSet + Operator:终极有状态架构方案
近年来,生产级有状态服务越来越多地采用 StatefulSet + Operator 的协同模式。
- StatefulSet 提供基础设施:稳定的身份、稳定的存储、有序的生命周期管理。
- Operator 提供智能管理:负责主从选举、自动故障转移、备份恢复、配置更新、智能扩缩容等高级运维能力。
典型例子包括:MongoDB Operator、Kafka Operator、Vitess Operator 等。
简而言之,StatefulSet 是确保稳定性的“基石”,而 Operator 则是实现自动化与智能化的“大脑”,两者结合构成了现代运维/DevOps体系中管理有状态服务的黄金标准。
如何为你的有状态服务选择合适架构?
这里给出一个简单的决策参考:

小结:StatefulSet 是有状态服务的“稳定器”
StatefulSet 的核心价值在于为云原生/IaaS环境中的有状态负载提供了必不可少的稳定性保障:
- 稳定的网络身份:Pod 名称与 DNS 域名固定不变,是服务发现和集群组建的基础。
- 稳定的存储绑定:每个 Pod 拥有独立的持久化卷,数据生命周期与 Pod 解耦,避免丢失。
- 有顺序的生命周期管理:有序的创建、删除和升级,最大限度地保护集群状态的一致性。
- 与 Operator 模式协同:StatefulSet 负责“稳定”,Operator 负责“智能”,两者结合方能构建出既健壮又高效的有状态服务架构。