Beats:如何在 Docker 容器中运行 Filebeat

今天在这篇博客中,我们将学习如何在容器环境中运行 Filebeat。 为了快速了解 Filebeat 是做什么用的:

  • Filebeat用于转发和集中日志数据
  • 它重量轻,小型化,使用的资源更少
  • 它作为代理安装在你的服务器上
  • 它监视来自指定位置的日志文件
  • 它收集日志事件并将它们转发到 Elascticsearch 或 Logstash 进行索引

在今天的练习中,我们将使用如下的架构:

Beats:如何在 Docker 容器中运行 Filebeat_第1张图片

如上所示,我们在 Host 机器上部署 Elasticsearch 及 Kibana。然后在 Docker 里部署 NGINX。 我们使用 Filebeat 来收集 NGINX 里的日志。这个想法是 Filebeat 容器应该从客户端机器上运行的所有容器收集所有日志,并将它们发送到主机上运行的 Elasticsearch。我的主机的 IP 地址是 192.168.0.3。

你可以将 Filebeat 配置为从任意数量的容器中收集日志。 在这里,我只会为这个演示安装一个容器。 现在,让我们从演示开始。

在本展示中,我将使用最新的 Elastic Stack 8.7.1 来进行展示。

提示:在最新的 Elastic Stack 发布中,我们更建议使用 integration 来收集日志。请详细参阅文章 “Observability:运用 Fleet 来轻松地导入 Nginx 日志及指标”。

正对 7.x 的版本,在没有设置安全的情况下,你参阅文章 “Beats:在 Docker 里运行 Filebeat”。更多关于 Beats 的运行,请参考文章 “Beats:Beats 入门教程 (二)”。

安装

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参阅如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

一旦按照完毕,我们可以使用 https://localhost:9200 来访问 Elasticsearch。在 Elasticsearch 安装的过程中,我们可以在它的安装目录中找到相应的安装证书:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.7.1/config/certs
$ ls
http.p12      http_ca.crt   transport.p12

在上面,我们可以看到证书文件 http_ca.crt 文件。这个是在我们如下的配置中需要用到的证书文件。

为了能够使得 Kibana 被 Docker 里的容器所访问,我们需要修改如下的配置:

config/kibana.yml

server.host: "0.0.0.0"

这样,它绑定于所有的 IP 地址上,而不只是 localhost。

NGINX

我们使用如下的命令来启动 NGINX:

sudo docker run -d -p 8080:80 --name nginx nginx

我们可以使用如下的命令来查看 docker:

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
cb3ac6eace69   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp   nginx

我们可以看到 NGINX 已经成功地运行起来了。我们可以使用如下的命令来查看它的响应:

curl localhost:8080
$ curl localhost:8080



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

你也可以在浏览器中进行查看:

Beats:如何在 Docker 容器中运行 Filebeat_第2张图片

Filebeat 

现在,我们只需要部署 Filebeat 容器即可。 使用以下命令下载镜像:

sudo docker pull docker.elastic.co/beats/filebeat:8.7.1
$ sudo docker pull docker.elastic.co/beats/filebeat:8.7.1
Password:
2023/05/19 11:53:06 must use ASL logging (which requires CGO) if running as root
8.7.1: Pulling from beats/filebeat
16c1e5ae78fc: Pull complete 
4d6f6aab5433: Pull complete 
9307845deb69: Pull complete 
ef31d1e76261: Pull complete 
4f5c8ec1ea3b: Pull complete 
efda1b2c0f2f: Pull complete 
a86fca58dffc: Pull complete 
40cafadefbc3: Pull complete 
231bb9e5d0cb: Pull complete 
b6c65c00f2d8: Pull complete 
d088ab450860: Pull complete 
89732bc75041: Pull complete 
Digest: sha256:6646d22b9bb05454f6fa0bd250df0f6fc4f0e9e8aff363b1215013fd2f49596d
Status: Downloaded newer image for docker.elastic.co/beats/filebeat:8.7.1
docker.elastic.co/beats/filebeat:8.7.1

我们接下来需要来配置我们的 Filbeat。我们可以通过如下的命令来获得当前机器的 IP 地址:

$ ifconfig | grep inet
	inet 127.0.0.1 netmask 0xff000000 
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
	inet6 fe80::acbc:f2ff:fe5e:d6eb%anpi2 prefixlen 64 scopeid 0x4 
	inet6 fe80::acbc:f2ff:fe5e:d6e9%anpi0 prefixlen 64 scopeid 0x5 
	inet6 fe80::acbc:f2ff:fe5e:d6ea%anpi1 prefixlen 64 scopeid 0x6 
	inet6 fe80::9826:b8ff:febe:db9d%awdl0 prefixlen 64 scopeid 0x11 
	inet6 fe80::9826:b8ff:febe:db9d%llw0 prefixlen 64 scopeid 0x12 
	inet6 fe80::7aa9:805:78d1:c5a0%utun0 prefixlen 64 scopeid 0x13 
	inet6 fe80::49f8:c1da:6400:2f80%utun1 prefixlen 64 scopeid 0x14 
	inet6 fe80::ce81:b1c:bd2c:69e%utun2 prefixlen 64 scopeid 0x15 
	inet6 fe80::bcef:78d7:ef81:fd99%utun4 prefixlen 64 scopeid 0x1e 
	inet6 fe80::725f:4299:86ad:4350%utun5 prefixlen 64 scopeid 0x1f 
	inet6 fe80::4c:f590:dde0:dbe%en4 prefixlen 64 secured scopeid 0xd 
	inet 192.168.0.3 netmask 0xffffff00 broadcast 192.168.0.255
	inet 198.18.1.13 --> 198.18.1.13 netmask 0xfffff000 

从上面,我们可以看出来,我们机器的 IP 地址为 192.168.0.3。我们在当前用户的目录下创建一个叫做 setup 的目录:

$ cd
$ mkdir -p setup
$ cd setup/

我们首先把 Elasticsearch 的证书拷贝到这个 setup 目录中。

我们接下来在当今的目录中创建一个叫做 filebeat.yml 的文件。它的内容如下:

/Users/liuxg/setup/filebeat.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.0.3:5601"

output.elasticsearch:
  hosts: '${ELASTICSEARCH_HOSTS:https://192.168.0.3:9200}'
  username: "elastic"
  password: "dE2qdV9DbucJJlodLmCy"
  ssl:
    enabled: true
    ca_trusted_fingerprint: "8e4151f1ccc29223490481d37267cd7fe477a4ff23b96f3d3a4c8850c6818da5"

注意

  • 我们需要根据自己的安装修改上面的 username 及 password。在实际的使用中,我们不建议使用超级用 elastic 来进行数据采集。你可以创建一个专门用于采集 beats 信息的用户账号进行使用
  • 上面的 fingerprint 信息可以在安装 Elasticsearch 时得到

有关更多配置 Beats 的信息,请参阅文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。

接下来,我们来启动 Filebeat:

docker run -d \
  --name=filebeat \
  --user=root \
  --volume="$(pwd)/filebeat.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:8.7.1 filebeat -e --strict.perms=false

我们在含有 filebeat.yml 文件的目录下运行上面的命令:

$ pwd
/Users/liuxg/setup
$ ls
filebeat.yml
$ docker run -d \
>   --name=filebeat \
>   --user=root \
>   --volume="$(pwd)/filebeat.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:8.7.1 filebeat -e --strict.perms=false
d6585f5aa770602b15a722efc71e5ce3300f8826861e82e7265f43b995451b8d

我们使用如下的命令来查看 docker 的容器:

$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED             STATUS             PORTS                  NAMES
cce9fb9ba72e   docker.elastic.co/beats/filebeat:8.7.1   "/usr/bin/tini -- /u…"   22 seconds ago      Up 21 seconds                             filebeat
cb3ac6eace69   nginx                                    "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8080->80/tcp   nginx

很显然,我们的 filebeat 已经运行起来了。如果想查看它的日子信息,我们可以使用如下的命令:

我们的设置现已完成。 现在我们可以转到 Kibana 并可视化从 Filebeat 发送的日志。

使用 Kibana 来查看 NGINX 日志

很多开发者可能会奇怪,我们并没有对 NGINX 做任何的配置,那么我们是如何能够正确地采集到 NGINX 的日志信息呢?答案是是在我们的 filebeat.yml 中,我们使用了 autodiscover:

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

为了能够正确地查看 Filebeat 所采集的日志,我们可以利用 Elastic 为我们建好的 Dashboard 来进行查看。我们首先进行到 filebeat 的容器里:

$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS         PORTS                  NAMES
cce9fb9ba72e   docker.elastic.co/beats/filebeat:8.7.1   "/usr/bin/tini -- /u…"   5 minutes ago   Up 5 minutes                          filebeat
cb3ac6eace69   nginx                                    "/docker-entrypoint.…"   2 hours ago     Up 2 hours     0.0.0.0:8080->80/tcp   nginx
$ docker exec -it cce9fb9ba72e /bin/bash
root@cce9fb9ba72e:/usr/share/filebeat# ls
LICENSE.txt  README.md  fields.yml  filebeat.reference.yml  kibana  module
NOTICE.txt   data       filebeat    filebeat.yml            logs    modules.d
root@cce9fb9ba72e:/usr/share/filebeat# ./filebeat setup
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
Loaded Ingest pipelines

我们进入 Kibana 的界面:

Beats:如何在 Docker 容器中运行 Filebeat_第3张图片

Beats:如何在 Docker 容器中运行 Filebeat_第4张图片

我们可以看到有 191 个文档。

Beats:如何在 Docker 容器中运行 Filebeat_第5张图片

我们可以看到有 NGINX 的文档有 52 个: 

Beats:如何在 Docker 容器中运行 Filebeat_第6张图片

我们可以使用如下的命令:

curl http://localhost:8080

上面的命令将生成一个日志。稍等一会儿,我们可以看到:

Beats:如何在 Docker 容器中运行 Filebeat_第7张图片

含有 NGINX 的文档变成了 53 个。

你可能感兴趣的:(Elastic,Beats,Observability,docker,elasticsearch,容器,大数据,nginx)