【 云原生 kubernetes 】- 使用Filebeat采集k8s日志

news2024/11/21 0:33:30

⚡️: 日志采集器Logstash其功能虽然强大,但是它依赖java、在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而filebeat就是一个完美的替代者,它基于Go语言没有任何依赖,配置文件简单,格式明了,

简介

​ 用于转发和集中日志数据的轻量级托运器。filebeat比logstash更加轻量级,所以占用系统资源极少,非常适合安装在生产机器上。这就是推荐使用filebeat,也是 ELK Stack 在 Agent 的第一选择。

采集流程:

  • container log --> Kafka topic

镜像构建

官方拉取的镜像,时区是 UTC ,我们想要获取到 CST 时间,并使用 filebeat 用户访问,就需要我们自己重新打镜像,下面是所用的Dockerfile

FROM elastic/filebeat:8.5.1
MAINTAINER ycloud
USER root

RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/*

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

USER filebeat

Helm部署

  • helm repo add elastic https://helm.elastic.co
  • helm install filebeat elastic/filebeat

部署十分简单,但是我们可能需要调整Helm chart配置,所以建议把包拉取到本地调整之后再进行部署,下面是详细流程

[root@ycloud ~]# helm repo add elastic https://helm.elastic.co
"elastic" already exists with the same configuration, skipping
[root@ycloud ~]# helm pull elastic/filebeat
[root@ycloud ~]# tar -zxvf filebeat-8.5.1.tgz 
filebeat/Chart.yaml
filebeat/values.yaml
filebeat/templates/NOTES.txt
filebeat/templates/_helpers.tpl
filebeat/templates/clusterrole.yaml
filebeat/templates/clusterrolebinding.yaml
filebeat/templates/configmap.yaml
filebeat/templates/daemonset.yaml
filebeat/templates/deployment.yaml
filebeat/templates/role.yaml
filebeat/templates/rolebinding.yaml
...
[root@ycloud ~]# cd filebeat/ ; ls
Chart.yaml  examples  Makefile  README.md  templates  values.yaml

配置调整

删除赘余部分

我们刚刚拉取了官方的Chart包,中间默认是指定input到Elastic,所以我们需要调整下Deployment模板

[root@ycloud filebeat]# vim templates/daemonset.yaml 
...
{{- if .Values.extraEnvs | default .Values.daemonset.extraEnvs }}
{{ toYaml ( .Values.extraEnvs | default .Values.daemonset.extraEnvs ) | indent 8 }}
{{- end }}
...
...
        {{- range .Values.secretMounts | default .Values.daemonset.secretMounts }}
        - name: {{ .name }}
          mountPath: {{ .path }}
          {{- if .subPath }}
          subPath: {{ .subPath }}
          {{- end }}
        {{- end }}
...
...
      {{- range .Values.secretMounts | default .Values.daemonset.secretMounts }}
      - name: {{ .name }}
        secret:
          secretName: {{ .secretName }}
      {{- end }}
...

⚡️:这里的secrets是挂的elastic的用户名密码,因为我这边是把数据先推到 kafka 而不是 es中,所以这个secrets 部分可以去掉。大家可以根据自己的情况调节。

更新Values

image 部分改为我们自己新build的镜像名称及tag

其余没什么太大改动的,剩下就是filebeat的配置文件,根据自己的情况进行配置,下面是我的一个配置情况

[root@ycloud filebeat]# vim values.yaml 
...
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*gstrain*.log
      scan_frequency: 1s
      processors:
        - add_kubernetes_metadata:
            in_cluster: true
            namespace: "gstrain"
            matchers:
              - logs_path:
                  logs_path: "/var/log/containers"
                  identifier: "container.id"
            enrichers:
              - deployment
        - drop_fields:
            fields:
              - "/^kubernetes\\.labels\\..*/"
              - "/^kubernetes\\.namespace_labels\\..*/"
              - "/^kubernetes\\.node\\..*/"
              - "/^(agent\\.name|agent\\.id|agent\\.type)$/"

        - drop_event:
            when:
              or:
                - equals:
                    kubernetes.container.name: "istio-proxy"
                - equals:
                    kubernetes.container.name: "istio-init"

    logging.level: debug
    output.kafka:
      hosts: ["10.189.6.130:9092","10.189.6.131:9092","10.189.6.132:9092"]
      topic: "gstrainpod-devel"
      partition.round_robin:
        reachable_only: true
      required_acks: 1
      compression: gzip
      max_message_bytes: 1000000
...
  • filebeat.inputs参数指定要监视的输入类型。在这个配置中,Filebeat监视Docker容器日志,并根据给定的路径来查找所有符合条件(包含“gstrain”字符串的)的容器日志文件。
  • scan_frequency参数设置Filebeat扫描容器日志文件的频率。
  • processors参数指定应该对事件进行的任何预处理步骤。在这个配置中,有几个处理器被定义,包括添加Kubernetes元数据,删除某些字段和事件过滤器等。
  • add_kubernetes_metadata处理器通过查询Kubernetes API来添加Kubernetes标签和注释等元数据信息,使得在后续处理流程中可以更好地对日志进行分类和分析。
  • drop_fields处理器通过正则表达式删除日志事件中不需要的字段,比如Kubernetes相关的字段。
  • drop_event处理器可以丢弃事件,例如当事件来自特定容器时,此处当事件来源于Istio Sidecar容器(istio-proxy和istio-init)时将其丢弃。
  • logging.level参数设置Filebeat的日志级别,这里设置为debug。
  • output.kafka参数定义要将收集的日志数据发送到Kafka的设置。在这个配置中,输出Kafka的地址以及要使用的主题名称等信息都被指定。还可以看到诸如轮询分区、压缩等其他设置。

挂载文件

❌: 这里有一点需要注意,这也是我疑惑的地方,filebeat采集日志,但是配置中的paths路径确实容器内部的路径,也可能中间哪些步骤没有了解清楚,我暂时是将宿主机目录挂载到Pod中,暂时解决这个问题

⭕️: 还有一个地方需要注意,了解的朋友可能知道 /var/log/containers 其实是个软连接,如果我们调整了容器日志的存储路径,也记得要把更改的路径挂上去,不然查询不到实际日志。

下面给出挂载案例,以Docker为 Runtime为例,并且日志路径为 /data/docker/

[root@ycloud filebeat]# vim template/DaemonSet.yaml
...
          volumeMounts:
            - mountPath: /usr/share/filebeat/filebeat.yml
              name: filebeat-config
              readOnly: true
              subPath: filebeat.yml
            - mountPath: /var/log/
              name: log
              readOnly: true
            - mountPath: /data/docker/containers
              name: dockerlog
              readOnly: true
...
...
      volumes:
        - configMap:
            defaultMode: 384
            name: filebeat-filebeat-deployment-config
          name: filebeat-config
        - hostPath:
            path: /var/log/
            type: ''
          name: log
        - hostPath:
            path: /data/docker/containers
            type: ''
          name: dockerlog
...

主流程

在这里插入图片描述

✌️: 我们filebaet采集Pod日志就可以正常运行了,不过我们前面也说了,我这边根据业务实际情况,将日志采集到Kafka 队列中去,通过现有日志系统中的Logstash将日志转发到 ES 中去。

下面就十分简易了,就直接贴个配置好了

input {
    kafka {
        id => "pod_k2e_id"
        bootstrap_servers => "192.168.100.10:9092,192.168.100.20:9092,192.168.100.30:9092"
        topics => "pod"
        auto_offset_reset => "earliest"
        group_id => "group_pod"
        consumer_threads => 90
        codec => json { charset => "UTF-8" }
    }
}

filter {
                        json {
                                source => "message"
                        }

                        mutate {
                                remove_field => ["tags","host","^host.*"]

                        }

                        ruby {
                                code => "event.set('index_day', event.get('@timestamp').time.localtime.strftime('%Y.%m.%d'))"
                        }   

                        mutate {
                                convert => {
                                "index_day" => "string"
                                }   
                        }
}

output {
    if ( [kubernetes][deployment][name] == "ycloud") {
        elasticsearch {
                id => "es_pod_id"
                hosts => ["http://192.168.100.10:9200","http://192.168.100.20:9200","http://192.168.100.30:9200"]
                index => "ycloud_crawl-%{index_day}"
                user => "elastic"
                password => "xxxxxxxxxx"
                codec => json { charset => "UTF-8" }
        }
    }else {
        elasticsearch {
                id => "es_pod2_id"
                hosts => ["http://192.168.100.10:9200","http://192.168.100.20:9200","http://192.168.100.30:9200"]
                index => "ycloud_pod-%{index_day}"
                user => "elastic"
                password => "xxxxxxxxxx"
                codec => json { charset => "UTF-8" } 
        }
    }  
}

结果

这里我们就可以成功采集到我们想要的日志了,不需要的字段也跟使用过滤器来delete掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693844.html

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

相关文章

制作外网shell

安装配置环境 网址 https://www.ngrok.cc 支付两块钱之后,就可以免费使用服务器,进行隧道开通。远程端口就是服务器的端口,可以先随便写,等下会提示有哪一些可用端口 下载客户端,选择64位的版本(跟kali一…

Lock接口介绍

1、 Synchronized (1) 多线程编程模板上 1) 第一步:创建资源类。 2) 第二步:创建操作方法。 3) 第三步:创建线程调用操作方法。 4)原则:高内聚低耦合。 (2) 实现步骤 1)创建资源类。 2)资源类…

ubuntu下简单编译opencv

# 安装依赖,其中python-dev没有安装上没关系。 sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libpng-dev libjpeg-dev libtiff5-dev libswscale-dev libjasper-dev libdc1394-22-dev libtiff-dev python-dev python-numpy libtb…

chatgpt赋能python:Python轨迹可视化:用数据讲故事

Python轨迹可视化:用数据讲故事 介绍 随着物联网、智能城市等领域的发展,越来越多的数据被收集下来并存储在数据库中。这些数据对于决策者来说是非常重要的,但是如何将这些数据进行展示和分析呢?这时候Python轨迹可视化就可以派…

java项目之后勤管理系统ssm源码+文档

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的后勤管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

【docker创建容器的坑】WSL启动nvidia-docker镜像:报错libnvidia-ml.so.1- file exists- unknown

可能得错误一: 今天使用docker创建容器的时候总是出错,最后锁定问题在“--gpus all”这里: 不加--gpu all可以运行,加入了--gpus all就出错: docker: Error response from daemon: failed to create task for conta…

C语言进阶(反码和补码)

文章目录 前言一、反码二、补码三、符号位四、在程序中打印反码和补码总结 前言 本篇文章我们主要来讲解C语言中的反码和补码,这个可能是大家比较容易忽略的点,那么这篇文章就带大家来学习一下什么是反码和补码。 一、反码 反码是通过对整数的二进制表…

基于FPGA的多通道数据采集单元同步的实现

多通道数据采集设备在当前信息数字化的时代应用广泛,各种被测量的信息 如光线、温度、压力、湿度、位置等,都需要经过多通道信号采集系统的采样和 处理,才能被我们进一步分析利用[37]。在一些对采集速率要求较高的军事、航天、 航空、工业制造…

【JUC进阶】06. 轻量级锁

目录 1、前言 2、轻量级锁 2.1、什么是轻量级锁 2.2、工作原理 2.2.1、回顾Mark Word 2.2.2、工作流程 2.3、解锁 3、适用场景 4、注意事项 5、轻量级锁与偏向锁的对比 6、小结 1、前言 前面一节我们讲到了偏向锁。当偏向锁被撤销,或其他线程竞争的时候…

国内脑机接口最新研究 - 脑控机器人在非结构化场景执行避障任务

💂 个人主页: 同学来啦🤟 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助,欢迎关注、点赞、收藏和订阅专栏哦 文章目录 🌟 一、能避障的脑控机器人导航🌟 二、机器…

Moveit1 机器人配置包超详细解析

前言 Moveit的robot_moveit_config包里有很多文件,在配置时容易搞不清关系,导致配置过程艰难、漫长。 同时互联网上的文档几乎没有详细介绍这部分配置包的,大神各有各的配法,比较混乱。 因此笔者整理了配置包内各个重要的文件&…

Volvo EDI 项目 MySQL 方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统,我们根据以往的项目实施经验,将成熟的 EDI 项目进行开源。用户安装好知行之桥 EDI 系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。…

Win10安装SQLite Expert Pers Setup64

在win10系统下安装SQLite Expert,我的电脑是64位系统,所以选择SQLite Expert Pers Setup64 一、软件下载 1、官网地址 SQLite administration | SQLite Expert 点击“DOWNLOAD”,选择红框中的免费版本 2、百度网盘下载 链接:h…

SQL SERVER2008导入导入mdf和ldf文件

把需要添加的文件复制粘贴到这个路径下: 再回到这点击添加:

商品减库在Redis中的运用

一.商品减库中存在问题 1.传统的代码 1.1引入jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.…

chatgpt赋能python:Python转换DAT的方法详解

Python转换DAT的方法详解 在数据处理的应用场景中&#xff0c;我们经常要将DAT文件格式转换为其他数据格式&#xff0c;比如CSV或Excel等。此时&#xff0c;Python的数据处理能力就表现出其强大的优势。在本文中&#xff0c;我们将详细介绍使用Python转换DAT文件格式的方法。 …

chatgpt赋能python:在Python中如何实现超链接本地文件

在Python中如何实现超链接本地文件 介绍 超链接是在网页中实现页面跳转的一种技术&#xff0c;而本地文件指的是计算机本地存储的文件。在Python中&#xff0c;我们可以通过一些库来实现超链接本地文件。 具体来说&#xff0c;需要使用到Python中的web框架以及文件操作库&am…

重温数据结构与算法之KMP算法

文章目录 前言一、原理1.1 暴力法1.2 最长公共前后缀 二、代码实现2.1 next数组2.2 可视化next2.3 KMP 三、总结3.1 优点3.2 缺点 参考 前言 ​ KMP 算法是一种字符串匹配算法&#xff0c;它可以在一个主串中查找一个模式串的出现位置。在实际应用中&#xff0c;字符串匹配是一…

LangChain 任意命令执行(CVE-2023-34541)

漏洞简介 LangChain是一个用于开发由语言模型驱动的应用程序的框架。 在LangChain受影响版本中&#xff0c;由于load_prompt函数加载提示文件时未对加载内容进行安全过滤&#xff0c;攻击者可通过构造包含恶意命令的提示文件&#xff0c;诱导用户加载该文件&#xff0c;即可造…

【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

目录 一、双向链表二、node(int index) 根据索引找节点三、clear()四、add(int, E&#xff09;五、remove(int index)六、双向链表和单链表七、双向链表和动态数组八、jdk 官方的 LinkedList 的 clear() 方法 一、双向链表 &#x1f381; 单链表的节点中只有一个 next 指针引用…