在 Kubernetes 中 Deployment 和 StatefulSet 有什么区别?

Kubernetes 中的 Deployment 和 StatefulSet 是两种不同的控制器类型,用于管理有状态和无状态应用。它们的区别主要在于应用场景、Pod 管理方式以及数据持久性。

部署与运维 中等 k8s statefulset deployment

在 Kubernetes 中,Deployment 和 StatefulSet 是两种用于管理 Pod 的控制器控制器类型,但它们的用途和机制不同。以下是主要区别:

1. 应用场景不同

  • Deployment:专为无状态应用设计(如 Web 服务器或 API 服务)。Pod 是独立的、可随意替代的副本,如果 Pod 失败或被调度到其他节点,不会影响应用整体状态。
  • StatefulSet:针对有状态应用(如数据库或消息队列)。它强调 Pod 的唯一身份和稳定状态,每个 Pod 都需保持特定的网络标识符和持久化数据。

2. Pod 标识和命名方式

  • Deployment
    • Pod 名称通过随机散列生成(如:nginx-deployment-78945578-abcdefg),且重启后名称会改变。
    • Pod 无固定顺序标识符,支持快速弹性伸缩。
  • StatefulSet
    • Pod 名称固定并有序(如:db-mysql-0、db-mysql-1),名称保持稳定,避免因重启造成识别问题。
    • 网络标识符(DNS 主机名)持久不变。

3. 部署顺序与操作控制

  • Deployment
    • 扩展、删除或新增 Pod 可并行处理,无顺序约束,确保了操作效率。
    • 每个 Pod 管理独立。
  • StatefulSet
    • 操作必须保持顺序性:创建按序号递增(从 0 到 N),删除时递减(从 N 到 0)。
    • 避免状态应用中数据冲突问题,如数据库复制需 Master 先启动。

4. 持久化存储与稳定性

  • Deployment:不保证 Pod 数据持久性,即使配置 Persistent Volume Claims (PVC),重建后 Pod 可能改变位置导致数据卷绑定不可靠。
  • StatefulSet
    • 每 Pod 绑定自己的持久化存储卷(使用 PVC),Pod 重启后自动恢复同卷数据。
    • 确保数据状态的长期一致性。

5. 网络服务方式

  • Deployment:配合 LoadBalancer 或 ClusterIP Service 工作,提供负载均衡的 IP 访问。
    apiVersion: v1
    kind: Service
    metadata:
      name: web-service
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
      type: LoadBalancer
    
  • StatefulSet:依赖 Headless Service(无头服务,ClusterIP 设为 “None”),让每个 Pod 可用固定 DNS 格式(如: db-mysql-0.web-headless.ns.cluster)。
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        app: mysql
    

总之,Deployment 用于动态高可用无状态服务,而 StatefulSet 专注于复杂顺序控制和状态持久性应用场景。正确选择可确保大规模应用的健壮性和可恢复性。