k8s容器日志收集方案

背景
由于以下容器本身特性和现有日志采集工具的缺陷,开发者在收集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
#然后看到下面到图即视为任务收集成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验六 调度器-实验部分

目录 一、知识点 1.进程调度器设计的目标 1.1.进程的生命周期 1.2.用户进程创建与内核进程创建 1.3.进程调度器的设计目标 2.ucore 调度器框架 2.1.调度初始化 2.2.调度过程 2.2.1.调度整体流程 2.2.2.设计考虑要点 2.2.3.数据结构 2.2.4.调度框架应与调度算法无关…

Zabbix分布式监控快速入门

目录 1 Zabbix简介1.1 软件架构1.2 版本选择1.3 功能特性 2 安装与部署2.1 时间同步需求2.2 下载仓库官方源2.3 Zabbix-Server服务端的安装2.3.1 安装MySQL2.3.1.1 创建Zabbix数据库2.3.1.2 导入Zabbix库的数据文件 2.3.2 配置zabbix_server.conf2.3.3 开启Zabbix-Server服务2.…

ElementUI Select选择器如何根据value值显示对应的label

修改前效果如图所示&#xff0c;数据值状态应显示为可用&#xff0c;但实际上仅显示了状态码1&#xff0c;并没有显示其对应的状态信息。在排查了数据类型对应关系问题后&#xff0c;并没有产生实质性影响&#xff0c;只好对代码进行了如下修改。 修改前代码&#xff1a; <…

微服务划分的原则

微服务的划分 微服务的划分要保证的原则 单一职责原则 1、耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密&#xff0c;其耦合性就越强&#xff0c;模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及…

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…

最优除法(力扣)数学 JAVA

给定一正整数数组 nums&#xff0c;nums 中的相邻整数将进行浮点除法。例如&#xff0c; [2,3,4] -> 2 / 3 / 4 。 例如&#xff0c;nums [2,3,4]&#xff0c;我们将求表达式的值 “2/3/4”。 但是&#xff0c;你可以在任意位置添加任意数目的括号&#xff0c;来改变算数的…

Git的安装以及本地仓库的创建和配置

文章目录 1.Git简介2.安装Git2.1在Centos上安装git2.2 在ubuntu上安装git 3.创建本地仓库4.配置本地仓库 1.Git简介 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理文件的更改。它可以记录和存储代码的所有历史版本&#xff0c;并可以方便地进行分支管理、合并代码和协…

【自动化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…

VLAN原理(Virtual LAN 虚拟局域网)

VLAN&#xff08;Virtual LAN 虚拟局域网&#xff09; 1、广播/广播域 2、广播的危害&#xff1a;增加网络/终端负担&#xff0c;传播病毒&#xff0c; 3、如何控制广播&#xff1f;&#xff1f; ​ 控制广播隔离广播域 ​ 路由器物理隔离广播 ​ 路由器隔离广播缺点&…

机器学习深度学习——多层感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——感知机 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 上一节…

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段&#xff0c;VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用&#xff0c;每天都有不少人通过VR全景展示来了解酒店的设施环境&#xff0c;而酒店也可以借此机会&#xff0c;详细展示自身优势&#xff0c;更大范围吸引顾客。 VR酒店拥有真实、立体的全…

互斥量 的初识

Q: 什么是互斥量&#xff1f; A: 在多数情况下&#xff0c;互斥型信号量和二值型信号量非常相似&#xff0c;但是从功能上二值型信号量用于同步&#xff0c; 而互斥型信号量用于资源保护。 互斥型信号量和二值型信号量还有一个最大的区别&#xff0c;互斥型信号量可以有效解决…

分布式理论:CAP理论 BASE理论

文章目录 1. CAP定理1.1 一致性1.2 可用性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题&#xff0c;需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点&#xff0c;得到的…

Sentinel dashboard的使用;Nacos保存Sentinel限流规则

Sentinel dashboard的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用Sentinel 容灾中心的使用 参考文档 Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 限流结果 下载sentinel-dashboard github地址&#xff1a;Sentinel/sentinel-dashboar…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;和DI&#xff08;Dependency Injection&#xff09;是密切相关的概念。 IOC&#xff08;控制反转&a…

【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发

一、前言 关于 Cloud Studio 全在线云端开发 用户只需要浏览器就可以访问和使用Cloud Studio,无需在本地配置开发环境。Cloud Studio将开发环境部署在云服务器上,用户可以随时随地进行开发。多语言支持 Cloud Studio支持常见的开发语言,如Node.js、Python、Java、PHP等。用户…

Arcgis画等高线

目录 数据准备绘制等高线3D等高线今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式,它通过等高线将地形起伏展现得一目了然,不仅美观,还能提供重要的地形信息。 数据准备 在开始之前,确保已经准备好了高程数据,它通常以栅格数…

11、PHP面向对象1

1、PHP的面向对象与其他语言类似&#xff0c;但也有不同。 PHP访问成员变量时&#xff0c;需要用“->”&#xff0c;而不能用“.”&#xff0c;访问成员函数时&#xff0c;需要用“->”&#xff0c;而不能用“.”。操作符“::”可以在没有任何声明实例的情况下访问类中的…

使用LangChain构建问答聊天机器人案例实战(二)

使用LangChain构建问答聊天机器人案例实战 逐行解读和验证全生命周期Prompting 现在我们使用GPT-4作为语言模型的驱动力,这个模型将成为整个应用程序的引擎,驱动整个应用程序运行,同时,应用程序也是基于Cpython去实现的,如图14-8所示,Pyodide是CPython到WebAssembly/Emsc…

jmeter实现webservice接口测试

其实可以用jmeter两种sampler进行webservice的测试&#xff1a; 1、SOAP/XML-RPC Request(但是在jmeter3.2以后版本中已经取消了这个取样器) 2、HTTP请求 下面分别介绍两种方式 一、首先需要使用soupUI工具抓取webservice接口的部分需要的信息。 1、新建项目 2、新建成功的…