什么是 DaemonSet
DaemonSet 是 Kubernetes 中一种控制器对象,可以确保一个 Pod 在某些或所有节点上运行。DaemonSet 能够在所有节点上自动创建 Pod 并保证 Pod 的数量与节点数量一致,而且在一个节点上只会运行一个 Pod 实例。当一个节点新增或删除时,DaemonSet 会自动地在这个增加或减少的节点上创建或者移除一个 Pod。
我们可以利用 DaemonSet 在集群节点上部署一些系统性或者监控性的服务,比如 fluent-bit,fluentd 这些日志采集工具或者 Prometheus 等度量指标监控工具。
什么是 StatefulSet
StatefulSet 是 Kubernetes 中一种控制器对象,与 Deployment 和 ReplicaSet 相似,但有两个绝对不同的特征:
StatefulSet 维护了唯一的稳定的网络标识符和稳定的存储。
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