实验 使用Daemonset部署日志收集守护进程

一、DaemonSet简介

在Kubernetes(简称k8s)中,DaemonSet是一种控制器,用于确保集群中的每个(或部分)节点最多运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务,如日志收集、监控代理、网络插件等。

DaemonSet的核心机制是通过节点监听和Pod调度实现:

(1)节点监听:DaemonSet控制器持续监控集群中的节点状态,当新节点加入时,自动创建对应的Pod;当节点移除时,清理相关Pod。

(2)Pod调度:每个节点上仅运行一个Pod副本,且Pod的生命周期与节点绑定。

DaemonSet的调度逻辑包括:

(1)默认调度:所有符合条件的节点均会运行Pod。

(2)节点选择器(NodeSelector):通过标签匹配限制Pod仅在特定节点上运行。

(3)节点亲和性(NodeAffinity):支持更复杂的调度规则,如基于节点角色、硬件特性等。

(4)污点容忍(Taints and Tolerations):允许Pod在具有污点的节点上运行,例如在Master节点或专用GPU节点上部署。

DaemonSet的典型应用场景包括:

(1)日志收集:在每个节点上运行日志代理(如Fluentd、Filebeat),集中收集容器日志。

(2)监控代理:部署监控工具(如Prometheus Node Exporter、cAdvisor),采集节点和容器的性能指标。

(3)网络插件:运行CNI插件(如Calico、Flannel),管理容器网络。

(4)安全工具:部署安全扫描工具(如Clair、Trivy),定期检查镜像漏洞。

(5)存储插件:运行存储守护进程(如GlusterFS、Ceph),提供共享存储服务。

二、Elasticsearch Fluentd 简介

1、Elasticsearch简介 

Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎,主要用于实时分布式搜索、数据分析以及日志处理。它具有以下特点:

(1)分布式架构

支持水平扩展,能够轻松处理 PB 级数据。

数据自动分片和复制,确保高可用性和容错性。

(2)全文搜索与分析:

提供强大的全文搜索功能,支持复杂查询和聚合操作。

支持地理位置搜索、图形化搜索等高级功能。

(3)实时数据处理:

具备近实时搜索能力,数据写入后几乎立即可被搜索。

支持实时数据流处理和分析。

(4)生态系统:

是 ELK Stack(Elasticsearch、Logstash、Kibana)的核心组件,常用于日志管理和分析。

与 Beats、Logstash 等工具集成,实现数据采集、处理和可视化。

(5)应用场景:

日志和事件数据分析。

企业搜索应用。

安全信息和事件管理(SIEM)。

业务指标监控和实时分析。

2、Fluentd 简介

Fluentd 是一个开源的日志收集器,专注于统一日志管理和数据收集。它具有以下特点:

(1)插件化架构

提供丰富的输入(Input)、过滤(Filter)和输出(Output)插件,支持多种数据源和目标。

社区贡献了 500 多个插件,覆盖了常见的数据源和存储系统。

(2)统一日志格式:

使用 JSON 格式作为数据交换标准,便于日志的解析和处理。

支持结构化和非结构化数据的统一处理。

(3)高可靠性和性能:

支持内存和文件缓冲,防止数据丢失。

提供故障转移和容错机制,确保系统稳定性。

(4)轻量级和高效:

用 C 和 Ruby 编写,资源占用少,性能高。

每秒可处理数万条消息,适合大规模日志处理。

(5)应用场景:

日志聚合和管理。

数据流处理和转发。

实时日志分析和监控。

云服务中的日志管理。

3 总结

Elasticsearch 专注于分布式搜索和数据分析,适合需要实时搜索和复杂查询的场景。

Fluentd 专注于日志收集和管理,适合需要统一日志处理和转发的场景。

两者可以结合使用,例如:

Fluentd 收集日志并转发到 Elasticsearch。

另外,Kibana 可视化 Elasticsearch 中的日志数据,实现完整的日志管理和分析解决方案。

实验基础和前置条件

本实验中,master01、worker01和worker02主机,都以《实验四 初识Kubernetes对象》中“实验4.1 完成干净实验环境的准备”的快照为基础。

部署Daemonset

1、创建定义Daemonset的配置文件

如图4-1所示,在master01主机的/root/work/ex07目录中,创建定义Daemonset的配置文件fluentd-daemonset.yaml。

图4-1(a)

图4-1(b)

(1)tolerations配置

在 Kubernetes 中,DaemonSet 的 tolerations 配置允许你指定 Pod 可以容忍某些节点上的污点(Taints),从而使得这些 Pod 能够被调度到带有相应污点的节点上运行。在如图4-1的fluentd-daemonset.yaml配置中,通过设置 tolerations,允许 DaemonSet 的 Pod 在控制平面节点(即 Master 节点)上运行。

参数key:

node-role.kubernetes.io/control-plane 和 node-role.kubernetes.io/master 是 Kubernetes 默认的控制平面节点污点键。这些键用于标识控制平面节点(Master 节点)。

参数operator

Exists 表示只要存在该键的污点,无需匹配具体的值,即可容忍该污点。

参数effect

NoSchedule 表示如果节点存在该污点,普通 Pod 将不会被调度到该节点上。

通过设置 tolerations,DaemonSet 的 Pod 可以忽略这个限制,从而被调度到带有该污点的节点上。

(2)terminationGracePeriodSeconds配置

在如图4-1的fluentd-daemonset.yaml配置中,terminationGracePeriodSeconds: 30 是 Kubernetes 中 Pod 配置的一个字段,用于定义在 Pod 被终止时,Kubernetes 给容器留出的优雅关闭时间(以秒为单位)。优雅关闭,即允许容器在接收到终止信号后,有足够的时间执行清理操作,避免数据丢失或状态不一致。如果未指定 terminationGracePeriodSeconds,Kubernetes 会使用默认值(通常为 30 秒)。

如果在指定的优雅关闭时间内,容器未完成关闭,Kubernetes 会发送 SIGKILL 信号强制终止容器。通过合理设置 terminationGracePeriodSeconds,可以确保应用在关闭时能够优雅地处理未完成的操作,提高系统的稳定性和可靠性。

2、基于配置文件创建Daemonset

基于上述配置文件fluentd-daemonset.yaml创建Daemenset对象,具体命令如下所示。

kubectl apply -f ex07/fluentd-daemonset.yaml

具体运行结果,如图4-2所示。

图4-2

3、查看Daemonset所创建的Pod对象

执行以下命令,查看我们Daemonset所创建的Pod对象。

kubectl get pods --namespace=kube-system -l name=fluentd-elasticsearch -o wide

具体执行结果,如下图4-3所示。

图4-3

如果图4-3中,有pod状态一直处于ContainerCreating,那么建议重启master01,worker01和worker02。

4、进一步查看该DaemonSet对象的详细信息

执行以下命令,查看我们DaemonSet部署对象的详细信息。

kubectl describe daemonset fluentd-elasticsearch --namespace=kube-system

具体执行结果,如下图4-4所示。

图4-4

滚动更新Daemonset部署应用

1、检查Daemonset部署更新策略

执行以下命令,查看我们检查DaemonSet部署对象的更新策略。

kubectl get ds/fluentd-elasticsearch -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' -n kube-system

具体执行结果,如下图5-1示。

图5-1

滚动更新(RollingUpdate) 是 Kubernetes 中 DaemonSet 的默认更新策略

行为特点

逐步替换 Pod:当 DaemonSet 需要更新时,Kubernetes 会逐个替换节点上的旧 Pod。

零停机:新 Pod 启动后才会终止旧 Pod,确保服务不中断。

节点顺序:按节点名称的字母顺序(或自定义排序)更新 Pod。

并行度控制:可通过 maxUnavailable 或 maxSurge 调整同时更新的 Pod 数量(默认无限制,但受节点资源约束)。

2、更新Daemonset模版中的容器镜像

执行以下命令,查看我们更新Daemonset模版中的容器镜像。

kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system

具体执行结果,如下图5-2示。

图5-2

3、监视Daemonset的更新状态和进度

执行以下命令,监视Daemonset的更新状态和进度。

kubectl rollout status ds/fluentd-elasticsearch -n kube-system

具体执行结果,如下图5-3示。

图5-3

  • 回滚Daemonset部署应用更新

1、查看Daemonset部署应用的历史版本

执行以下命令,查看Daemonset部署应用的历史版本。

kubectl rollout history ds/fluentd-elasticsearch -n kube-system

具体执行结果,如下图6-1示。

图6-1

  1. 直接回滚到Daemonset部署应用的上一个版本

执行以下命令,回滚到Daemonset部署应用的上一个版本。

kubectl rollout undo ds/fluentd-elasticsearch -n kube-system daemonset.apps/fluentd-elasticsearch

具体执行结果,如下图6-2示。

图6-2

  1. 监测Daemonset部署应用的回滚进度

执行以下命令,监测Daemonset部署应用的回滚进度。

kubectl rollout status ds/fluentd-elasticsearch -n kube-system

具体执行结果,如下图6-3示。

图6-3

  • 删除Daemonset部署应用

执行以下命令,删除Daemonset部署应用,以清理实验环境。

kubectl delete ds fluentd-elasticsearch -n kube-system

具体执行结果,如下图7-1示。

图7-1

进一步执行以下命令,确认Daemonset的Pod已经被删除。

kubectl get pods  -n kube-system -l name=fluentd-elasticsearch -o wide

具体执行结果,如下图7-2示。

图7-2

本实验到此结束!

六、实验结果与说明

  1. DaemonSet:保证集群每个节点只跑一个 Pod
  2. tolerations:让 Pod 能跑在 Master 节点
  3. hostPath 卷:挂载主机日志目录,实现节点级日志收集

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐