Docker 是一套平台即服务(PaaS)产品,它使用操作系统级虚拟化来以称为容器的软件包交付软件。容器彼此隔离,并将它们自己的软件,库和配置文件捆绑在一起; 他们可以通过定义明确的渠道相互交流。所有容器都由单个操作系统内核运行,因此比虚拟机更轻便。在目前的很多IT的架构中,Docker 的使用越来越普及。这很好,但是一旦有多个容器散布在多个节点上,就需要找到一种方法来跟踪其运行状况,存储,CPU 和内存使用情况,网络负载等。

要跟踪这些指标,你需要一个有效的监视解决方案和一些后端存储,以保留容器数据以进行后续分析和处理。 在生产中管理数千个 Docker 容器使得Docker容器监视是我们集群管理流程的重要补充。Elastic Stack 提供了很方便的功能来供我们对 Docker 进行监控。

在今天的文章中,我们来讲述如何对 Docker 里的日志进行监控。我们的配置情况如下:

在上面,我们在 Host OS 里安装我们的 Elastic Stack: Elasticsearch 及 Kibana。我们也同时安装自己的 Filebeat docker。

安装

安装 Docker

根据自己的操作系统安装 Docker:

Elastic Stack

对于还没安装 Elasticsearch 和 Kibana 的开发者来说,你可以参考我之前的文章 “Elastic:菜鸟上手指南” 来安装 Elasticsearch 及 Kibana。在我们安装 Elasticsearch 时,我们需要对 config/elasticsearch.yml 作如下的配置:

node.name: node1
network.host: _site_
discovery.seed_hosts: ["192.168.43.220"]
cluster.initial_master_nodes: ["node1"]

请注意在上面在 discrovery.seed_hosts 里的 IP 地址 192.168.43.220 就是我电脑的私有 IP 地址。在上面我们把 network.host 设置为 _site_,表明我们的 Elasticsearch 将会绑定到我们的私有 IP 地址上。请参阅 network.host。这个私有IP地址我们可以通过如下的方法获得:

ifconfig | grep 192

修改完后,我们重新启动我们的Elasticsearch,我们将可以看到:

我们可以在上面的地址找到启动的 Elasticsearch。

同样地,我们也需要对我们的 Kibana 进行配置。我们修改 config/kibana.yml:

server.host: "192.168.43.220"
elasticsearch.hosts: ["http://192.168.43.220:9200"]

我们需要根据自己电脑实际的 IP 地址来替换上面的IP地址 192.168.43.220。等修改完后,我们重新启动 Kibana:

如果我们上面配置正确,我们可以在浏览器中看到 Kibana 的界面。请注意:你需要替换上面的IP地址为自己电脑的 IP 地址。

Filebeat Docker

可从 Elastic Docker 注册表中获取 Filebeat 的 Docker 映像。 基本镜像是 centos:7

所有已发布的 Docker 镜像和标签的列表可在 www.docker.elastic.co 中获得。

这些镜像在 Elastic 许可下可免费使用。 它们包含开放源代码和免费的商业功能以及对付费商业功能的访问。 

下载镜像

获得 Docker 的 Filebeat 就像对 Elastic Docker 注册表发出 docker pull 命令一样简单。

docker pull docker.elastic.co/beats/filebeat:7.6.0
$ docker pull docker.elastic.co/beats/filebeat:7.6.0
7.6.0: Pulling from beats/filebeat
c808caf183b6: Already exists 
6e4ed7f6b86b: Pull complete 
f04c35d0ab5f: Pull complete 
5e59ec2a38db: Pull complete 
827556baec23: Pull complete 
79d4dc2f12c1: Pull complete 
f992afe857d6: Pull complete 
Digest: sha256:139ccd9e6585a6e2f375367834afe46fadf2525425f5e436fe5d1455597d16d6
Status: Downloaded newer image for docker.elastic.co/beats/filebeat:7.6.0
docker.elastic.co/beats/filebeat:7.6.0

或者,你可以下载其他仅包含 Apache 2.0 许可下可用功能的 Docker 映像。 要下载图像,请访问 www.docker.elastic.co。在上面我们下载的是 Filebeat 7.6.0 版本。这个版本需要和我们的 Elasticsearch 的版本一致。你可以根据自己的版本需求修改上面的命令。

运行 Filebeat setup

使用 setup 命令运行 Filebeat 将创建索引模式并加载可视化效果,仪表板和机器学习作业。 运行以下命令:

docker run \
docker.elastic.co/beats/filebeat:7.6.0 \
setup -E setup.kibana.host=kibana:5601 \
-E output.elasticsearch.hosts=["elasticsearch:9200"]

在上面,我们需要根据自己的 filebeat 版本修改上面的版本信息。我们也需要根据自己实际的 Elasticsearch 的端口地址进行修改。比如,针对我们的情况,我们把 Elasticsearch 部署在本地,那么上面的 elasticsearch:9000 应该修改为 192.168.43.220:9200。那么上面的命令为:

docker run \
docker.elastic.co/beats/filebeat:7.6.0 \
setup -E setup.kibana.host=192.168.43.220:5601 \
-E output.elasticsearch.hosts=["192.168.43.220:9200"]

上面命令的显示结果为:

$ docker run \
> docker.elastic.co/beats/filebeat:7.6.0 \
> setup -E setup.kibana.host=192.168.43.220:5601 \
> -E output.elasticsearch.hosts=["192.168.43.220:9200"]
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite:true` for enabling.

Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead.
See more: https://www.elastic.co/guide/en/elastic-stack-overview/current/xpack-ml.html
Loaded machine learning job configurations
Loaded Ingest pipelines

如果你看到和我一样的输出,则表明你的配置是正确的。在上面我们已经成功地运行了 filebeat setup 这个命令。更多关于这个命令的介绍,可以参阅我之前的文章 “Beats:Beats 入门教程 (二)”。

对 docker 里的 filebeat 进行配置

Docker 映像提供了几种配置 Filebeat 的方法。 传统方法是通过卷挂载提供配置文件,但也可以创建包含配置的自定义映像。

配置文件示例
下载此示例配置文件作为起点:

curl -L -O https://raw.githubusercontent.com/elastic/beats/7.6/deploy/docker/filebeat.docker.yml

上面命令下载的 filebeat.docker.yml 文件内容如下:

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true

processors:
- add_cloud_metadata: ~

setup.kibana.host: "192.168.43.220:5601"

output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
  username: '${ELASTICSEARCH_USERNAME:}'
  password: '${ELASTICSEARCH_PASSWORD:}'

我们通过修改这个文件把我们想要的 filebeat.yml 文件的配置写进来,比如 elasticsearch 的地址。针对我的情况,我填写 “192.168.43.220:9200”。然后通过下面的卷挂载的办法来完成。 请注意:我们在上面也填写了 Kibana 的地址。

卷挂载安装配置

Docker 上配置 Filebeat 的一种方法是通过卷挂载提供 filebeat.docker.yml。 使用 docker run,可以像这样指定卷挂载。

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/filebeat:7.6.0 filebeat -e -strict.perms=false \
  -E output.elasticsearch.hosts=["elasticsearch:9200"]  

在上面 elasticsearch 指的是我们的 Elasticsearch 的地址。我们需要根据我们自己的情况来进行替换。针对我的情况,我填入我的 Elasticsearch 的IP地址 192.168.43.220,那么我们的命令就是:

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
  --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  docker.elastic.co/beats/filebeat:7.6.0 filebeat -e -strict.perms=false \
  -E output.elasticsearch.hosts=["192.168.43.220:9200"]  

在运行上面的命令时,在 terminal 中,我们必须先进入到 filebeat.docker.yml 文件所处在的目录下,再运行上面的命令:

$ docker run -d \
>   --name=filebeat \
>   --user=root \
>   --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
>   --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
>   --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
>   docker.elastic.co/beats/filebeat:7.6.0 filebeat -e -strict.perms=false \
>   -E output.elasticsearch.hosts=["192.168.43.220:9200"]  
42bf95b5c41e0b80ca91a3cf9ddde74f474cb7eeeffd34f605ee7bd1be1b8c7e

我们可以通过如下的命令来查看 docker 正在运行:

$ docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
42bf95b5c41e        docker.elastic.co/beats/filebeat:7.6.0   "/usr/local/bin/dock…"   47 seconds ago      Up 47 seconds                           filebeat

我们可以看见一个叫做 filebeat 的 container 已经被成功运行。我们可以通过如下的命令来查看 container 里的 filebeat.yml 的内容:

$ docker exec -it filebeat /bin/bash

这样我们就进入到名字叫做 filebeat 的 container 中了:

$ docker exec -it filebeat /bin/bash
[root@00bef51abf02 filebeat]# 

我们可以通过如下的命令来进行查看我们的 filebeat.yml 文件:

显然,在上面我们可以清楚地看到上面的这个 filebeat.yml 的内容就是我们之前的那个 filebeat.docker.yml 文件的内容,也就是说我们已经成功地把我们的文件挂载过来了。

在上面,我们在 filebeat 中配置了 autodiscover。它可以帮我们收集该 container 的日志。如果在这个机器上还有其它的 container 正在运行,那么它也会收集到其它的 container 的日志。 Autodiscover 允许你跟踪它们并在发生变化时调整设置。 通过定义配置模板,自动发现子系统可以在服务开始运行时对其进行监控。更多阅读,请参阅文章 “Beats:使用 Autodiscover 监控 Docker 容器”。

至此我们已经成功地在 docker 里部署了我们的 filebeat。

监控 container 里的系统日志

在上面我们已经成功地进入到 container 里去了。我们可以执行如下的命令:

./filebeat modules enable system

这样我们就启动了我们的 system 模块。然后我们打入 exit 命令退出 bash。我们可以通过如下的命令重新启动名字叫做 filebeat 的容器:

$ docker restart filebeat

这个时候,我们可以在 Kibana 里的 Discover 来查看我们收集的 container 的 system 日志:

我们可以看到我们想要的系统日志。我们可以看到 container.name 等信息:

很多人觉得部署 filebeat 容器没有那么必要,甚至觉得直接在 host 里部署一个就可以直接使用了。我个人认为,在 docker 里的 filebeat 有下面几个用途:

  • 部署一个或一些微服务在 filebeat 容器里。这样我们可以对这些服务进行监控。你可以发现一个很好的例子
  • 在 docker 里的 filebeat 也可以同时对 host 里的文件进行监控,可以通过挂载的办法。这样我们不必要在 host 进行部署 filebeat。
  • 在 docker 里的 filebeat 很容易部署,并且很容易和生产环境下的 elasticsearch docker 一起协作,通过 docker-compose 一键部署。你可以发现一个很好的例子

参考

【1】Run Filebeat on Docker | Filebeat Reference [8.4] | Elastic

【2】From inside of a Docker container, how do I connect to the localhost of the machine? - Stack Overflow

【3】https://github.com/xeraa/java-logging

【4】GitHub - spinscale/elastic-stack-meetup-stream: Using the Elastic Stack to visualize the meetup.com reservation stream

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐