分布式日志系统logging初体验
背景
分布式日志系统,就是将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]。
单机安装
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]。
这里选择版本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中跟踪指定日志的功能。
参考
- OpenTelemetry Status
- 网易基于Filebeat的日志采集服务设计与实践
- flume数据采集_六大数据采集平台的架构对比分析
- k8s 部署filebeat sidecar模式
- 在K8S里使用filebeat作为sidecar收集nginx日志
- Implement Filebeat as SideCar to export logs to Elastic
- Filebeat overview
- 使用docker快速安装Kibana 7.5.1及查询配置
- 一篇文章搞懂filebeat(ELK)
- filebeat-input-log
- filebeat-sidecar-implementation
- 通过filebeat的modules搜集nginx日志
- 检索分析服务 Elasticsearch版