Kubernetes 中的 DaemonSet 和 StatefulSet

阅读时长 6 分钟读完

什么是 DaemonSet

DaemonSet 是 Kubernetes 中一种控制器对象,可以确保一个 Pod 在某些或所有节点上运行。DaemonSet 能够在所有节点上自动创建 Pod 并保证 Pod 的数量与节点数量一致,而且在一个节点上只会运行一个 Pod 实例。当一个节点新增或删除时,DaemonSet 会自动地在这个增加或减少的节点上创建或者移除一个 Pod。

我们可以利用 DaemonSet 在集群节点上部署一些系统性或者监控性的服务,比如 fluent-bit,fluentd 这些日志采集工具或者 Prometheus 等度量指标监控工具。

什么是 StatefulSet

StatefulSet 是 Kubernetes 中一种控制器对象,与 Deployment 和 ReplicaSet 相似,但有两个绝对不同的特征:

  1. StatefulSet 维护了唯一的稳定的网络标识符和稳定的存储。

  2. StatefulSet 中的每个 Pod 在创建时被分配了一个持久化唯一的序号(例如,它们的主机名)。

以上这两个特征允许 StatefulSet 为应用程序分配固定的网络标识符和存储,以及允许有状态应用程序进行有序的滚动升级和有序的缩放。

DaemonSet 和 StatefulSet 的不同

两者之间的不同在于它们管理 Pod 的方式和 Pod 的稳定状态。DaemonSet 管理的 Pod 是无状态的,任何 Pod 实例之间的自我标识和标签都是相同的(都是对应某个 DaemonSet 中定义的 spec.selector.matchLabels)。对比而言,StatefulSet 管理的 Pod 是有状态的,每个 Pod 实例会被分配一个唯一的标识符,这个标识符通常是这样的形式: ${statefulset_name}-${ordinal},其中 ordinal 是有序的编号。

另一个显著的区别是,相比 DaemonSet 具有比较广泛的用处,StatefulSet 内置了许多与 volume、有状态应用的升级和缩放相关的特性,这使得它对于有状态的应用程序比较有用,例如数据存储数据库等应用程序。

示例代码

DaemonSet 示例

首先,我们将通过以下 yaml 文件创建一个 DaemonSet:

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

在这个 yaml 文件中,我们定义了一个 DaemonSet 对象,名字是 fluent-bit。我们将用 fluent-bit 数据采集工具部署在所有节点上,用于收集日志。这个 DaemonSet 对象中,我们指定了 fluent-bit 容器的名字和镜像地址,以及资源限制和请求。我们在这个容器中定义了两个 volume,分别是 /var/log 和 /var/lib/docker/containers,用于挂载宿主机的 log 文件以及 docker 容器内部日志。

StatefulSet 示例

我们可以通过以下 yaml 文件来创建一个基于 mysql 镜像的有状态应用程序:

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

在这个 yaml 文件中,我们定义了一个 StatefulSet 对象,名字是 mysql,他依赖于一个 Service 对象,用来配置集群内部负载均衡,同时定义了一个 mysql 容器,同时定义了一个 volumeClaimTemplates,用于将持久化的存储挂载到 Pod 上。

结论

DaemonSet 和 StatefulSet 是 Kubernetes 控制器对象的两种类型,它们都有各自不同的实现方式和目的。DaemonSet 用来部署一些具有广泛用途的服务,比如日志收集工具等,而 StatefulSet 则适用于具有状态的应用程序,例如数据库和队列管理器等。在实际应用中,我们应该根据需求选择合适的控制器对象来管理我们的应用程序。

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

纠错
反馈