DaemonSet是Kubernetes API对象的一种类型,它可以在集群中的所有节点上复制相同的Pod。
本文将深入介绍DaemonSet是什么,它的工作原理以及何时应该使用它们。我们还将提供一个简单的教程,展示如何在您自己的集群中部署一个DaemonSet。
什么是 Kubernetes DaemonSet?
图片
DaemonSet是 Kubernetes API 对象,允许在每个Node节点上将 Pod 作为守护进程运行。当加入集群的新节点会自动运行属于 DaemonSet 的 Pod,同样,当下线一个节点时,这个节点运行的DaemonSet 的 Pod也会被回收。DaemonSet 通常用于长期运行的后台服务,例如节点监控和日志收集代理等。
默认情况下,DaemonSet会在每个节点始终运行一个P od 实例。当然我们可以选择自定义 DaemonSet 的配置,可以让它只在指定的节点上调度 Pod。
由于 DaemonSet设计目标是可靠地在每个节点上运行一个Pod,因此它们具有默认的”tolerations”(容忍度),这使得它们可以在通常会阻止调度新Pod的情况下继续调度。例如,即使目标节点面临资源约束或不接受新的Pod,DaemonSet的Pod仍然会被调度。
Pod、ReplicaSets、Deployments、StatefulSets 和 DaemonSets 之间有什么区别?
Pod 是 Kubernetes 中的基本单元:它们表示在集群中运行的一个或多个容器的集合。
ReplicaSets 建立在这一基础之上,它提供了一种结构,可保证在给定时间内运行指定数量的 Pod 副本。Deployments实现了对 ReplicaSets 的声明式管理,是大多数无状态应用程序在 Kubernetes 中的部署方式,而 StatefulSets 则简化了需要持久数据存储的有状态工作负载的使用。
DaemonSets 与其他工作负载类型不同,因为它们有独特的调度行为。Pod、ReplicaSets 和 Deployments 会自动调度到可用的Node节点,直到运行了所需数量的副本。除非设置亲和性规则,否则我们无法知道哪个节点上运行了我们的Pod。而 DaemonSets 可确保每个节点都运行 Pod。
DaemonSet 应用场景?
运行节点监控代理
比如我们使用Prometheus 监控node节点资源,一般会部署一个node_exporter,来收集每个节点资源信息,这种就比较适合,DaemonSet 无需任何特殊配置即可实现以上需求。
收集节点日志
同样,收集节点级日志(如 Kubelet 和内核日志、运行的 pod的日志)也可以使用DaemonSet,比如监控系统 Loki,会在每个部署一个promtail进行日志收集,如下图
图片
图片
备份节点数据
备份是 DaemonSet 的另一个应用场景。使用 DaemonSet 可确保所有节点数据都进行备份,而无需在节点发生变化时扩展或重新配置备份服务。如果某些节点不需要备份,我们可以自定义 DaemonSet,以便只覆盖标记节点。
DaemonSet 示例
前面我们介绍了 DaemonSets 背后的原理,下面我们来运行的简单示例。
由于 DaemonSets 会在多个节点上部署Pod,因此我们需要有一个多节点 Kubernetes 集群。下面是我的一个集群,同学们可以自行搭建
图片
如何创建 DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:latest