# Deployment VS StatefulSet
在K8s中,Deployment
和StatefulSet
是两种常用的控制器(Controller),用于管理Pod的生命周期和部署方式。尽管它们的目标都是运行和管理一组Pod,但两者的使用场景和特性存在着显著的差异。一下是他们主要的区别和使用场景分析。
# 核心概念
# Deployment:
- 主要用于管理无状态应用
- 提供声明式的更新机制,支持回滚更新和回滚等操作。
- 每个pod是完全对等的,没有固定的标识。
# StatefulSet:
- 主要用于管理有状态应用
- 确保每个pod都有一个唯一的标识(通过稳定的网络ID和持计划存储)
- 支持有序部署、扩展和删除
# 使用场景
# Deployment:
- 适用于无状态的服务,例如web、api网关等。
- 不需要为每个实例分配独立的存储和身份标识。
- 示例:nginx、Spring Boot应用等。
# StatefulSet:
- 适用于有状态服务,例如数据库、分部署存储系统等。
- 需要为每个实例配置独立的存储,并确保pod的唯一性和顺序性。
- 示例:mysql、es等。
# Pod的标识和稳定性:
# Deployment:
- pod是动态生成的,每次重新调度后可能会获取到衣蛾新的名称和ip地址
- 不保证pod身份的稳定性,pod的网络地址和存储都是临时的。
# StatefulSet:
- 每个pod都有一个稳定的、基于索引的名称(如:myapp-0、myapp-1)
- 每个pod的网络标识和持计划存储是稳定的,即使pod被重新调度了,其名称、主机名和存储卷任然保持不变。
# 存储管理
# Deployment:
- 通常使用共享存储(如:nas、云存储)或者不使用永久存储。
- pod之间没有独立的存储需求。
# StatefulSet:
- 每个pod都会绑定一个独立的PV,确保数据的持久化和隔离。
- 支持动态创建和绑定存储卷。