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

news2024/11/17 13:26:12

介绍

  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: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.22.1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
        - name: varlog
          mountPath: /var/log/nginx
      volumes:
      - name: varlog
        hostPath:
          path: /tmp/log        
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      storageClassName: rook-ceph-block
      accessModes:
      - ReadWriteOnce
      resources:
        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-config
  namespace: default
data:
  filebeat.yml: |-
    filebeat.registry_file: /var/log/containers/filebeat_registry
    filebeat.idle_timeout: 5s
    filebeat.spool_size: 2048
    
    logging.level: info
    
    filebeat.prospectors:
    - input_type: log
      paths:
        - "/var/log/nginx/*.log"
      symlinks: true
      json.message_key: log
      json.keys_under_root: true
      json.add_error_key: true
      multiline.pattern: '^\s'
      multiline.match: after
      document_type: kube-logs
      tail_files: true
      fields_under_root: true
    
    output.redis:
      hosts: ${REDIS_HOST:?No Redis host configured. Use env var REDIS_HOST to set host.}
      key: "filebeat"
---
apiVersion: v1
kind: Service
metadata:
  name: rediservice
  labels:
    app: redis
spec:
  ports:
  - port: 6379
    name: redis
  clusterIP: None
  selector:
    app: redis
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: default
spec:
  serviceName: "rediservice"
  replicas: 1
  selector:
    matchLabels:
      app: redis
      role: logstor
  template:
    metadata:
      labels:
        app: redis
        role: logstor
    spec:
      containers:
      - name: redis
        image: redis:4.0-alpine
        ports:
        - name: redis
          containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  namespace: default
spec:
  selector:
    matchLabels:
      app: filebeat
      release: stable
  template:
    metadata:
      labels: 
        app: filebeat
        release: stable
    spec:
      containers:
      - name: filebeat
        image: ikubernetes/filebeat:5.6.5-alpine
        volumeMounts:
          - name: filebeat-config
            mountPath: /etc/filebeat
          - name: nginx-logs
            mountPath: /var/log/nginx/
        env:
        - name: REDIS_HOST
          value: redis-0.rediservice.default.svc.cluster.local
        - name: REDIS_LOG_LEVEL
          value: debug     
      volumes:
        - name: filebeat-config
          configMap:
            name: filebeat-config
        - name: nginx-logs
          hostPath:
            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-ds
  namespace: default
spec:
  selector:
    matchLabels:
      app: filebeat
      release: stable
  template:
    metadata:
      labels: 
        app: filebeat
        release: stable
    spec:
      containers:
      - name: filebeat
        image: ikubernetes/filebeat:5.6.6-alpine
        volumeMounts:
          - name: filebeat-config
            mountPath: /etc/filebeat
          - name: nginx-logs
            mountPath: /var/log/nginx/
        env:
        - name: REDIS_HOST
          value: redis-0.rediservice.default.svc.cluster.local
        - name: REDIS_LOG_LEVEL
          value: debug     
      volumes:
        - name: filebeat-config
          configMap:
            name: filebeat-config
        - name: nginx-logs
          hostPath:
            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.coloradmin.cn/o/2176799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Router】路由功能之DMZ(Demilitarized Zone)功能介绍及实现

DMZ(Demilitarized Zone) DMZ(非军事化区域)是一个位于内部网络和外部网络之间的分段区域。在一个网络中,DMZ通常包含运行公共服务的服务器或其他设备。 DMZ是一个位于内部网络和外部网络之间的分段区域,用…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…

【笔记】Java 栈 java.util.Stack

目标:了解Java编程语言里栈和队列是什么样的。 概念 在Java中,Stack 类表示一个后进先出(LIFO,Last-In-First-Out)的对象栈。它继承自 Vector 类,并提供了五个操作,允许将向量(Vector)视为栈来处理。这些操作包括常用的: 压栈(push)出栈(pop)操作用于查看栈顶元…

物理加密机的高性能操作

物理加密机,也被称为硬件安全模块(HSM)或加密锁,是一种用于保护敏感数据和软件应用的物理设备。以下是关于物理加密机的详细介绍: 一、定义与功能 物理加密机通过提供强大的加密功能和访问控制,确保数据在存储、处理和传输过程中的…

GIS--为研究区准备数据

一、实验目的 掌握空间数据的分幅组织方法,掌握常用的空间数据处理技术 二、实验内容 计算图幅号;空间配准、投影定义、投影转换;拼接、裁切,获取研究区内的土地利用数据 三、实验原理与方法 实验原理:空间数据组…

【火狐浏览器 - 数据同步】使用Mozilla账户登录

不要使用火狐通行证 解决方法 在国内下载 开发版本的firefox, 即可数据同步 https://www.mozilla.org/zh-CN/firefox/all/ 登录成功 其他 如果还不同步, 试下这个插件 http://mozilla.com.cn/thread-343905-1-1.html

可控硅光耦——工业自动化智能转型的护航先锋

随着工业自动化程度的持续深化,对安全性、可靠性和智能化水平的要求愈发严苛。在这一浪潮中,可控硅光耦凭借其卓越性能,正逐渐成为工业自动化领域的核心驱动力。本文将深入探讨可控硅光耦在工业自动化智能转型中的创新应用与价值。 提升生产…

四气两尘监测站中空气质量传感器推荐

在快速发展的工业化进程中,空气质量已成为衡量一个地区环境健康水平的重要指标。随着公众环保意识的增强,对空气质量的关注不再局限于直观的蓝天白云,而是深入到更为细微、复杂的污染物层面,其中,“四气两尘”便是这一…

C++第五讲(1):STL--string--各个函数的使用方法

C第五讲:STL--string 1.STL简介2.string类2.1string类的常见构造2.1.1重点1: string()2.1.2重点2:string(const string& str)2.1.3使用3:string(const string& str, size_t pos, size_t len npos)…

CSS实现磨砂玻璃效果

引言 最近看到有一种磨砂玻璃背景效果很好看&#xff0c;自己简单制作了一个美杜莎女王小卡片&#xff0c;效果如下&#xff1a; backdrop-filter: blur(10px); 通过设置背景幕布的模糊程度&#xff0c;结合背景图片&#xff0c;实现磨砂玻璃效果 案例代码 <!DOCTYPE h…

探索Kimi:为程序员打造的智能助手

程序员的生活充满了挑战和创新。他们需要快速获取信息、解决问题并保持技术的前沿。在这个快节奏的环境中&#xff0c;一个可靠的智能助手可以成为他们最宝贵的资源之一。今天&#xff0c;我想向你们介绍Kimi——一个由月之暗面科技有限公司开发的人工智能助手&#xff0c;它专…

都选这条赛道,万粉博是不是要烂大街了...

最近参加了一个有意思的项目&#xff1a;视频号数字人直播带货&#xff0c;就是批量起矩阵号发布视频&#xff0c;视频内容呢都是卖各种东西&#xff0c;比如足球灯、除螨喷雾、果蔬净等等。 这是一个比较有潜力的项目&#xff0c;到后面再给大家具体介绍吧。那今天给大家介绍的…

springboot整合sentinel和对feign熔断降级

一、准备 docker安装好sentinel-dashboard&#xff08;sentinel控制台&#xff09;&#xff0c;参考docker安装好各个组件的命令启动sentinel-dashboard&#xff0c;我的虚拟机ip为192.168.200.131&#xff0c;sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…

LeetCode讲解篇之53. 最大子数组和

文章目录 题目描述题解思路题解代码 题目描述 题解思路 该问题我们可以转换为求以i为最后一个元素的0 ~ i范围内的最大子数组和&#xff0c;然后其中的所有的最大子数组和的最大值就是我们要返回的答案 题解代码 func maxSubArray(nums []int) int {ans : nums[0]for i : 1;…

PID控制算法(六)

#include <stdio.h> #include <stdlib.h>// 定义PID结构体 typedef struct {float SetSpeed;float ActualSpeed;float err;float integral;float vo_out; //控制器输出float err_last;float Kp;float Ki;float Kd;float limit_min; // 输出限制最小值flo…

基于php的酒店管理系

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

毕业设计——小程序项目的完整原型设计

作品详情 完整短剧项目的需求文档&#xff0c;包括小程序项目的完整原型设计&#xff0c;数据指标体系与埋点规划&#xff0c;会员系统、剧集播放解锁、充值支付等逻辑设计。 项目文档链接&#xff1a;https://axhub.im/ax10/b224d75a2ea99a8b/#g1

校园跑腿圈子论坛社团小程序APP需要多少钱

校园跑腿圈子论坛社团小程序APP的开发费用因多种因素而异&#xff0c;包括功能需求、设计需求、开发团队规模和技术难度等。以下是对这些因素的详细分析以及大致的费用估算&#xff1a; 一、功能需求 校园跑腿小程序的基本功能可能包括用户注册登录、任务发布与接单、实时聊天…

gitee公钥设置、创建库及使用

简介 一、如何安装git 使用gitee&#xff0c;需要先安装git工具。 工具网站地址&#xff1a;https://git-scm.com/downloads 安装完成后&#xff0c;在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…

告别“军备竞赛”!L2进入下沉普及周期,谁在领跑本土方案市场?

随着智能驾驶普及进入20万元以下价位区间&#xff0c;“军备竞赛”模式不再成为主流。尤其是成本占比权重更加突出&#xff0c;取消激光雷达、算力降维以及高低配策略&#xff0c;成为「新常态」。 8月27日&#xff0c;小鹏MONA M03正式上市&#xff0c;22天后&#xff0c;新车…