statefulset通过固定身份、稳定存储、有序操作保障有状态应用可靠性:每个pod拥有唯一dns名称和专属pvc,启停扩缩容严格按序执行,需配合headless service、storageclass及初始化逻辑使用。

StatefulSet 是 Kubernetes 中专为有状态应用设计的核心控制器,它通过固定身份、稳定存储、有序操作三大机制,让数据库、Redis、etcd 等应用在容器环境中保持生产级可靠性。
固定网络标识:每个 Pod 有唯一且可预测的 DNS 名称
StatefulSet 会为每个 Pod 分配固定序号(如 mysql-0、mysql-1),并配合 Headless Service(不分配 ClusterIP 的 Service)生成稳定 DNS 记录:
-
mysql-0.mysql.default.svc.cluster.local→ 解析到 Pod-0 的实际 IP -
mysql-1.mysql.default.svc.cluster.local→ 解析到 Pod-1 的实际 IP
即使 Pod 重建,名称和 DNS 不变,主从配置、集群发现逻辑无需修改。普通 Service 只能返回 ClusterIP,无法满足节点间直连需求。
独立持久化存储:每个 Pod 绑定专属 PVC
通过 volumeClaimTemplates 字段,StatefulSet 为每个 Pod 自动创建独立的 PersistentVolumeClaim:
- 模板中定义 storage、accessModes 等,Kubernetes 动态绑定 PV(或复用已有 PV)
- PVC 名称自动拼接为
www-mysql-0、www-mysql-1,与 Pod 一一对应 - Pod 删除后 PVC 默认保留,重建时仍挂载原数据卷,避免数据丢失
有序生命周期管理:启动、扩缩容、更新都按序执行
StatefulSet 强制保证顺序性,这是无状态控制器无法提供的关键能力:
- 创建时:
mysql-0启动成功后,才创建mysql-1;适用于主从初始化依赖 - 删除时:逆序删除(先删
mysql-1,再删mysql-0),保护主节点最后下线 - 扩容时:新增 Pod 编号递增(
mysql-2),且等待前一个就绪后再继续 - 滚动更新时:默认
OrderedReady策略,逐个替换,支持暂停/回滚
配套资源必须协同配置
单靠 StatefulSet YAML 不足以运行有状态应用,需配套声明:
-
Headless Service:必须设置
clusterIP: None,否则无法提供 Pod 级 DNS - StorageClass:确保 PVC 能动态供应 PV(如使用 NFS、Ceph 或云厂商 CSI 驱动)
- 初始化逻辑:通过 initContainer 或启动脚本处理首次集群引导(如 etcd 成员注册、MySQL 主从握手)











