# StatefulSet 如何实现状态保持?
StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载对象。它通过以下机制实现状态保持:
---
## 1. **稳定的网络标识**
- **唯一且持久的 DNS 名称**
每个 Pod 会按 `{StatefulSet名称}-{序号}` 的格式命名(如 `web-0`, `web-1`),并与 Headless Service 结合生成稳定的 DNS 记录(如 `web-0.nginx.default.svc.cluster.local`)。
- **IP 地址可变化,但标识符不变**
即使 Pod 被重新调度到其他节点,其网络标识(DNS 名称)保持不变。
---
## 2. **持久化存储**
- **VolumeClaimTemplates**
通过定义 `volumeClaimTemplates` 自动为每个 Pod 创建独立的 PersistentVolumeClaim (PVC),从而保证 Pod 重建时能绑定到相同的存储卷(PV)。
yaml
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
---
## 3. **顺序部署与扩展**
- **按顺序启停 Pod**
创建/删除 Pod 时严格遵循 `0 → N-1` 的顺序,扩容时按升序创建新 Pod,缩容时按降序终止旧 Pod。
- **确保数据一致性**
适用于主从架构应用(如 MySQL 主从复制),需先启动主节点再启动从节点。
---
## 4. **数据持久性与一致性**
- **存储卷与 Pod 生命周期解耦**
Pod 删除后,PVC 和 PV 仍然保留,新 Pod 会绑定到原有存储。
- **支持特定存储后端**
如分布式存储系统(Ceph、GlusterFS)或云厂商的块存储(AWS EBS、GCP PD)。
---
## 5. **状态维护策略**
- **`podManagementPolicy`**
默认值为 `OrderedReady`(顺序部署),可设置为 `Parallel` 以允许并行启停 Pod(适用于无严格顺序要求的场景)。
- **`updateStrategy`**
支持 `RollingUpdate` 或 `OnDelete` 更新策略,控制 Pod 的滚动更新行为。
---
## 总结
StatefulSet 通过 **稳定网络标识**、**持久化存储** 和 **有序生命周期管理** 实现状态保持,适用于数据库(MySQL、MongoDB)、消息队列(Kafka)等有状态服务。