在 Kubernetes (K8s) 中,StatefulSet 是一种用于管理有状态应用的工作负载 API 对象。与 Deployment 管理无状态应用不同,StatefulSet 为每个 Pod 副本提供了持久性标识符(如名称和网络标识),并且可以保证部署和扩展顺序、以及网络标识和存储的稳定性。
核心特性
- 稳定、唯一的网络标识符:StatefulSet 中的每个 Pod 都有一个固定的、按顺序的名称(如
<statefulset-name>-0
),即使它们被重新调度到其他节点。 - 稳定的存储:StatefulSet 可以将持久化存储卷 (Persistent Volume) 与 Pod 的标识符关联起来,即使 Pod 被重新调度,它们的存储卷也不会丢失。
- 有序的部署、扩展和删除:StatefulSet 保证了 Pod 的部署、扩展和删除是按照严格的顺序进行的,通常是从 0 到 N-1,对于某些应用,这种顺序非常重要。
- 有序的滚动更新:StatefulSet 允许你对其管理的 Pod 进行顺序更新,确保不会同时中断多个副本。
使用场景
StatefulSet 适用于需要一个或多个以下特性的应用:
- 稳定且唯一的网络标识。
- 稳定的持久存储。
- 有序的、优雅的部署和扩展。
- 有序的、自动的滚动更新。
常见的用例包括:
- 分布式数据库,如 MongoDB、Cassandra 和 Elast