Dokcer手工操作步骤

下面的操作在一台安装了docker的虚拟机上进行。目前Elastic Search产品栈的版本为6.4.3。

elastic search

启动elastic search:

docker run -d -p 9200:9200 -p 9300:9300 \
    -e "discovery.type=single-node" \
    docker.elastic.co/elasticsearch/elasticsearch:6.4.3

然后可以访问浏览器看下es是否启动正常:http://<IP地址>:9200。如果把数据挂载到外部时,外部数据目录要修改成1000用户可读写,或者是chmod 777

filebeat

使用filebeat来收集数据,filebeat是go语言编写,本身10M大小,启动后占20M内存,可以在宿主主机启动它,并当作一个系统服务。在k8s集群中,可以将它放到容器中,并把系统日志挂载到容器内部。

实验中,在宿主主机启动filebeat收集数据,所以从官方网址先下载filebeat并解压,执行:

./filebeat -e -c filebeat.yml

filebeat的关键是配置文件filebeat.yml,有两点要设置:

  1. 设置es的服务地址,即es 9200的host地址,根据实际情况修改:

    output.elasticsearch:
       # Array of hosts to connect to.
       hosts: ["192.168.56.106:9200"]
  2. 设置采集日志的位置和格式。这里要采集的数据是docker的日志,docker会将所有容器的控制台输出的日志按行收集为json格式并存在/var/lib/docker/<docker标识>/<docker标识>_json.log文件中。filebeat提供了插件,将docker的json日志解析为原格式日志,同时将单行合并为多行,具体的配置如下:

- type: docker 
  containers.ids:
    - '*'
  multiline.pattern: '\d{2}:\d{2}:\d{2}.{1}\d{3}'
  multiline.negate: true
  multiline.match: after
  processors:
    - add_docker_metadata: ~

特别说明一下,multiline.pattern是用来解决多行日志的问题。它是通过正则表达式的方式,告诉filebeat,什么格式是一行的起始。考虑到不同语言日志的适配性,包括java、go、系统日志等,分析之后发现,在日志的第一行,它们都有时间,但日期的格式比较多样化,故取时间作为一行的起始正则。

kibana

docker run -d -p 5601:5601 -e ELASTICSEARCH_URL=http://<ip>:9200 \
    docker.elastic.co/kibana/kibana:6.4.3

启动之后访问机器的5601,选择index后就可以搜索了

效果:

文档更新时间: 2020-07-28 15:47   作者:nick