分布式日志系统logging初体验

  |   0 评论   |   0 浏览

背景

分布式日志系统,就是将kubernetes中的应用的日志,实时采集到日志平台中的系统。

形象的如下图所示[13]

OpenTelemetry中的Logging仍然在Draft阶段[1],所以本文仍然采用传统方案。

传统方案使用最广的是ELK (ElasticSearch + LogStach + Kibana),又被业务戏称为乞丐版本的Splunk。

ELK中的采集端的工具有[2-3]几种,各有特色,如下。

  • LogStach:JRuby编写,依然JVM。
  • Apache Flume:JRuby编写,依然JVM。
  • Fluentd:C/Ruby开发,已在CNCF毕业。
  • FileBeat:Go开发,由Elastic公司开发,用来替换LogStach。

环境准备

elasticsearch 7.17.0

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.0
docker run --name elasticsearch -p 9200:9200 -p 9300:9300  -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d docker.elastic.co/elasticsearch/elasticsearch:7.17.0

确认启动成功

> curl "localhost:9200/"
{
  "name" : "754ad553d528",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "zNmsFFALQoG2fyXj1sK8RQ",
  "version" : {
    "number" : "7.17.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "bee86328705acaa9a6daede7140defd4d9ec56bd",
    "build_date" : "2022-01-28T08:36:04.875279988Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

kibana 7.17.0

kibana是图形化工具,安装过程参考[8]

准备配置文件

kibana.xml,内容如下:

server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.31.100:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
kibana.index: ".kibana"

如果是kibana 6 的话,写法如下:

server.name: kibana
server.host: "0"
elasticsearch.url: "http://192.168.31.100:9200"
xpack.monitoring.ui.container.elasticsearch.enabled: true

安装启动

这里kibana的版本要与elasticsearch保持一致。

docker pull kibana:7.17.0
docker run -d -p 5601:5601 --name kibana --link elasticsearch:elasticsearch  -v D:\docker\kibana\kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.17.0

使用浏览器打开

http://localhost:5601/

FileBeat初体验

本文首先体验FileBeat,由于其使用Go来开发,并且为Elastic官方出品。

FileBeat介绍

FileBeat是一个轻量级的文件传输工具,通过监控本地的文件或者目录,收集日志事件,然后转发到指定的位置如ElasticSearch或者LogStach等做索引。

在FileBeat启动的时候,对于每一个监控文件,会启动一个harvester实例来监听,将监听到的文件发送给libbeat类。libbeat对事件进行聚合,然后发送到配置文件中指定的output [7]。

Beats design

单机安装

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.0-linux-x86_64.tar.gz
tar xzvf filebeat-7.17.0-linux-x86_64.tar.gz

Sidecar方式

下面做一个实验,通过FileBeat来实时采集nginx的日志。使用sidecar的方式,将FileBeat和nginx这两个container,打包到同一个pod中。

可以用一个图来形象的表示,图来自[5]。

Image-44-1024x729.png

这里选择版本6.8.23,没有使用7.17.0。本地的elasticsearch版本为6.8.13。

docker pull elastic/filebeat:7.17.0
docker pull elastic/filebeat:6.8.23

参考[4],先编写一个configmap,再编写一个deployment,最后编写一个service对外暴露服务。

configmap

编辑文件configmap-filebeat.yml,内容如下[11-12]:

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-configmap
data:
  filebeat.yml: |
    filebeat:
      config:
        modules:
          path: /usr/share/filebeat/modules.d/*.yml
          reload:
            enabled: true
      modules:
      - module: nginx
        access:
          var.paths: ["/var/log/nginx/access.log*"]
        error:
          var.paths: ["/var/log/nginx/error.log*"]

    setup.template.settings:
      index.number_of_shards: 1
      #index.codec: best_compression
      #_source.enabled: false
    setup.ilm.enabled: false
    setup.template:
      name: "filebeat-nginx"
      pattern: "filebeat-nginx-*"
    
    output:
      elasticsearch:
        hosts: ["192.168.31.100:9200"]
        index: "filebeat-nginx-%{[agent.version]}-%{+yyyy.MM.dd}"

    # 打开filebeat自己的日志,供调试用
    logging:
      level: info
      to_files: true
      files:
        path: /usr/share/filebeat/logs
        name: filebeat
        keepfiles: 7
        permissions: 0644

更多的配置文件见[9-10]。其中使用了filebeat nginx module的方式,更多可以见[12]。

创建 configmap,命令如下:

kubectl apply -f configmap-filebeat.yml

deployment

编写一个kubernetes的deployment的yaml配置文件,文件名deployment-nginx-filebeat.yaml,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-filebeat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-filebeat
  template:
    metadata:
      labels:
        app: nginx-filebeat
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports: 
        - containerPort: 80
        volumeMounts:
        - name: nginx-logs #日志同时挂载在nginx和filebeat中
          mountPath: /var/log/nginx
      - image: elastic/filebeat:7.17.0
        name: filebeat
        volumeMounts:
        - name: nginx-logs #日志同时挂载在nginx和filebeat中
          mountPath: /var/log/nginx/
        - name: filebeat-config
          mountPath: /usr/share/filebeat/filebeat.yml
          subPath: filebeat.yml 
      volumes:
      - name: nginx-logs
      - name: filebeat-config
        configMap:
          name: filebeat-configmap
          items:
            - key: filebeat.yml
              path: filebeat.yml

创建deployment,如下:

kubectl apply -f deployment-nginx-filebeat.yaml

service

编写文件 service-nginx.yaml,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx-filebeat

生效之

kubectl apply -f service-nginx.yaml

查看ElasticSearch中的数据

$ curl -s "192.168.31.100:9200/_cat/indices" | grep nginx
yellow open nginx_error-6.8.23-2022.02                              O-xqzwBvQtuf1qg1zMOmeg 5 1 14 0 54.2kb 54.2kb
yellow open nginx_access-6.8.23-2022.02                             jNABIVvbRRuy-DcDVc9w2Q 5 1  8 0 53.5kb 53.5kb
$ curl -s "192.168.31.100:9200/nginx_access-6.8.23-2022.02/_search?pretty=true"

随记

sidecar理解

上面的nginx-filebeat中,这两个容器是分别独立运行的。这样可以优雅的保证两个容器中的文件不会相互影响,可以独立安全运行。

此外,通过volumes挂载的方式,实现了不同容器中的指定路径的共享,即nginx中的/var/log/nginx路径下的内容,在filebeat中的/log路径下是可见的。来实现filebeat中跟踪指定日志的功能。

参考

  1. OpenTelemetry Status
  2. 网易基于Filebeat的日志采集服务设计与实践
  3. flume数据采集_六大数据采集平台的架构对比分析
  4. k8s 部署filebeat sidecar模式
  5. 在K8S里使用filebeat作为sidecar收集nginx日志
  6. Implement Filebeat as SideCar to export logs to Elastic
  7. Filebeat overview
  8. 使用docker快速安装Kibana 7.5.1及查询配置
  9. 一篇文章搞懂filebeat(ELK)
  10. filebeat-input-log
  11. filebeat-sidecar-implementation
  12. 通过filebeat的modules搜集nginx日志
  13. 检索分析服务 Elasticsearch版