在运行过程中会保存数据或状态的工作负载称为“有状态工作负载(statefulset)”。例如Mysql,它需要存储产生的新数据。

    无状态(Deployment)和有状态(StatefulSet)应用的区别

    1. 唯一标识和稳定性:

      Deployment 管理的 Pod 是无状态的,它们通常可以被创建、删除或替换,而不会影响整个系统的稳定性。

      Pod 在 Deployment 中通常没有稳定的网络标识符,它们只能通过 Deployment 进行管理。
      StatefulSet 管理的 Pod 具有唯一的标识符,通常通过一个索引值(例如 web-0, web-1)来表示。这使得每个 Pod 具有稳定的网络标识符,对于有状态的应用程序来说非常重要。

    2. 稳定的网络标识符:

      Deployment 创建的 Pod 通常使用随机生成的标识符,它们的 DNS 名称也可能会更改。这意味着在替换 Pod 时,新的 Pod 可能会获得不同的 IP 地址和 DNS 名称。

      StatefulSet 创建的 Pod 具有稳定的网络标识符,这意味着 Pod 的名称和 DNS 名称通常保持不变,即使 Pod 替换或重新调度。这对于需要稳定标识符的有状态应用程序非常重要,如数据库或消息队列。

    3. Pod 启动顺序:

      Deployment 管理的 Pod 通常可以同时启动,它们之间没有硬性的启动顺序要求。

      StatefulSet 中的 Pod 启动顺序是有序的,每个 Pod 都会等待前一个 Pod 启动并完成初始化之后才会启动。这确保了有状态应用程序的稳定性,因为它们可能有特定的初始化和启动顺序要求。

    4. 存储和持久性:

      Deployment 管理的 Pod 通常使用临时存储,数据一般存储在挂载的持久卷中。但是,对于有状态应用程序,这可能不足够。

      StatefulSet 提供了对持久卷(Persistent Volumes)和持久卷声明(Persistent Volume Claims)的良好支持,每个 Pod 都可以有自己的持久化存储。这对于需要数据持久性和可靠性的应用程序非常重要。

    作者:吴升斌  创建时间:2020-10-22 09:37
    最后编辑:吴升斌  更新时间:2025-05-28 18:59