利用 Log-Pilot + Kafka + Elasticsearch + Kibana 搭建 kubernetes日志解决方案

利用 Log-Pilot + Kafka+Elasticsearch + Kibana 搭建 kubernetes日志解决方案

1、前提条件

已有kafka、elk、k8s集群,这3套集群搭建网上资料很多,这里不写,IP规划如下所示:

kafka集群
10.6.11.22:9092  10.6.11.23:9092  10.6.11.24:9092

ELK集群
10.6.11.25:9200 10.6.11.26:9200 10.6.11.27:9200

k8s集群
10.6.11.28(master01) 10.6.11.29(master02) 10.6.11.30(master03) 10.6.11.31(node01) 10.6.11.32(node02)

2、log-pilot介绍

log-Pilot 是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。

针对前面提出的日志采集难题,Log-Pilot 通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,Log-Pilot 具有自动发现机制,CheckPoint 及句柄保持的机制,自动日志数据打标,有效应对动态配置、日志重复和丢失以及日志源标记等问题。

目前 log-pilot 在 Github 完全开源,项目地址是 https://github.com/AliyunContainerService/log-pilot 。您可以深入了解更多实现原理。

3、日志收集系统架构

4、log-pilot部署

阿里提供的例子是把日志输出给es,这里因为使用了kafka,所以部署的yaml较官方的来说,有一点点的变化,如下所示:

apiVersion: extensions/v1beta1
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.5-filebeat #没用最新镜像,是因为为了收集多行日志,需要修改log-pilot的源码,最新的镜像测试修改完后,pod无法启动,所以就放弃了,这个版本测试没有问题,修改配置会在下面介绍
        env:
          - name: "LOGGING_OUTPUT"
            value: "kafka"        #输出到kafka,官方的例子是输出到es
          - name: "KAFKA_BROKERS" #和官方不一致的地方
            value: "10.6.11.22:9092;10.6.11.23:9092;10.6.11.24:9092" #kafka地址
          - 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

5、配置服务的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: accounting
  namespace: kube-ops
  labels:
    app: accounting
spec:
  minReadySeconds: 30
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  revisionHistoryLimit: 9
  selector:
    matchLabels:
      app: accounting
  replicas: 1
  template:
    metadata:
      labels:
        app: accounting
    spec:
      containers:
      - name: accounting
        image: test-accounting:v2
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: aliyun_logs_info  #当然如果你不想使用aliyun这个关键字,Log-Pilot 也提供了环境变量 PILOT_LOG_PREFIX可以指定自己的声明式日志配置前缀,比如 PILOT_LOG_PREFIX: "aliyun,custom",最好是和官方一致,省去多余的配置
          value: /data/home/logs/accounting/accounting.log   #需要收集的日志路径
        - name: aliyun_logs_info_tags                        #定义一个tag
          value: "topic=k8s-accounting-info"                 #kafka topic的名字,这个定义是关键,不定义这个,日志是无法输出到kafka内的
        volumeMounts:
        - name: accounting-log
          mountPath: /data/home/logs/accounting
      volumes:
      - name: accounting-log
        emptyDir: {}

6、利用logstash消费kafka内的数据

filter {
       if [topic] =~ "k8s-accounting-info" {

          mutate {
                remove_field => ["input","beat","prospector","logmsg","log","thread","class"]
            }
      }
}

output {
       if [topic] =~ "k8s-accounting-info" {
          elasticsearch {
                 hosts => ["10.6.11.25:9200","10.6.11.26:9200","10.6.11.27:9200"]
                 user => "elastic"
                 password => "密码"
                 index => "k8s-accounting-info-%{+YYYY.MM.dd}"  #按日期生成索引
          }
        }
}

7、修改log-pilot源码使其可以收集多行日志(以日期开头,刑如2020-02-29)

7.1 拉取v0.9.5这个tag的代码

git clone https://github.com/AliyunContainerService/log-pilot.git
cd log-pilot
git tag
git checkout v0.9.5  #指定v0.9.5这个版本

7.2 修改filebeat模板

vim log-pilot/assets/filebeat/filebeat.tpl

{{range .configList}}
- type: log
  enabled: true
  paths:
      - {{ .HostDir }}/{{ .File }}
  multiline.pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' #新增正则条件,以日期开头
  multiline.negate: true                                           #新增
  multiline.match: after                                           #新增
  multiline.max_lines: 10000                                       #新增
  scan_frequency: 10s
  fields_under_root: true
  {{if .Stdout}}
  docker-json: true
  {{end}}
  {{if eq .Format "json"}}
  json.keys_under_root: true
  {{end}}
  fields:
      {{range $key, $value := .Tags}}
      {{ $key }}: {{ $value }}
      {{end}}
      {{range $key, $value := $.container}}
      {{ $key }}: {{ $value }}
      {{end}}
  tail_files: false
  close_inactive: 2h
  close_eof: false
  close_removed: true
  clean_removed: true
  close_renamed: false

{{end}}

7.3 重新打包镜像

cd log-pilot/ && ./build-image.sh

打包成功后,镜像打tag ,并push到私有仓库
docker tag 原镜像名称  新镜像名称
docker push 新镜像名称

8 、最后展示一张kibana收集日志的图例

9、参考博客

https://help.aliyun.com/document_detail/86552.html
https://github.com/AliyunContainerService/log-pilot/issues/101
https://www.iyunw.cn/archives/k8s-tong-guo-log-pilot-cai-ji-ying-yong-ri-zhi-ding-zhi-hua-tomcat-duo-xing/

原文地址:https://www.cnblogs.com/uglyliu/p/12382214.html

时间: 2024-08-13 18:50:06

利用 Log-Pilot + Kafka + Elasticsearch + Kibana 搭建 kubernetes日志解决方案的相关文章

利用 log-pilot + elasticsearch + kibana 搭建 kubernetes 日志解决方案

开发者在面对 kubernetes 分布式集群下的日志需求时,常常会感到头疼,既有容器自身特性的原因,也有现有日志采集工具的桎梏,主要包括: 容器本身特性: 采集目标多:容器本身的特性导致采集目标多,需要采集容器内日志.容器 stdout.对于容器内部的文件日志采集,现在并没有一个很好的工具能够去动态发现采集.针对每种数据源都有对应的采集软件,但缺乏一站式的工具. 弹性伸缩难:kubernetes 是分布式的集群,服务.环境的弹性伸缩对于日志采集带来了很大的困难,无法像传统虚拟机环境下那样,事先

用ElasticSearch,LogStash,Kibana搭建实时日志收集系统

用ElasticSearch,LogStash,Kibana搭建实时日志收集系统 介绍 这套系统,logstash负责收集处理日志文件内容存储到elasticsearch搜索引擎数据库中.kibana负责查询elasticsearch并在web中展示. logstash收集进程收获日志文件内容后,先输出到redis中缓存,还有一logstash处理进程从redis中读出并转存到elasticsearch中,以解决读快写慢速度不一致问题. 官方在线文档:https://www.elastic.co

elasticsearch+kibana搭建

elasticsearch+kibana搭建: elasticsearch: Elasticsearch是一个分布式搜索服务 下载网址: https://www.elastic.co/downloads https://www.elastic.co/downloads/past-releases/elasticsearch-5-0-2 yum install java-1.8.0-openjdk rpm -i elasticsearc-6.2.1-x86_64.rpm service elast

再次升级!阿里云Kubernetes日志解决方案

摘要: 今天阿里云Kubernetes日志解决方案再次升级,为您带来以下改进: 1.极致部署体验:只需一条命令一个参数即可完成整个K8S集群的日志解决方案部署. 2.支持更多配置方式:除原生控制台.SDK配置方式外,支持通过CRD方式进行配置(kubectl.控制台.K8S openapi). 背景 针对K8S日志采集存在的采集目标多.弹性伸缩难.运维成本大.侵入性高.采集性能低等问题,在18年2月份日志服务和容器服务团队一起发布了阿里云Kubernetes日志解决方案.1分钟内即可完成整个集群

GlusterFS + lagstash + elasticsearch + kibana 3 + redis日志收集存储系统部署 01

因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使用情况等续 一,glusterfs分布式文件系统部署: 说明: 公司想做网站业务日志及系统日志统一收集和管理,经过对mfs, fastdfs 等分布式文件系统的调研,最后选择了 glusterfs,因为Gluster具有高扩展性.高性能.高可用性.可横向扩展的弹性特点,无元数据服务器设计使glust

[Big Data - ELK] ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

ELK平台介绍 在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自: http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这

ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这样是不是感觉很繁琐和效率低下.当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总. 集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事

用Kibana+Logstash+Elasticsearch快速搭建实时日志查询 收集与分析系统

安装环境 先看看都需要安装什么软件包ruby 运行Kibana 必须, rubygems 安装ruby扩展必须 bundler 功能类似于yum JDK 运行java程序必须 redis 用来处理日志队列 logstash 收集.过滤日志 ElasticSearch 全文搜索服务(logstash集成了一个) kibana 页面展示 192.168.18.240 logstash index,kibana,JDK192.168.18.241 logstash agent,JDK192.168.1

syslog+rsyslog+logstash+elasticsearch+kibana搭建日志收集

最近rancher平台上docker日志收集捣腾挺久的,尤其在配置上,特写下记录 Unix/Linux系统中的大部分日志都是通过一种叫做syslog的机制产生和维护的.syslog是一种标准的协议,分为客户端和服务器端,客户端是产生日志消息的一方,而服务器端负责接收客户端发送来的日志消息,并做出保存到特定的日志文件中或者其他方式的处理. ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的