zoukankan      html  css  js  c++  java
  • 利用 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、日志收集系统架构
    img

    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/
  • 相关阅读:
    自学MongoDB(1)
    小心心
    js文件处理File
    jquery图片滚动jquery.scrlooAnimation.js
    jquery图片滚动normalizy.css
    jquery图片滚动demo.css
    jquery图片滚动animate.css
    jquery图片滚动
    C# 数组与集合的区别
    SQL server 批量插入和更新数据
  • 原文地址:https://www.cnblogs.com/uglyliu/p/12382214.html
Copyright © 2011-2022 走看看