# Deployment VS StatefulSet

在K8s中,DeploymentStatefulSet是两种常用的控制器(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,确保数据的持久化和隔离。
  • 支持动态创建和绑定存储卷。