今天在这篇博客中,我们将学习如何在容器环境中运行 Filebeat。 为了快速了解 Filebeat 是做什么用的:
- Filebeat用于转发和集中日志数据
- 它重量轻,小型化,使用的资源更少
- 它作为代理安装在你的服务器上
- 它监视来自指定位置的日志文件
- 它收集日志事件并将它们转发到 Elascticsearch 或 Logstash 进行索引
在今天的练习中,我们将使用如下的架构:
如上所示,我们在 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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
你也可以在浏览器中进行查看:
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 的界面:
我们可以看到有 191 个文档。
我们可以看到有 NGINX 的文档有 52 个:
我们可以使用如下的命令:
curl http://localhost:8080
上面的命令将生成一个日志。稍等一会儿,我们可以看到:
含有 NGINX 的文档变成了 53 个。