当前位置: 首页 > news >正文

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.
在这里插入图片描述

http://www.lryc.cn/news/449166.html

相关文章:

  • 【JVM】类加载机制
  • ENV | 5步安装 npm node(homebrew 简洁版)
  • EasyExcel全面实战:掌握多样化的Excel导出能力
  • 基于springcloud的药品销售系统
  • 基于组网分割的超大规模设计 FPGA 原型验证解决方案
  • C# 面向对象基础,简单的银行存钱取钱程序
  • 【Rockchip系列】官方函数:drm_buf_alloc
  • 深度学习--------------------------------门控循环单元GRU
  • 【实战】| X小程序任意用户登录
  • 计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)
  • CEX上币趋势分析:Infra赛道与Ton生态的未来
  • 数组基础(c++)
  • 第十三届蓝桥杯真题Python c组A.排列字母(持续更新)
  • IDEA自动清理类中未使用的import包
  • 加工零件C++
  • Etcd 是一个分布式的键值存储系统,用于共享配置和服务发现
  • 如何帮助我们改造升级原有架构——基于TDengine 平台
  • MySQl查询分析工具 EXPLAIN ANALYZE
  • RestClientException异常
  • poi如何实现自定义导出Excel-纵向横向合并单元格,自定义填充数据列
  • 6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)
  • 游戏怎么录制?王者荣耀游戏录制指南:iOS与电脑端全面教程
  • Vue.js组件开发指南
  • 【流计算】流计算概论
  • 20230819盘锦锦州葫芦岛自驾
  • Unity 与虚幻引擎对比:两大游戏开发引擎的优劣分析
  • UDS_4_传输存储的数据功能单元
  • 第二百五十八节 JPA教程 - JPA查询选择两个实体示例
  • 数据库三级模式结构
  • 【小程序websocket最佳实践,有心跳和断线重连】