K8S精进之路-控制器DaemonSet -(3)

embedded/2024/12/21 21:07:42/

介绍

  DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用,每个节点就只有一个。比如最常用的网络组件,存储插件,日志插件,监控插件就是这种类型的pod.如果集群中有新的节点加入,DaemonSet也会在新的节点创建出来。
  DaemonSet如何保证每个节点,只有一个Pod副本运行呢?DaemonSet首先从Etcd获取所有Node的列表,然后它会去检查所有的Node,如果这个节点上没有所要运行的DaemonSet,就会启动一个出来。如果这个节点有1个以上的DaemonSet,那就会删除那个多余的DaemonSet。如果刚好只有一个运行,那这个节点就是正常的运行的。

DaemonSet例子


  现在我们通过一个日志收集的例子来学习DaemonSet.根据上一篇的介绍,我们继续把那个nginx稍微修改一下,让它的日志目录映射出来。可以看出来和上一章的没太大区别,只是我们把nginx的日志目录映射到了宿主机的/tmp/log 目录。
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.22.1ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/html- name: varlogmountPath: /var/log/nginxvolumes:- name: varloghostPath:path: /tmp/log        volumeClaimTemplates:- metadata:name: wwwspec:storageClassName: rook-ceph-blockaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi

这样我们在宿主机的/tmp/log 目录,看到nginx产生的日志。
在这里插入图片描述
现在我们生成一个日志收集的DaemonSet。收集的日志保存在redis中。先看yaml文件。所有涉及的容器镜像可以在这里下载 提取码: 6bqe

1.ConfigMap

由于我们用的FileBeat的来采集日志,这个名为filebeat-config的ConfigMap会在/etc/filebeat/目录生成一个filebeat.yml的配置文件,这个配置文件就是filebeat的配置文件。这个配置文件指定会在/var/log/nginx/目录下的所有log文件的内容,会推送到Redis中。

2.Redis

这里配置的Redis配置的是一个StatefulSet pod,并且还给它配置了一个headless service用户固定它的网络标识。

3. FileBeat DaemonSet

最下面的Yaml配置就是filebeat的配置,它会把上面nginx映射出来的宿主日志目录/tmp/log作为Volume又挂接到DaemonSet的 /var/log/nginx/目录,同时它也把Redis的网络标识redis-0.rediservice.default.svc.cluster.local放入配置中。这样整个DaemonSet就能把日志推送到redis中。

apiVersion: v1
kind: ConfigMap
metadata:name: filebeat-confignamespace: default
data:filebeat.yml: |-filebeat.registry_file: /var/log/containers/filebeat_registryfilebeat.idle_timeout: 5sfilebeat.spool_size: 2048logging.level: infofilebeat.prospectors:- input_type: logpaths:- "/var/log/nginx/*.log"symlinks: truejson.message_key: logjson.keys_under_root: truejson.add_error_key: truemultiline.pattern: '^\s'multiline.match: afterdocument_type: kube-logstail_files: truefields_under_root: trueoutput.redis:hosts: ${REDIS_HOST:?No Redis host configured. Use env var REDIS_HOST to set host.}key: "filebeat"
---
apiVersion: v1
kind: Service
metadata:name: rediservicelabels:app: redis
spec:ports:- port: 6379name: redisclusterIP: Noneselector:app: redis
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redisnamespace: default
spec:serviceName: "rediservice"replicas: 1selector:matchLabels:app: redisrole: logstortemplate:metadata:labels:app: redisrole: logstorspec:containers:- name: redisimage: redis:4.0-alpineports:- name: rediscontainerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: filebeat-dsnamespace: default
spec:selector:matchLabels:app: filebeatrelease: stabletemplate:metadata:labels: app: filebeatrelease: stablespec:containers:- name: filebeatimage: ikubernetes/filebeat:5.6.5-alpinevolumeMounts:- name: filebeat-configmountPath: /etc/filebeat- name: nginx-logsmountPath: /var/log/nginx/env:- name: REDIS_HOSTvalue: redis-0.rediservice.default.svc.cluster.local- name: REDIS_LOG_LEVELvalue: debug     volumes:- name: filebeat-configconfigMap:name: filebeat-config- name: nginx-logshostPath:path: /tmp/log

把上面的yaml通过kubectl apply -f 的形式运行到K8s.运行完成后,会生成下面的pod。可以看到每个node节点只有一个filebeat运行。
在这里插入图片描述
接下来我们通过,curl命令生成一些nginx日志。我们直接对web-1的nginx产生日志。

for i in {1..4096} ; do curl 10.244.2.24 ; done

执行完成后,我们进入redis,看日志是否有生成。

kubectl exec -it redis-0 /usr/local/bin/redis-cli

进入redis我们通过keys *的命令看到产生了一个filebeat的键值,里面保存的就是日志,但是里面的日志是list类型的。我们通过lrange filebeat 1 2可以查看到刚才产生的日志信息。
在这里插入图片描述

在这里插入图片描述
其实DaemonSet和Deployment一样都是可以版本管理的。通过下面的命令我们可以看到filebeat-ds的历史版本,现在的版本只有1个。

kubectl rollout history daemonset filebeat-ds

在这里插入图片描述
现在我们把filebeat的版本升级一下,升级到filebeat:5.6.6-alpine。filebeatupdateimage.yaml 升级的yaml文件如下

apiVersion: apps/v1
kind: DaemonSet
metadata:name: filebeat-dsnamespace: default
spec:selector:matchLabels:app: filebeatrelease: stabletemplate:metadata:labels: app: filebeatrelease: stablespec:containers:- name: filebeatimage: ikubernetes/filebeat:5.6.6-alpinevolumeMounts:- name: filebeat-configmountPath: /etc/filebeat- name: nginx-logsmountPath: /var/log/nginx/env:- name: REDIS_HOSTvalue: redis-0.rediservice.default.svc.cluster.local- name: REDIS_LOG_LEVELvalue: debug     volumes:- name: filebeat-configconfigMap:name: filebeat-config- name: nginx-logshostPath:path: /tmp/log

升级版本,可以看到filebeat的pod id都发生了变化。并且历史版本多出一个版本。

kubectl apply -f filebeatupdateimage.yaml 

在这里插入图片描述
在这里插入图片描述
如果我们要回到1号版本,我们可以运行如下命令,同时看到pod又重新新建了。

kubectl rollout undo daemonset filebeat-ds --to-revision=1

在这里插入图片描述
那这些版本是如何被维护以及记录的呢?是通过一个叫ControllerRevision API对象,我们可以通过这个查看版本是怎么保存的。通过下面的命令我们可以看到filebeat-ds有一个2,3的版本,原来的1没看见了,那是因为我们回滚到了1版本。但是回滚到的1版本是现在的新版本3,所以才会有2,3.
在这里插入图片描述


http://www.ppmy.cn/embedded/121075.html

相关文章

滚雪球学MySQL[8.2讲]:MySQL事件调度详解:定时任务的创建与管理及使用场景

全文目录: 前言8.2 MySQL事件调度1. 定时任务的创建与管理1.1 启用事件调度器1.2 创建定时任务1.2.1 一次性任务1.2.2 周期性任务1.2.3 管理事件的有效期 1.3 修改与删除事件1.3.1 修改事件1.3.2 删除事件 1.4 查看事件状态与执行日志 2. 事件调度器的使用场景2.1 数…

Python NumPy 数据分析:处理复杂数据的高效方法

Python NumPy 数据分析:处理复杂数据的高效方法 文章目录 Python NumPy 数据分析:处理复杂数据的高效方法一 数据来源二 获取指定日期数据三 获取指定行列数据四 求和计算五 比例计算六 平均值和标准差七 完整代码示例八 源码地址 本文详细介绍了如何使用…

HTML5实现好看的唐朝服饰网站模板源码2

文章目录 1.设计来源1.1 网站首页1.2 唐装演变1.3 唐装配色1.4 唐装花纹1.5 唐装文化 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.ne…

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中,我们制作了AB分区系统镜像,并成功通过uboot加载kernel以及d…

Flutter调试模式简介

在 Flutter 中,Profile 模式 是介于 Debug 和 Release 之间的运行模式,主要用于分析应用的性能,但同时保留一些有限的调试功能。它能够让你观察应用在接近生产环境下的表现,同时提供性能分析工具,如帧率、内存占用等&a…

Meta首款多模态Llama 3.2开源:支持图像推理,还有可在手机上运行的版本 | LeetTalk Daily...

“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 Meta最近推出的Llama Stack的发布标志着一个重要的里程碑。这一新技术的推出不仅为开发者提供了强大的多模态能力,还为企业和初…

【JAVA高级】 redis分布式双重加锁(业务校验:防止接口并发调用时数据重复)

文章目录 此问题的考虑思路使用Redis的key-value锁的基本思路结合Redis数据结构实现避免重复注意事项实现代码只避免 name和age的重复避免 name和age的和age和sex重复:使用双重的分布式锁实现: 背景:在日常开发过程中,遇到了一个需…

无人机视角垃圾检测数据集,26700余张无人机图像,超过4万标注信息,共3.6GB数据量,可用于环卫快速检查,垃圾快速定位等应用。

无人机视角垃圾检测,26700余张无人机图像,超过4万标注信息,共3.6GB数据量,可用于环卫快速检查,垃圾快速定位等应用。 名称 无人机视角垃圾检测数据集 规模 图像数量:26700余张标注信息:超过4…