k8s容器日志收集方案

news2024/9/25 11:17:20

背景
由于以下容器本身特性和现有日志采集工具的缺陷,开发者在收集Kubernetes分布式集群日志时常常遇到困扰:

容器本身特性:
    采集目标多:容器本身的特性导致采集目标多,需要采集容器内日志、容器stdout。对于容器内部的文件日志采集,现在并没有一个很好的工具能够动态发现采集。针对每种数据源都有对应的采集软件,但缺乏一站式的工具。
    弹性伸缩难:Kubernetes是分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,无法像传统虚拟机环境下那样,事先配置好日志的采集路径等信息,采集的动态性以及数据完整性是非常大的挑战。
现有日志工具的一些缺陷:
    缺乏动态配置的能力。目前的采集工具都需要事先手动配置好日志采集方式和路径等信息,因为它无法自动感知到容器的生命周期变化或者动态漂移,所以它无法动态地去配置。
    日志采集重复或丢失的问题。因为现在的一些采集工具通过tail的方式进行日志采集,这样可能导致日志丢失,比如采集工具在重启的过程中,而应用依然在写日志,那么就有可能导致这个窗口期的日志丢失。对于这种情况一般保守的做法默认往前多采集1 M日志或2 M的日志,那么这就又会可能引起日志采集重复的问题。
    未明确标记日志源。因为一个应用可能有很多个容器,输出的应用日志也是一样的,那么当将所有应用日志收集到统一日志存储后端时,在搜索日志的时候,您无法明确这条日志具体是哪一个节点上的哪一个应用容器产生的。

Log-pilot介绍
   Log-pilot是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。
   针对前面提出的日志采集难题,Log-pilot通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,Log-pilot具有自动发现机制、CheckPoint及句柄保持的机制、自动日志数据打标、有效应对动态配置、日志重复和丢失以及日志源标记等问题。
基于阿里云的开源日志搜集方案,并且使用daemonset的方式部署到node节点上用来自定义搜集控制台或者固定目录下的日志文件
本次的yaml是自定义输出到后端到kafka然后由logstash过滤以后发送到es中,kibana直接读es的索引
注:在阿里云上开通阿里云sls日志收集与arms应用链路监控,
    会导致自定义安装的log-polit日志收集无法收集到日志,
    默认的阿里云自定义前缀是aliyun_logs,
    会导致冲突,需要自定义 - name: PILOT_LOG_PREFIX 日志收集格式的前缀可以解决。

架构图

 

log-pilot安装

#在k8s集群內以daemonset的方式来进行部署
#注:在阿里云上开通阿里云sls日志收集与arms应用链路监控,
	会导致自定义安装的log-polit日志收集无法收集到日志,
	默认的阿里云自定义前缀是aliyun_logs,
	会导致冲突,需要自定义 - name: PILOT_LOG_PREFIX 日志收集格式的前缀可以解决。


apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-pilot
  labels:
    k8s-app: log-pilot
  namespace: kube-system
spec:
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: log-pilot
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: log-pilot
        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat
        env:
          - name: "LOGGING_OUTPUT"
            value: "kafka"
          - name: PILOT_LOG_PREFIX
            value: ailieyun
          - name: "KAFKA_BROKERS"
            value: "192.168.200.100:9092,192.168.200.101:9092,192.168.200.102:9092"
          - name: "NODE_NAME"
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
        volumeMounts:
        - name: sock
          mountPath: /var/run/docker.sock
        - name: logs
          mountPath: /var/log/filebeat
        - name: state
          mountPath: /var/lib/filebeat
        - name: root
          mountPath: /host
          readOnly: true
        - name: localtime
          mountPath: /etc/localtime
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN
      terminationGracePeriodSeconds: 30
      volumes:
      - name: sock
        hostPath:
          path: /var/run/docker.sock
      - name: logs
        hostPath:
          path: /var/log/filebeat
      - name: state
        hostPath:
          path: /var/lib/filebeat
      - name: root
        hostPath:
          path: /
      - name: localtime
        hostPath:
          path: /etc/localtime

 安装zookeeper和kafka集群 

#zookeeper集群
#以其中一台机器为例
tar -zxvf zookeeper-3.4.14.tar.gz -C /data/service/
cd /data/service/zookeeper-3.4.14/ && cp conf/zoo_sample.cfg conf/zoo.cfg
查看配置:
cat /data/service/zookeeper-3.4.14/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/data/zookeeper
clientPort=2181
server.1=192.168.1.7:2888:3888
server.2=192.168.1.6:2888:3888
server.3=192.168.1.5:2888:3888
添加:
echo 1 > /data/data/zookeeper/myid
其他机器:
echo 2 > /data/data/zookeeper/myid
echo 3 > /data/data/zookeeper/myid
 
启动: /data/service/zookeeper-3.4.14/bin/zkServer.sh start
查看状态: /data/service/zookeeper-3.4.14/bin/zkServer.sh status
 
#kafka集群
tar -zxvf kafka_2.12-2.0.1.tgz -C /data/service/
#修改zookeeper链接地址:
/data/service/kafka_2.12-2.0.1/config/server.properties
zookeeper.connect=192.168.1.7:2181,192.168.1.6:2181,192.168.1.5:2181

安装logstash  

#logstash集群
tar -zxvf logstash-7.7.1.tar.gz -C /data/service/
cd /data/service/logstash-7.7.1
cat log-polit.conf
input {
  kafka {
    bootstrap_servers=>"192.168.2.137:9092,192.168.2.138:9092,192.168.2.139:9092"
    topics_pattern => "logs.*"
    client_id => "kafka_client_one"
    group_id => "logstash"
    codec => "json"
  }
}
 
filter {
  mutate {
   remove_field => ["input","beat","prospector","@version","offset"]
  }
}
 
output {
  if "nginx-access" in [tags] {
    elasticsearch {
      hosts => ["192.168.1.5:9200","192.168.1.6:9200","192.168.1.7:9200"]
      index => "%{[domain]}-%{+YYYY-MM-dd}"
    }
  } else {
    elasticsearch {
      hosts => ["192.168.1.5:9200","192.168.1.6:9200","192.168.1.7:9200"]
      index => "%{[topic]}-%{+YYYY-MM-dd}"
    }
  }
}
#cd /data/app/logstash-7.7.1 && nohup ./bin/logstash -f log-polit.conf &

es集群安装 

#es集群
tar -zxvf elasticsearch-7.7.1-linux-x86_64.tar.gz -C /data/service/
cd /data/service/elasticsearch-7.7.1
#cat elasticsearch.yml
cluster.name: kkb-logs
node.name: kkb-sys-esmaster-001
path.data: /data/data/elasticsearch/data
path.logs: /data/data/elasticsearch/logs
bootstrap.memory_lock: true
network.host: 192.168.23.30
action.auto_create_index: true
http.port: 9200
discovery.seed_hosts: ["192.168.1.18", "192.168.1.19"]
cluster.initial_master_nodes: ["192.168.1.18", "192.168.1.19"]
node.master: true
node.data: false
#设置堆内存大小
# cat jvm.options|grep "Xm"
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms6g
-Xmx6g
 
#cd /data/app/elasticsearch && ./bin/elasticsearch -d

kibana集群 

此处应该为3台机器,由于是test,所以只上了一台
rpm -ivh kibana-7.7.1-x86_64.rpm
cat /etc/kibana/kibana.yml |grep -Ev "^#|^$"
server.port: 5601
xpack.reporting.csv.maxSizeBytes: 2097152000
server.host: "192.168.1.21"
server.name: "192.168.1.21"
elasticsearch.hosts: ["http://192.168.1.18:9200","http://192.168.1.19:9200"]
elasticsearch.requestTimeout: 300000

 k8s集群日志接入

#nginx deployment
#- name: ailieyun_logs_logs-plat-file-console
#  value: "stdout"
#- name: ailieyun_logs_logs-plat-file-console_ttl
#  value: "3"
#这两行会自动在kafka集群中创建topic
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: ng-demo-1
  name: ng-demo-1
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  replicas: 5
  selector:
    matchLabels:
      run: java-demo-1
  template:
    metadata:
      labels:
        run: ng-demo-1
    spec:
      containers:
      - image:  nginx:latest
        name: ng-demo-1
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        env:
          - name: ailieyun_logs_logs-java-demo
            value: "stdout"
          - name: ailieyun_logs_logs-java-demo_ttl
            value: "3"

#创建好deploy以后进到容器里while true;do curl 127.0.0.1;sleep 1 ;done
#然后手动执行数据消费
./kafka-console-consumer.sh --bootstrap-server 192.168.1.5:9092,192.168.1.6:9092,192.168.1.7:9092   --topic logs-java-demo
#然后看到下面到图即视为任务收集成功

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

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

相关文章

三分钟带你了解音频转文字哪个好用

在数字世界的角落里,有一项神奇的技术——音频转文字。它隐藏着巨大的力量和惊人的能力。它如同一位神奇的文字解码师,能够将听觉的旋律转化为视觉的符号,让语言的美妙之音在屏幕上跃然纸上。接下来,让我带你进入这个充满奇迹的数…

常用程序分段,编译流程

实际这些概念也要根据不同编译器有些微的区分,常用的结构模型应该就是LINUX程序分段以及GNU编译链的编译留成。 先看编译流程 程序分段: 堆存储和栈存储的区别 堆和栈的区别主要有五大点,分别是: 1、申请方式的不同。栈由系统自动分配&…

tinkerCAD案例:13.Ruler - Cm 标尺 - 厘米

tinkerCAD案例:13.Ruler - Cm 标尺 - 厘米 原文 While it’s fun to create things at any size you wish, sometimes you need to measure an exact distance. In this lesson you will learn to create an accurate ruler that measures centimeters. 虽然创建任…

六、代理模式

文章目录 一、代理模式1、代理模式的好处和缺点1.1 代理模式理解加深 一、代理模式 为什么要学习代理模式? 代理模式是Spring AOP 以及 Spring MVC 的底层!!并且还是 JAVA 的23种设计模式之一!! 代理模式的分类&#…

【TI毫米波雷达笔记】IWR6843AOP工程模板创建 cannot find file “libsleep_xwr68xx.aer4f“等解决方案

【TI毫米波雷达笔记】IWR6843AOP工程模板 cannot find file “libsleep_xwr68xx.aer4f” 解决方案 我在建立工程时 发现了一个问题 参考: blog.csdn.net/qq_16660871/article/details/126246572报错为 cannot find file "libsleep_xwr68xx.aer4f"最后检…

【Linux】深入理解缓冲区

目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里 手动设计一个用户层缓冲区 什么是缓冲区 缓冲区本质上一块内存区域,用来保存临时数据。缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。 …

Nodejs 第一章(介绍)

概述 nodejs 并不是JavaScript应用,也不是编程语言,因为编程语言使用的JavaScript,Nodejs是 JavaScript的运行时。 Nodejs是构建在V8引擎之上的,V8引擎是由C/C编写的,因此我们的JavaSCript代码需要由C/C转化后再执行。 NodeJs 使…

看了这篇文章,我也会用grid布局了

grid网格布局 网格布局是由一系列水平及垂直的线构成的一种布局模式,使用网格,我们能够将设计元素进行排列,帮助我们设计一系列具有固定位置以及宽度的元素的页面,使我们的网站页面更加统一。 它将网页划分成一个个网格&#xff…

Cilium系列-6-从地址伪装从IPtables切换为eBPF

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

探索大型语言模型的开源人工智能基础设施:北京开源AI Meetup回顾

原文参见Explore open source AI Infra for Large Language Models: Highlights from the Open Source AI Meetup Beijing | Cloud Native Computing Foundation 背景介绍: 最近,在 ChatGPT 的成功推动下,大型语言模型及其应用程序的流行度激…

递归实现 组合问题+排列问题(DFS)

递归不是循环,递归利用了系统栈,只要是函数都会被系统管理。当执行到函数地址入口时就会为函数在系统栈上分配一块内存。当函数在自己内部再次调用自己,那么系统又会给此时调用的函数再次分配内存,结果说就是层层调用。递归就是这…

【硬件设计】数字电路基础--概念、分类与基本运算

【硬件设计】数字电路基础--概念、分类与基本运算 一、数字电路基本概念二、数字电路分类(了解)三、数制四、数字电路中的二级管与三级管4.1 二级管4.2 三级管 五、逻辑运算5.1 逻辑与5.2 逻辑或5.3 非5.4 符合逻辑电路5.5 基本公式5.6 基本规则5.7 逻辑…

通过sql文件快速生成数据库设计文档

1.如果是springboot的java项目直接引入包即可&#xff0c;其他情况可以创建一个java项目然后引入包。 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependenc…

什么是小红书内容种草,品牌内容营销分析

依托于现在各种社交类平台的崛起&#xff0c;如红薯、d音、头条等&#xff0c;越来越多精彩的内容浮现出来。那么在现今时代下&#xff0c;什么是小红书内容种草&#xff0c;品牌内容营销分析&#xff01; 一、什么是小红书内容种草 1、内容种草的核心是内容 所谓的种草&#x…

SpringBoot第8讲:SpringBoot添加Logback日志

SpringBoot第8讲&#xff1a;SpringBoot添加Logback日志 本文是SpringBoot第8讲&#xff0c;对SpringBoot添加Logback日志。SpringBoot开发中如何选用日志框架呢&#xff1f; 出于性能等原因&#xff0c;Logback 目前是springboot应用日志的标配&#xff1b; 当然有时候在生产环…

身份证真伪一键验证API接口 - 通过OCR技术快速识别和验证身份证信息

身份证是我们日常生活中必不可少的证件&#xff0c;但是在实际使用中&#xff0c;我们也会遇到很多问题&#xff0c;例如身份证是否真实有效&#xff0c;身份证信息是否准确等等。这时候我们就需要用到一种能够快速识别和验证身份证信息的技术——OCR&#xff08;Optical Chara…

python怎么实现tcp和udp连接

目录 什么是tcp连接 什么是udp连接 python怎么实现tcp和udp连接 什么是tcp连接 TCP&#xff08;Transmission Control Protocol&#xff09;连接是一种网络连接&#xff0c;它提供了可靠的、面向连接的数据传输服务。 在TCP连接中&#xff0c;通信的两端&#xff08;客户端和…

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器

文章目录 01 文字写作技能的革新&#xff0c;各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持&#xff0c;文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…

【机器学习】机器学习中的“本体”概念

一、说明 在机器学习中&#xff0c;本体越来越多地用于提供基于相似性分析和场景知识的 ML 模型。 在传统的基于标签的定义中&#xff0c;对象往往是孤立的&#xff0c;可扩展性差&#xff0c;存在重复的可能性&#xff0c;对象之间的关系无法体现。在基于本体的定义中&#xf…

​语言模型输出端共享Embedding的重新探索

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 预训练刚兴起时&#xff0c;在语言模型的输出端重用 Embedding 权重是很常见的操作&#xff0c;比如 BERT、第一版的 T5、早期的 GPT&#xff0c;都使用了这个操作&#xff0c;这是因为当模型…