statefulset是kubernetes专为有状态应用设计的控制器,核心解决固定身份、独立存储和有序启停问题;需配合headless service提供稳定dns标识,通过volumeclaimtemplates为每个pod自动创建专属pvc,且严格按序部署与终止。

StatefulSet 是 Kubernetes 专为有状态应用设计的控制器,它解决的核心问题是:固定身份、独立存储、有序启停。部署 MySQL、Redis、ZooKeeper、Elasticsearch 等应用时,不能像 Deployment 那样随意替换 Pod——IP 变了、名字乱了、数据丢了,服务就可能中断甚至数据错乱。用 StatefulSet,就是给每个 Pod 分配一个“终身工号”,并配套专属存储和稳定网络地址。
必须搭配 Headless Service
普通 Service 会做负载均衡,把请求随机转发到后端 Pod,这破坏了有状态节点间的可预测通信。StatefulSet 要求先创建一个 Headless Service(clusterIP: None),它不分配 ClusterIP,而是直接为每个 Pod 生成确定的 DNS 记录:
- Pod 名为 mysql-0、mysql-1,Service 名为 mysql,命名空间为 default
- 那么 mysql-0.mysql.default.svc.cluster.local 就永远解析到 mysql-0 的 IP,即使它被重建或调度到其他节点
- StatefulSet 的
serviceName字段必须指向这个 Headless Service,否则 Pod 不会获得稳定主机名
用 volumeClaimTemplates 绑定专属 PVC
有状态应用的数据不能共享,也不能随 Pod 消失而丢失。StatefulSet 通过 volumeClaimTemplates 字段自动为每个 Pod 创建独立的 PVC:
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 模板中定义的 PVC 名称(如
data)会自动拼接成data-mysql-0、data-mysql-1 - 每个 PVC 会绑定到一个 PV(需提前准备或由 StorageClass 动态供给),且生命周期独立于 Pod:删除 Pod 不删 PVC,扩缩容时自动复用原有 PVC
- 容器内通过
volumeMounts挂载该卷,路径如/var/lib/mysql,确保重启后读取的是同一份数据
按序创建、按序终止、不可跳过
StatefulSet 不允许“并发创建”或“跳号部署”。它严格遵循顺序逻辑:
- 创建时:先起 mysql-0,等它进入
Running且就绪探针成功,再起 mysql-1,依此类推 - 删除或缩容时:从最大序号开始删,即先删 mysql-1,再删 mysql-0(避免主节点意外先下线)
- 滚动更新时默认采用
OrderedReady策略,也是逐个替换,保障集群始终有可用节点
实际部署 MySQL 示例关键片段
一个最小可行的 MySQL StatefulSet 需包含三部分资源:Headless Service、StatefulSet 清单、StorageClass(可选但推荐):
- Headless Service 中设置
clusterIP: None和匹配标签(如app: mysql) - StatefulSet 中指定
serviceName: mysql,副本数replicas: 2,并在volumeClaimTemplates中声明storage: 5Gi、accessModes: [ReadWriteOnce] - 容器启动命令需适配 Pod 名(如用
hostname -s | cut -d'-' -f2获取序号),用于区分主从角色或集群成员配置










