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

news/2024/6/3 7:34:58 标签: 云原生, kubernetes, 容器

⚡️: 日志采集器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.niftyadmin.cn/n/475394.html

相关文章

8.13 UNIX域套接字

目录 UNIX 域流式套接字 本地地址 UNIX域流式套接字 UNIX 域数据报套接字 UNIX 域流式套接字 本地地址 struct sockaddr_un {unsigned short sun_family; /* 协议类型 */char sun_path[108]; /* 套接字文件路径 */ };UNIX域流式套接字 UNIX 域流式套接字的用法…

5、R语言所需安装包安装教程

一、R包安装 1.鼠标右键,以管理员的身份运行,然后点击确定。 2.点击安装导向中的下一步。 3.修改安装路径,安装到自己所需的路径,然后点击下一步。 4.勾选自己所需组件,然后点击下一步。 5.启动选项,选…

Linux安装nginx 反向代理 负载均衡 动静分离 高可用等使用

随着软件需求的发展,现在很多的系统都需要保证高可用、高并发,在此需求之下就需要部署的服务能够不间断的提供服务即避免单点故障问题因此系统需要做集群部署同时还能提升qps、tps等指标;集群部署后的服务就需要对用户的请求能够负载均衡&…

【备战秋招】每日一题:2023.03.26-阿里OD机试(第三题)-数组之和最小值

为了更好的阅读体检,可以查看我的算法学习网站 在线评测链接:P1119 题目内容 塔子哥是一个热爱数学的年轻数学家,他对数字和因子分解有着深入的研究。 有一天,他在一次偶然的探索中发现了一款神奇的游戏,名为“除数游戏”。 在…

backtrader官方中文文档正确使用姿势——入门方法

开发大佬请自动绕行,写给小白读者的。。。 站在过来人的经验,给新入坑的小伙伴几点建议: 1、计算机是实践性很强的学科,所以写代码就是写代码,学backtrader也是写代码,你得把代码码出来,让你的…

RPC框架(一):扫盲

文章目录 一、概要二、RPC组成部分三、影响RPC框架性能的因素 一、概要 RPC作用? 让不同服务间调用方法像同一服务间调用本地方法一样 二、RPC组成部分 Client:RPC协议调用方 Server:远程服务方法的具体实现 Stub/Proxy:RPC代…

chatgpt赋能python:Python访问Web网页的SEO

Python访问Web网页的SEO 在当今的数字化时代,许多企业都离不开其在线存在。搜索引擎优化(SEO)是提高网站在搜索引擎结果排名中的位置的关键因素之一。而Python访问Web网页正是SEO的基础。 什么是Python访问Web网页? Python可以…

【数据结构导论】第 2 章:线性表

目录 一、线性表的基本概念 (1)线性表的基本概念 (2)线性表的逻辑结构特征 (3)线性表的基本运算 二、线性表的顺序存储 (1)线性表顺序存储的类型定义 (2&…