K8S精进之路-控制器DaemonSet -(3)
介绍
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.

相关文章:
K8S精进之路-控制器DaemonSet -(3)
介绍 DaemonSet就是让一个节点上只能运行一个Daemonset Pod应用,每个节点就只有一个。比如最常用的网络组件,存储插件,日志插件,监控插件就是这种类型的pod.如果集群中有新的节点加入,DaemonSet也会在新的节点创建出来…...
【JVM】类加载机制
文章目录 类加载机制类加载过程1. 加载2. 验证3. 准备4. 解析偏移量符号引用和直接引用 5. 初始化 类加载机制 类加载指的是,Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一些列的校验解析的过程(程序要想执行…...
ENV | 5步安装 npm node(homebrew 简洁版)
1. 操作步骤 1.1 安装 homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"1.2 安装 node # 安装最新版 brew install node # 安装指定版本,如18 brew install node181.3 安装 nvm(…...
EasyExcel全面实战:掌握多样化的Excel导出能力
1 概述 本文将通过实战案例全面介绍EasyExcel在Excel导出方面的多种功能。内容涵盖多表头写入、自定义格式、动态表头生成、单元格合并应用等。通过这些实例,读者可以掌握EasyExcel的各种高级功能,并在实际项目中灵活应用。 白日依山尽,黄河入海流。 欲穷千里目,更上一层楼…...
基于springcloud的药品销售系统
文未可获取一份本项目的java源码和数据库参考。 一、选题背景与意义 1. 选题背景 在日常医药管理中,面对众多的药品和众多不同需求的顾客,每天都会产生大量的数据信息。以传统的手工方式来处理这些信息,操作比较繁琐,且效率低下…...
基于组网分割的超大规模设计 FPGA 原型验证解决方案
引言 如何快速便捷的完成巨型原型验证系统的组网,并监测系统的连通性及稳定性? 如何将用户设计快速布局映射到参与组网的原型验证系统的每一块 FPGA? 随着用户设计规模的日益增大,传统基于单片 FPGA 或单块电路板的原型验证系统…...
C# 面向对象基础,简单的银行存钱取钱程序
题目: 代码实现: BankAccount部分: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Bank {internal class BankAccount{private decimal balance 0;//账…...
【Rockchip系列】官方函数:drm_buf_alloc
drm_buf_alloc 函数 功能 分配一个DRM(Direct Rendering Manager)缓冲区。 语法 void* drm_buf_alloc(int width, int height, int bpp, int* fd, int* handle, size_t* size, int flags);参数 width: 缓冲区宽度(像素)heigh…...
深度学习--------------------------------门控循环单元GRU
目录 门候选隐状态隐状态门控循环单元GRU从零开始实现代码初始化模型参数定义隐藏状态的初始化函数定义门控循环单元模型训练该部分总代码简洁代码实现 做RNN的时候处理不了太长的序列,这是因为把整个序列信息全部放在隐藏状态里面,当时间很长的话&#…...
【实战】| X小程序任意用户登录
复现步骤 在登陆时,弹出这个页面时 抓包,观察数据包的内容 会发现有mobile值(密文)和iv值(随机数),拿到密文,肯定时想到解密,想要解密就必须知道密文,…...
计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
CEX上币趋势分析:Infra赛道与Ton生态的未来
在当前的加密市场中,CEX(中心化交易所)上币的选择愈发重要,尤其是对项目方而言。根据 FMG 的整理,结合「杀破狼」的交易所上币信息,显然 Infra 赛道成为了交易所的热门选择,而 Ton 生态也展现出…...
数组基础(c++)
第1题 精挑细选 时限:1s 空间:256m 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下&#x…...
第十三届蓝桥杯真题Python c组A.排列字母(持续更新)
博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 【问题描述】 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如&a…...
IDEA自动清理类中未使用的import包
目录 1.建议清理包的理由 2.清理未使用包的方式 2.1 手动快捷键清理 2.2 设置自动清理 1.建议清理包的理由 有时候项目类文件中会有很多包被引入了,但是并没有被使用,这会增加项目的编译时间并且代码可读性也会变差。在开发过程中,建议设…...
加工零件C++
题目: 样例解释: 样例#1: 编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。 编号为 2 的工人想生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。 编号为 3 的工人想生产第 1 阶段的零件&#x…...
Etcd 是一个分布式的键值存储系统,用于共享配置和服务发现
Etcd 是一个分布式的键值存储系统,用于共享配置和服务发现。它最初由 CoreOS 开发,并已成为许多分布式系统中的关键组件之一,特别是在 Kubernetes 中扮演着核心角色。Etcd 的设计目标是简单、可靠、安全,并且易于使用。 Etcd 的特…...
如何帮助我们改造升级原有架构——基于TDengine 平台
一、简介 TDengine 核心是一款高性能、集群开源、云原生的时序数据库(Time Series Database,TSDB),专为物联网IoT平台、工业互联网、电力、IT 运维等场景设计并优化,具有极强的弹性伸缩能力。同时它还带有内建的缓存、…...
MySQl查询分析工具 EXPLAIN ANALYZE
文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料:https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…...
RestClientException异常
什么情况下会抛出RestClientException异常 RestClientException 异常通常在使用 Spring 的 RestTemplate 进行 RESTful API 调用时抛出。以下是一些常见的情况: 网络问题:当无法连接到目标服务器时,例如网络中断或服务器不可达。 HTTP 状态…...
ae新手福音,用快马平台ai生成带注释的片段视频代码轻松入门
作为一个刚接触AE的新手,第一次打开软件时确实被复杂的界面吓到了。各种面板、时间轴、效果控件看得眼花缭乱,更别说要自己写表达式了。直到发现了InsCode(快马)平台,用自然语言描述就能生成带详细注释的AE项目代码,简直是新手的救…...
OpenClaw轻量化部署:在树莓派上运行Qwen3.5-9B微型服务
OpenClaw轻量化部署:在树莓派上运行Qwen3.5-9B微型服务 1. 为什么选择树莓派部署OpenClaw 去年夏天,我在整理个人文档时被重复的文件分类工作折磨得苦不堪言。当时我就在想:如果能有个AI助手帮我自动处理这些琐事该多好。但市面上的云端方案…...
树莓派5跑n8n稳吗?实测Docker部署性能与避坑指南(Ubuntu 24.04 + 安全加固)
树莓派5实战:n8n工作流自动化平台的Docker部署与性能调优指南 在物联网与自动化技术蓬勃发展的今天,如何以最低成本构建稳定可靠的工作流自动化系统成为许多开发者和企业关注的重点。树莓派5凭借其出色的性价比和低功耗特性,配合Docker容器化…...
小白也能搞定!用Docker和Halo 2.10搭建个人博客,再也不用担心公网访问问题
零基础玩转DockerHalo 2.10:打造高颜值个人博客全攻略 在数字内容创作爆发的时代,拥有一个专属博客空间已成为个人品牌建设的标配。但传统建站方案往往面临技术门槛高、维护成本大等痛点。本文将带你用Docker容器技术和Halo 2.10开源系统,30…...
AMD GPU高效部署Ollama:专业本地大语言模型实战指南
AMD GPU高效部署Ollama:专业本地大语言模型实战指南 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/gh_mirrors/ol/ollama…...
HTML2Canvas终极指南:快速将网页内容转为精美图片的完整方案
HTML2Canvas终极指南:快速将网页内容转为精美图片的完整方案 【免费下载链接】html2canvas Screenshots with JavaScript 项目地址: https://gitcode.com/gh_mirrors/ht/html2canvas HTML2Canvas是一款强大的JavaScript库,能够直接在浏览器中把网…...
告别DWA!用TEB局部规划器让你的ROS机器人学会‘倒车入库’(附多机编队避障实测对比)
告别DWA!用TEB局部规划器解锁机器人高阶机动能力 在机器人自主导航领域,传统动态窗口方法(DWA)长期占据主导地位,直到开发者们遇到那些需要倒车、急转弯或狭窄空间多机协作的真实场景。想象一下仓储机器人需要在货架间完成"倒车入库&quo…...
开发者专属OpenClaw配置:nanobot镜像对接VSCode插件开发
开发者专属OpenClaw配置:nanobot镜像对接VSCode插件开发 1. 为什么选择nanobot镜像进行VSCode插件开发 去年我在开发一个智能代码补全插件时,发现市面上大多数AI辅助工具都存在响应延迟高、隐私性差的问题。直到接触到OpenClaw生态下的nanobot镜像&…...
避坑指南:为什么你的Jetson开发板apt安装Perf总是失败?
深度解析:Jetson开发板为何无法直接安装Perf及高效解决方案 在嵌入式开发领域,Nvidia Jetson系列凭借其强大的AI计算能力成为边缘计算的热门选择。然而当开发者尝试在这类设备上使用标准Ubuntu方法安装性能分析工具Perf时,往往会遭遇意想不到…...
EPLAN默认工具栏隐藏功能大揭秘:从复制格式到表格式编辑的实战技巧
EPLAN默认工具栏隐藏功能大揭秘:从复制格式到表格式编辑的实战技巧 在电气设计领域,EPLAN作为行业标杆软件,其默认工具栏中隐藏着许多未被充分发掘的效率利器。这些功能往往被常规操作所掩盖,却能在复杂项目设计中节省大量时间。…...
