今天在这篇博客中,我们将学习如何在容器环境中运行 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
Welcome to nginx!
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
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.
你也可以在浏览器中进行查看:
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 个。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net