在 Kubernetes 中,Deployment、ReplicaSet 等控制器主要用于管理无状态服务(如 Web 应用),这类服务的 Pod 实例可随意替换,IP、名称不影响服务可用性。但对于 MySQL 主从、Redis 集群、ZooKeeper 等有状态服务,Pod 实例需保持固定标识、独立存储和有序启停,StatefulSet 正是为解决这类需求而设计的核心控制器。
一、StatefulSet 核心概念与原理
1.1 有状态服务 vs 无状态服务
StatefulSet 的本质是为 “有状态服务” 提供稳定的运行环境,需先明确两类服务的核心差异:
| 维度 | 无状态服务(如 Web、Nginx) | 有状态服务(如 MySQL 主从、Redis 集群) |
|---|---|---|
| Pod 标识 | 名称、IP 随机,可随意替换 | 名称、IP 需固定(如 mysql-0、mysql-1) |
| 存储需求 | 所有 Pod 共享同一存储卷(如 NFS 共享目录) | 每个 Pod 需独立存储卷(数据不互通) |
| 启停顺序 | 无要求,可并行创建 / 删除 | 需有序(如先启动主库 mysql-0,再启动从库 mysql-1) |
| 服务发现 | 通过 Service ClusterIP 访问,无需区分实例 | 需通过固定标识访问特定实例(如主库只能是 mysql-0) |
1.2 StatefulSet 的核心组成
StatefulSet并非独立工作,需依赖两个关键组件实现“状态稳定”,三者协同构成有状态服务的管理体系:
(1)Headless Service(无头服务)
Headless Service是StatefulSet的“网络标识核心”,与普通Service的最大区别区别是不分配ClusterIP。其核心作用是:
- 为 StatefulSet 管理的每个 Pod 生成固定且可解析的 DNS 记录,确保 Pod 重建后仍能通过原标识被访问;
- 提供 Pod 实例的 “服务发现” 能力:通过解析 Service DNS,可直接获取所有 Pod 的 IP 列表(普通 Service 仅返回自身 ClusterIP)。
DNS 记录格式(K8s 集群内全局唯一):
- Pod 级 DNS:
$(Pod 名称).$(Headless Service 名称).$(命名空间).svc.cluster.local例:StatefulSet 名称为mysql,副本数 2,Headless Service 名为mysql-svc,则 Pod DNS 为mysql-0.mysql-svc.default.svc.cluster.local、mysql-1.mysql-svc.default.svc.cluster.local; - Service 级 DNS:
$(Headless Service 名称).$(命名空间).svc.cluster.local解析此 DNS 会返回所有关联 Pod 的 IP 列表,而非 ClusterIP。
(2)VolumeClaimTemplates(存储卷申请模板)
有状态服务的每个 Pod 需独立存储(如 MySQL 主从不能共用数据目录),VolumeClaimTemplates 是 StatefulSet 的 “存储保障核心”,其作用是:
- 自动为每个 Pod 生成对应的 PersistentVolumeClaim(PVC),无需手动创建;
- 每个 PVC 会自动绑定符合条件的 PersistentVolume(PV),最终实现 “一个 Pod 对应一个独立存储卷”,数据永久独立。
绑定关系:StatefulSet 副本数为 N 时,会生成 N 个 PVC,命名格式为 $(模板名)-$(StatefulSet 名)-$(Pod 序号)(如 data-mysql-0、data-mysql-1),每个 PVC 绑定独立 PV。
(3)StatefulSet 控制器本身
StatefulSet 控制器负责协调 Pod 的全生命周期管理,核心能力包括:
- 有序创建 / 删除:创建时按
0→1→2顺序启动 Pod,删除时按2→1→0顺序停止(确保依赖关系,如从库需等主库就绪); - 固定 Pod 名称:Pod 名称格式固定为
$(StatefulSet 名)-$(Pod 序号)(如web-0、web-1),重建后名称不变(区别于 Deployment 的随机名称); - 状态恢复:Pod 因故障重建时,会自动挂载原 PVC(数据不丢失),并复用原 DNS 记录(网络标识不变)。
二、StatefulSet 资源清单编写技巧
StatefulSet 的资源清单需包含 “Headless Service 定义” 和 “StatefulSet 定义” 两部分,核心字段需严格匹配(如 Service 选择器与 Pod 标签一致)。
2.1 核心字段解析
通过 kubectl explain statefulset.spec 可查看关键字段,重点关注以下必填 / 核心配置:
| 字段 | 作用说明 |
|---|---|
spec.serviceName(必填) |
关联的 Headless Service 名称(必须与 Headless Service 的 metadata.name 一致) |
spec.selector(必填) |
标签选择器,需匹配 spec.template.metadata.labels(否则创建失败) |
spec |

最低0.47元/天 解锁文章
516

被折叠的 条评论
为什么被折叠?



