
K8s中Deployment、StatefulSet、DaemonSet介绍与异同

💡简介
在Kubernetes中,Deployment、StatefulSet和DaemonSet是三种常见的工作负载类型,它们用于管理Pod的部署和生命周期。本文将介绍这三种工作负载的基本概念、特点、适用场景,并对它们的异同进行详细分析。
🖼️背景
在容器编排中,如何高效地管理和调度Pod是一个核心问题。Kubernetes提供了多种工作负载类型来满足不同的需求,其中Deployment、StatefulSet和DaemonSet是最常用的三种类型。理解它们的特点和适用场景对于设计和优化Kubernetes集群至关重要。
🧠思路
- 介绍Deployment、StatefulSet和DaemonSet的基本概念。
- 探讨每种工作负载的特点和适用场景。
- 比较它们之间的异同。
- 总结如何根据实际需求选择合适的工作负载类型。
🔨解决
总结而言,DaemonSet是一类,Deployment和StatefulSet是一类。
- DaemonSet不关心Pod副本数量,只关心Pod在每个节点上的运行情况。[5]专用于部署守护进程,与节点绑定,确保每个节点上都有对应的守护进程副本运行。对于需要在一批节点上运行且无需用户干预的持续性后台任务非常有用。应用场景:
- 集群存储守护程序,如 glusterd 、 ceph 要部署在每个节点上以提供持久性存储;
- 节点监视守护进程,如 Prometheus 监控集群,可以在每个节点上运行一个 node-exporter 进程来收集监控节点的信息;
- 日志收集守护程序,如 fluentd 或 logstash ,在每个节点上运行以收集容器的日志
- Deployment和StatefulSet分别专用于部署 ==无状态服务== 和 ==有状态服务== 。所谓的“有状态”,主要是针对Pod发生re-schedule后仍然要保持之前的状态(网络标识/持久化存储),根据官方建议是满足以下任一需求:[5]
- 稳定的、唯一的网络标识。
- 稳定的、持久的存储。
- 有序的、优雅的部署和伸缩。
- 有序的、优雅的删除和停止。
- 有序的、自动的滚动更新。
Deployment
概念
Deployment 是 Kubernetes 中最常用的工作负载类型,用于管理无状态应用的部署和生命周期。它通过声明式的方式定义Pod的副本数、更新策略等。
特点
- 无状态:适用于无状态应用,例如Web服务。
- 滚动更新:支持零停机时间的滚动更新和回滚。
- 副本管理:可以轻松扩展或缩减Pod的副本数。
适用场景
- Web服务、API服务等无状态应用。
- 需要频繁更新的应用。
StatefulSet
概念
StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载类型。它确保Pod的部署顺序、网络标识和存储是稳定的。
特点
- 有状态:每个Pod都有唯一的标识(如
pod-0
、pod-1
)。 - 稳定的网络标识:每个Pod都有固定的DNS名称。
- 持久化存储:支持为每个Pod分配独立的持久化存储卷。
适用场景
- 数据库(如MySQL、PostgreSQL)。
- 分布式系统(如ZooKeeper、Kafka)。
DaemonSet
概念
DaemonSet 是 Kubernetes 中用于确保每个节点上运行一个Pod的工作负载类型。它通常用于运行集群范围的后台任务。
特点
- 每节点一个Pod:确保每个节点上都有一个Pod运行。
- 自动适配新节点:当新节点加入集群时,DaemonSet会自动在新节点上创建Pod。
- 适用于后台任务:如日志收集、监控代理等。
适用场景
- 日志收集(如Fluentd)。
- 监控代理(如Prometheus Node Exporter)。
- 网络插件(如Calico、Flannel)。
Deployment、StatefulSet和DaemonSet的异同
特性 | Deployment | StatefulSet | DaemonSet |
---|---|---|---|
状态管理 | 无状态 | 有状态 | 无状态 |
Pod标识 | 不固定 | 固定 | 不固定 |
存储 | 不支持持久化存储 | 支持持久化存储 | 不支持持久化存储 |
适用场景 | Web服务、API服务 | 数据库、分布式系统 | 日志收集、监控代理 |
Pod分布 | 根据副本数分布 | 根据副本数分布 | 每节点一个Pod |
更新方式 | 滚动更新 | 滚动更新 | 手动更新 |
🏥反思
通过对Deployment、StatefulSet和DaemonSet的学习,我对Kubernetes中不同工作负载的特点和适用场景有了更深入的理解。在实际项目中,选择合适的工作负载类型可以显著提高系统的可靠性和可维护性。例如,对于无状态的Web服务,可以选择Deployment;对于需要持久化存储的数据库,可以选择StatefulSet;而对于需要在每个节点上运行的后台任务,则可以选择DaemonSet。
在未来的工作中,我会尝试给出三种方案的具体代码案例[4],最好能够找到合适的场景将其作为实际应用(也许找些面经会是不错的方向)。也会考虑继续了解其他组件,如Replication Controller(RC)和ReplicaSet(RS)[6]。
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
[2] Deployment vs StatefulSet vs DaemonSet
[4] k8s 说一下deployment,statefulset,daemonset 的区别
- 标题: K8s中Deployment、StatefulSet、DaemonSet介绍与异同
- 作者: Fre5h1nd
- 创建于 : 2025-03-28 16:29:46
- 更新于 : 2025-03-28 17:02:15
- 链接: https://freshwlnd.github.io/2025/03/28/k8s-Deployment-StatefulSet-DaemonSet/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。