Kubernetes 集合中的基本应用 —— 详解 Deployment 和 StatefulSet

阅读时长 7 分钟读完

Kubernetes 是现代容器编排系统的代表,由于其灵活且高度自动化的特性,越来越多的应用场景选择使用 Kubernetes 进行部署和管理。本文将深入探讨 Kubernetes 中两个主要的集合应用:Deployment 和 StatefulSet,探究它们的区别、使用场景以及部署实践。

Deployment

Deployment 提供了容器副本集的声明式更新,利用它您可以轻松地创建和更新副本集,并确保高可用性的容器组。Deployment 的控制器监视目标 Pod 变化,根据用户定义的副本数进行平滑地扩缩容或滚动升级,保证服务可靠性和连续性。

Deployment 的定义

下面是一个简单的 Deployment 模板:

-- -------------------- ---- -------
----------- -------
----- ----------
---------
  ----- ----------------
-----
  --------- -
  ---------
    ------------
      ---- -----
  ---------
    ---------
      -------
        ---- -----
    -----
      -----------
        - ----- ---------------
          ------ ------------
          ------
            - -------------- --

解释一下每个字段:

  • apiVersion
    • api 版本号,apps/v1 代表这个资源类型的 API 版本,Deployment 是 apps/v1 中的一种资源类型;
  • kind
    • 资源类型,本例中为 Deployment;
  • metadata
    • 元数据,包括资源名称;
  • spec
    • 控制器的规格,定义了副本数量、选择器以及如何运行 Pod;
  • replicas
    • 副本数量,即希望 Kubernetes 运行多少个相同的 Pod 副本;
  • selector
    • 选择器,是一个包含标签的映射,用于指定那些 Pod 属于这个 Deployment 控制器的管理范围;
  • template
    • Pod 模板,是 Kubernetes 管理的所有 Pod 的模板,在该模板中声明容器应该如何运行;
  • labels
    • 标签,是将该模板与控制器关联的标识符;
  • containers
    • 容器数组,描述 Pod 中要运行的容器。

Deployment 的使用场景

如果你想部署多个相同的 Pod 副本且需要在更新时保持高可用性的话,那么 Deployment 是最好的选择。Deployment 的控制器将在您更新版本时一步步按照新的 Pod 模板进行操作,而旧版的 Pod 模板会逐渐被更新的版本所取代。同时,Deployment 控制器会确保每个具体更新版本在任何时候都有恰好 $N$ 个副本,不多不少。

Deployment 的操作实践

使用 kubectl 命令创建 Deployment:

通过 kubectl 命令获取 Deployment 状态:

通过 kubectl 命令升级 Deployment:

通过 kubectl 命令回滚 Deployment:

StatefulSet

StatefulSet 是 Kubernetes 中一种用于管理有状态应用的控制器。对于有状态应用(Stateful Application)而言,它需要满足以下几个要求:

  • 稳定的持久化存储;
  • 稳定的网络标识(如 DNS);
  • 稳定的 Pod 稳定性。

在 Kubernetes 环境中,这些要求可以通过使用 StatefulSet 来保证有状态应用进行管理。

StatefulSet 的定义

下面是一个简单的 StatefulSet 模板:

-- -------------------- ---- -------
----------- -------
----- -----------
---------
  ----- ---------
-----
  --------- -
  ------------ ---------
  ---------
    ------------
      ---- -----
  ---------
    ---------
      -------
        ---- -----
    -----
      -----------
        - ----- ---------------
          ------ ------------
          -------------
            - ----- ----------
              ---------- -----------------
  ---------------------
    - ---------
        ----- ----------
      -----
        ------------ -----------------
        ----------
          ---------
            -------- ----

解释一下每个字段:

  • apiVersion
    • api 版本号,apps/v1 代表这个资源类型的 API 版本,StatefulSet 是 apps/v1 中的一种资源类型;
  • kind
    • 资源类型,本例中为 StatefulSet;
  • metadata
    • 元数据,包括资源名称;
  • spec
    • 控制器的规格,定义了副本数量、服务名称、选择器以及如何运行 Pod;
  • replicas
    • 副本数量,即希望 Kubernetes 运行多少个相同的 Pod 副本;
  • serviceName
    • 服务名称,这里与 Service 设置的名称相同,保证了容器名字解析的一致性;
  • selector
    • 选择器,是一个包含标签的映射,用于指定那些 Pod 属于这个 StatefulSet 控制器的管理范围;
  • template
    • Pod 模板,是 Kubernetes 管理的所有 Pod 的模板,在该模板中声明容器应该如何运行;
  • labels
    • 标签,是将该模板与控制器关联的标识符;
  • containers
    • 容器数组,描述 Pod 中要运行的容器;
  • volumeMounts
    • 定义了挂载的配置;
  • volumeClaimTemplates
    • 定义了 StatefulSet 所管控的 PV/PVC 模板。

StatefulSet 的使用场景

如果你需要管理具有识别性的有状态应用,例如数据库 Pod、消息队列 Pod 等,那么 StatefulSet 是最好的选择。StatefulSet 在执行升级操作时,会遵循部分有状态应用的特殊要求,如确定副本在升级期间的标识符,并将其应用于新 Pod。并且,StatefulSet 能够使用有状态服务(Stateful Service)来管理服务资源,这使得您更轻松地维护稳定的 DNS 名称和 IP 地址。

StatefulSet 的操作实践

使用 kubectl 命令创建 StatefulSet:

通过 kubectl 命令获取 StatefulSet 状态:

通过 kubectl 命令升级 StatefulSet:

通过 kubectl 命令回滚 StatefulSet:

总结

Deployment 和 StatefulSet 是 Kubernetes 集合中的两种基本应用,Deployments 是通用的集合工具,主要用于无状态应用,而 StatefulSet 则用于有状态应用。Deployments 和 StatefulSet 都提供了控制器和模板能力,允许您轻松地管理一组相同的 Pod 副本, 满足您在Kubernetes环境下的服务高可用和稳定性的需求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fee6d195b1f8cacdd93616

纠错
反馈