【k8s】【ELK】基于节点DaemonSet运行日 志Agent实践【待写】

news2024/11/24 4:00:15

1.日志收集场景分析与说明

部署架构说明

对于那些将日志输出到,stdout与stderr的Pod,
可以直接使用DaemonSet控制器在每个Node节点上运行一个 <font color=red>filebeat、logstash、fluentd </font>容器进行统一的收集,而后写入到日志存储系统。

在这里插入图片描述

2.filebeat部署

#创建ServiceAccount
kubectl create serviceaccount filebeat -n logging


#创建ClusterRole
kubectl create clusterrole filebeat \
--verb=get,list,watch \
--resource=namespace,pods,nodes


#创建ClusterRolebinding
kubectl create clusterrolebinding filebeat \
--serviceaccount=logging:filebeat \
--clusterrole=filebeat
#下载镜像 ,推送
docker pull docker.elastic.co/beats/filebeat:7.17.6
docker tag docker.elastic.co/beats/filebeat:7.17.6 harbor.oldxu.net/base/filebeat:7.17.6
docker push harbor.oldxu.net/base/filebeat:7.17.6

2.1 交付filebeat

1、从ConfigMap中挂载filebeat.yaml配置文件;
2、挂载 /var/log、/var/lib/docker/containers 日志相关目录;

3、使用 hostPath 方式挂载 /usr/share/filebeat/data 数据目录,该目录下有一个registry文件,里面记录了filebeat采集日志位置的相关
内容,比如文件offset、source、timestamp等,如果Pod发生异常后K8S自动将Pod进行重启,不挂载的情况下registry会被重置,将导致日志文件又从offset=0开始采集,会造成重复收集日志。这点非常重要.

filebeat-daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: logging
spec:
  selector:
    matchLabels:
	  app: filebeat 
  template:
    metadata:
	  labels:
	    app: filebeat
    spec:
	  serviceAccountName: "filebeat"
	  tolerations:
	  - key: node-role.kubernetes.io/master
	    operator: "Exists"
		effect: "NoSchedule"
	  imagePullSecrets:
	  - name: harbor-admin
	  
	  containers:
	  - name: filebeat
	    image: harbor.oldxu.net/base/filebeat:7.17.6
		args: [
		  "-c","/etc/filebeat.yml",
		  "-e"
		]
        securityContext:
		  runAsUser: 0
		resources:
		  limits:
		    memory: 200Mi
	    volumeMounts:
		- name: config
		  mountPath: /etc/filebeat.yml
		  subPath: filebeat.yml
		- name: varlog
		  mountPath: /var/log
		  readOnly: true
		- name: varlibdockercontainers
		  mountPath: /var/lib/docker/containers
		  readOnly: true
		- name: data
		  mountPath: /usr/share/filebeat/data
		  
	  volumes:
      - name: config
        configMap:
          name: filebeat-config
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
	    hostPath:
		  path: /var/lib/docker/containers
	  - name: data
	    hostPath:
		  path: /var/lib/filebeat-data
		  type: DirectoryOrCreate

2.2 收集kube-system名称空间

日志位置: /var/log/containers/${pod_name}_${pod_namespace}_${container_name}-${container_id}

在这里插入图片描述

filebeat-cm.yaml

apiVersion: v1
 kind: ConfigMap
 metadata:
   name: filebeat-config
   namespace: logging
 data:
   filebeat.yml: |-
     #===Filebeat autodiscover
       providers:
         - type: kubernetes
           templates:
           - condition:   #匹配kube-system名称空间下所有日志
               equals:
                 kubernetes.namespace: kube-system
             config:
               - type: container
                 stream: all #收集stdout、stderr类型日志,all是所有
                 encoding: utf-8
                 paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                 exclude_lines: ['info']
                 
     #=== Kafka Output
     output.console:
       pretty: true
       enable: true

下面是 正确的filebeat-cm.yaml ,上面留着做错误参考

[root@master01 02-DaemonSet-agent-log]# cat 02-filebeat-cm.yaml 
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: filebeat-config
   namespace: logging
 data:
   filebeat.yml: |-
     filebeat.autodiscover:
       providers:
         - type: kubernetes
           templates:
           - condition: 
               equals:
                 kubernetes.namespace: kube-system
             config:
               - type: container
                 stream: all
                 encoding: utf-8
                 paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                 exclude_lines: ['info']
                   
     output.console:
       pretty: true
       enable: true

备注:要写对 filebeat.yml的配置内容,否则报错:
错误1:

2023-05-15T08:45:51.149Z	INFO	instance/beat.go:328	Setup Beat: filebeat; Version: 7.17.6
2023-05-15T08:45:51.149Z	INFO	instance/beat.go:361	No outputs are defined. Please define one under the output section.
2023-05-15T08:45:51.149Z	INFO	instance/beat.go:461	filebeat stopped.
2023-05-15T08:45:51.149Z	ERROR	instance/beat.go:1014	Exiting: No outputs are defined. Please define one under the output section.
Exiting: No outputs are defined. Please define one under the output section.

错误2:

2023-05-15T09:03:09.492Z	INFO	[publisher]	pipeline/module.go:113	Beat name: filebeat-62ql6
2023-05-15T09:03:09.493Z	INFO	instance/beat.go:461	filebeat stopped.
2023-05-15T09:03:09.493Z	ERROR	instance/beat.go:1014	Exiting: no modules or inputs enabled and configuration reloading disabled. What files do you want me to watch?
Exiting: no modules or inputs enabled and configuration reloading disabled. What files do you want me to watch?

错误3:

当master节点,内存还剩200MB的时候,部署daemonSet,他副本数会是0个, Events: <none>

在这里插入图片描述

正常运行后的情况:
在这里插入图片描述

模拟产生日志,并查看日志

删除node01节点上kube-system名称空间中的Pod,模拟产生日志
kubectl delete pod  -n kube-system kube-proxy-6ks5b

kubectl logs -n logging filebeat-6qhwg 

在这里插入图片描述

2.3 收集ingress-nginx名称空间

1、修改Ingress日志输出格式

kubectl edit configmaps -n ingress-nginx ingress-controller-leader-nginx

#加上data内容
log-format-upstream:'{"timestamp":"$time_iso8601","domain":"$server_name","hostname":"$hostname","remote_user":"$remote_user","clientip":"$remote_addr","proxy_protocol_addr":"$proxy_protocol_addr","@source":"$server_addr","host":"$http_host","request":"$request","args":"$args","upstreamaddr":"$upstream_addr","status":"$status","upstream_status":"$upstream_status","bytes":"$body_bytes_sent","responsetime":"$request_time","upstreamtime":"$upstream_response_time","proxy_upstream_name":"$proxy_upstream_name","x_forwarded":"$http_x_forwarded_for","upstream_response_length":"$upstream_response_length","referer":"$http_referer","user_agent":"$http_user_agent","request_length":"$request_length","request_method":"$request_method","scheme":"$scheme","k8s_ingress_name":"$ingress_name","k8s_service_name":"$service_name","k8s_service_port":"$service_port"}'

在这里插入图片描述

2、为filebeat增加如下内容(注意保留此前kube-system相关的配置)

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: logging
data:
  filebeat.yml: |-
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          templates:
          - condition: # 1 匹配kube-system名称空间下所有日志
              equals:
                kubernetes.namespace: kube-system
            config:
              - type: container
                stream: all
                encoding: utf-8
                paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                exclude_lines: ['info']
                
          - condition: # 2 收集ingress-nginx命名空间下stdout日志 
              equals:
                kubernetes.namespace: ingress-nginx
            config:
              - type: container
                stream: stdout
                encoding: utf-8
                paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                json.keys_under_root: true #默认将json解析存储至messages,true则不存储至message
                json.overwrite_keys: true  #覆盖默认message字段,使用自定义json格式的key 
          
          - condition:  # 3 收集ingress-nginx命名空间下stderr日志
              equals:
                kubernetes.namespace: ingress-nginx
            config:
              - type: container
                stream: stderr
                encoding: utf-8
                paths:
                  - /var/log/containers/*-${data.kubernetes.container.id}.log
                     
    output.console:
      pretty: true
      enable: true

3、访问ingress,模拟产生日志

先看ingress-nginx部署在那个节点上,然后logs -f那个节点上filebeat日志

curl kibana.oldxu.net:30080

kubectl logs -f -n logging filebeat-fqp84

在这里插入图片描述

2.4 收集kubelet本地应用程序日志

1、kubelet应用日志存储至每个节点 /var/log/messages中,所以直接追加如下一段静态方式收集即可;

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: logging
data:
  filebeat.yml: |-
    # ======= Filebeat inputs  静态方式收集
    logging.level: warning
    filebeat.inputs:
    - type: log
      enable: true
      encoding: utf-8
      paths: /var/log/messages
      include_lines: ['kubelet']  # 4 获取与kubelet相关的日志
      fields:
        namespace: kubelet
      fields_under_root: true
    
    # ======= Filebeat autodiscover 动态方式收集
    filebeat.autodiscover:
      providers:
        - type: kubernetes
          templates:
          - condition: # 1 匹配kube-system名称空间下所有日志
              equals:
                kubernetes.namespace: kube-system
            config:
              - type: container
                stream: all
                encoding: utf-8
                paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                exclude_lines: ['info']
                
          - condition: # 2 收集ingress-nginx命名空间下stdout日志 
              equals:
                kubernetes.namespace: ingress-nginx
            config:
              - type: container
                stream: stdout
                encoding: utf-8
                paths: /var/log/containers/*-${data.kubernetes.container.id}.log
                json.keys_under_root: true #默认将json解析存储至messages,true则不存储至message
                json.overwrite_keys: true  #覆盖默认message字段,使用自定义json格式的key 
          
          - condition:  # 3 收集ingress-nginx命名空间下stderr日志
              equals:
                kubernetes.namespace: ingress-nginx
            config:
              - type: container
                stream: stderr
                encoding: utf-8
                paths:
                  - /var/log/containers/*-${data.kubernetes.container.id}.log
                     
    output.console:
      pretty: true
      enable: true

报错处理:

[root@master01 02-DaemonSet-agent-log]# kubectl logs -n logging filebeat-5kznt 
Exiting: error loading config file: yaml: line 3: mapping values are not allowed in this context

在这里插入图片描述

2、检查filebeat,查看日志收集情况
/var/log/messages的kubelet相关内容:
在这里插入图片描述

filebeat的显示:
在这里插入图片描述

3.filebeat配置文件优化

3.1 优化filebeat输出段 与 修改配置输出至Kafka

优化filebeat输出段 :
在这里插入图片描述

当控制面板得到的信息符合预期时,我们需要将信息输出至Kafka,将output修改为如下内容即可;

3.2 检查kafka对应Topic

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

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

相关文章

使用doop识别最近commons text漏洞的污点信息流

作者&#xff1a;vivo 互联网安全团队 - Chen Haojie 本文基于笔者对doop静态程序分析框架源代码和规则学习&#xff0c;并结合对目前漏洞公开技术细节的学习&#xff0c;修改增强doop app only模式下的分析规则后&#xff0c;实现通过doop工具识别commons text rce漏洞&#…

【QuartusII】0-创建工程模板

一、创建工程 1、激活安装quartus II软件后&#xff0c;打开即见如下界面 2、在菜单栏 “File -> New Project Wizard…”中&#xff0c;进入创建工程流程 3、第一部分&#xff0c;如下图&#xff0c;配置路径、项目名称、以及顶层文件&#xff08;类似C语言的main&#xf…

Mac上如何装Nacos?

Nacos大家都很熟悉,服务注册中心,那么今天给大家写一篇Mac上如何装Nacos的文章。 安装步骤如下: 1、上官网 http://nacos.io/zh-cn/ 点击跳到nacos的官网上。然后点击前往Github 2、找到release 发布版本 来到GitHub上后,页面往下滑,找到latest stable release,点击…

【Linux】管道的读写特点和管道设置为非阻塞

目录 管道的读写特点管道设置为非阻塞 橙色 管道的读写特点 使用管道时&#xff0c;需要注意以下几种特殊的情况&#xff08;假设都是阻塞I/O操作&#xff09; 所有的指向管道写端的文件描述符都关闭了&#xff08;管道写端引用计数为0&#xff09;&#xff0c;有进程从管道的…

Shapefile在线查看利器【MapJS】

MapJS是一个免费的GIS地图文件在线查看工具&#xff0c;在浏览器里即可直接打开本地的Shapfile、GeoJSON、TopoJSON、KML等文件进行查看。 MapJS在线访问地址&#xff1a;Shapefile|GeoJSON|KML在线查看工具 。 1、MapJS快速上手 在浏览器中打开MapJS官网后&#xff0c;直接拖…

计算机图形学 | 奇妙的真实感——片元着色

计算机图形学 | 奇妙的真实感——片元着色 计算机图形学 | 奇妙的真实感——片元着色9.1 图形渲染与视觉外观图形渲染的光栅化阶段基于视觉外观的渲染视觉物理现象视觉现象光照计算着色方式表面细节有光有影才有真实感 9.2 奇妙的颜色什么是颜色可见光谱颜色视觉的生理基础 人眼…

美颜sdk的多平台适配与跨平台开发技术分享

美颜sdk作为互联网时代的重要工具&#xff0c;也因其高效、稳定、易用的特点&#xff0c;被越来越多的应用开发者所采用。然而&#xff0c;在不同的平台上使用美颜sdk时&#xff0c;会遇到一些问题&#xff0c;如何进行多平台适配和跨平台开发&#xff0c;成为了一个值得探讨的…

只需要两步就能快速接入GPT

缘起 最近一个朋友提出&#xff0c;让我出个关于如何快速接入GPT的教程&#xff0c;今天就给大家安排上。 需要的工具 经过实测&#xff0c;这是迄今为止最便捷的接入方式&#xff0c;而且亲测有效。 首先&#xff0c;第一步你需要下载最新版的微软Edge浏览器&#xff0c;去…

Python(Keras)实现 LSTM 对销售额的预测

博主之前有涉及过LSTM的文章&#xff0c;见下&#xff1a; LSTM-理解 Part-1&#xff08;RNN&#xff1a;循环神经网络&#xff09; Python LSTM时序数据的预测&#xff08;一些数据处理的方法&#xff09; 机器学习 Pytorch实现案例 LSTM案例&#xff08;航班人数预测&#xf…

Unity3D :重要的类 - Gizmos 和 Handles

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 重要的类 - Gizmos 和 Handles Gizmos 和 Handles 类用于在 Scene 视图和 Game 视图绘制线条和形状以及交互式手柄和控件。这两个类共同提供了一种方法来扩展这些视图中显示的内容&…

【云原生】Kubernetes 的组件与架构

文章目录 引语1、集群组件1.1 控制平面组件&#xff08;Control Plane Components&#xff09;1.2 Node 组件1.3 插件&#xff08;Addons&#xff09; 2、集群搭建总结 引语 在上篇文章&#xff0c;我们介绍了 Kubernetes 是什么&#xff0c;它能够对容器进行编排&#xff0c;…

实现Qwidget窗口填满整个主窗口,并跟随鼠标的拖动自动缩放

实现Qwidget窗口填满整个主窗口&#xff0c;并跟随鼠标的拖动自动缩放 新建一个窗口&#xff0c;我想在这个窗口上放一个QWidget&#xff0c;并且这个QWidget能够布满整个窗口&#xff0c;还可以随着随鼠标的拖动自动缩放 1、首先给大家介绍一个好用的组件库&#xff1a;qt-mat…

lighthouse尘埃粒子计数器3100/3350参数资料

​​SOLAIR 3350集成了我们的超长寿命激光二极管技术传感器&#xff0c;可生产业界比较长的激光二极管寿命20年以上(基于连续24/7运行)。使用一个新的&#xff0c;更轻的延长寿命的电池和外部交流适配器&#xff0c;SOLAIR 3350更加便携。SOLAIR 3350具有业界最好的用户界面(UI…

springboot+java拍卖竞拍网站系统idea

书画拍卖网站系统的设计与实现的设计思想如下&#xff1a; Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行…

10个学习Python的理由以及Python的优势有哪些?

Python的由来 Python的创始人是吉多范罗苏姆&#xff0c;1989年他在阿姆斯特丹的CWI工作&#xff0c;圣诞节期间&#xff0c;吉多范罗苏姆为了打发圣诞节的无聊&#xff0c;决定开发一个新的脚本解释程序&#xff0c;作为ABC 语言的一种继承。之所以选择Python作为编程语言的名…

新星计划|记录安装Nodejs和HBuilderX搭建、部署微信小程序开发环境(一)

文章目录 1 前言2 注册小程序账号3 安装微信开发者工具4 安装Nodejs和HBuilderX4.1 windows用户安装Nodejs4.2 macos/linux用户安装Nodejs4.3 安装HBuilder X 5 创建项目5.1 新建一个项目5.2 进行基本配置 6 HBuilderX同步微信开发者工具6.1 打开服务端口6.2 调用微信开发者工具…

不能使用ChatGPT 试试基于2021模型的 Claude (原GPT团队二次创业产品)聊天机器人 更详细的解答

大家过程中遇到问题都可以私信我 注册方式&#xff0c;引用别人的&#xff1a;用不了chatgpt&#xff0c;试试Claude-Claude注册教程_大数据食铁兽的博客-CSDN博客 不过上面作者没有写坑&#xff0c;只支持少部分国家&#xff08;我选用的日本&#xff0c;Claude官网会提示你…

【HarmonyOS】这些HarmonyOS应用开发的问题你都了解吗?

【关键字】 HTTP请求、requests exceeds 100、DNS域名解析、屏幕分辨率、ArkTS/JS 【问题描述1】 HTTP多次请求之后出现请求异常如何解决&#xff1f; 描述&#xff1a;接口是正常的&#xff0c;http多次请求出现提示“The requested has been canceled or the number of re…

mysql高阶语句与连接存储

文章目录 一、mysql高阶语句1.按照关键字进行排序2.多字段排序3.对查询的结果进行分组4.限制结果条目5.设置别名&#xff08;alias----》as&#xff09; 二、mysql连接与存储1.、连接查询2.存储过程 总结 一、mysql高阶语句 1.按照关键字进行排序 ​使用select语句可以将需要…

古鱼、恐龙和大众,相逢在百度百科的“彩虹桥”

提起孩子的天性&#xff0c;我们会想到什么&#xff1f; 首先是好奇心。 如果没有好奇心和求知欲作为动力&#xff0c;人类不可能产生那些给社会带来巨大价值的发明创造。对于个人来说&#xff0c;带着对万物的好奇&#xff0c;了解大千世界的丰富多彩&#xff0c;以后无论遇到…