在 Docker 上运行 Metricbeat

编辑

Metricbeat 的 Docker 镜像可从 Elastic Docker 注册表获得。基础镜像为 centos:7

所有已发布的 Docker 镜像和标签的列表可在 www.docker.elastic.co 上找到。

这些镜像在 Elastic 许可下可以免费使用。它们包含开源和免费的商业功能,以及对付费商业功能的访问。开始 30 天试用,体验所有付费商业功能。有关 Elastic 许可级别的更多信息,请参阅订阅页面。

拉取镜像

编辑

获取 Metricbeat 的 Docker 镜像非常简单,只需向 Elastic Docker 注册表发出 docker pull 命令即可。

docker pull docker.elastic.co/beats/metricbeat:8.17.0

或者,您可以下载其他仅包含 Apache 2.0 许可下可用功能的 Docker 镜像。要下载这些镜像,请访问 www.docker.elastic.co

可选:验证镜像

编辑

您可以使用 Cosign 应用程序来验证 Metricbeat Docker 镜像签名。

wget https://artifacts.elastic.co/cosign.pub
cosign verify --key cosign.pub docker.elastic.co/beats/metricbeat:8.17.0

cosign 命令以 JSON 格式打印检查结果和签名载荷。

Verification for docker.elastic.co/beats/metricbeat:8.17.0 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

运行 Metricbeat 设置

编辑

运行带有 setup 命令的 Metricbeat 将创建索引模式并加载可视化、仪表板和机器学习作业。运行此命令

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

替换您的 Kibana 和 Elasticsearch 主机和端口。

如果您正在 Elastic Cloud 中使用托管的 Elasticsearch 服务,请使用以下语法将 -E output.elasticsearch.hosts 行替换为 Cloud ID 和 elastic 密码

-E cloud.id=<Cloud ID from Elasticsearch Service> \
-E cloud.auth=elastic:<elastic password>

在只读文件系统上运行 Metricbeat

编辑

如果您想在只读文件系统上的 Docker 容器中运行 Metricbeat,可以通过指定 --read-only 选项来实现。Metricbeat 需要一个有状态的目录来存储应用程序数据,因此使用 --read-only 选项时,还需要使用 --mount 选项来指定可以存储数据的路径。

例如

docker run --rm \
  --mount type=bind,source=$(pwd)/data,destination=/usr/share/metricbeat/data \
  --read-only \
  docker.elastic.co/beats/metricbeat:8.17.0

在 Docker 上配置 Metricbeat

编辑

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

示例配置文件

编辑

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

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

卷挂载配置

编辑

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

docker run -d \
  --name=metricbeat \
  --user=root \
  --volume="$(pwd)/metricbeat.docker.yml:/usr/share/metricbeat/metricbeat.yml:ro" \
  --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
  --volume="/sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro" \
  --volume="/proc:/hostfs/proc:ro" \
  --volume="/:/hostfs:ro" \
  docker.elastic.co/beats/metricbeat:8.17.0 metricbeat -e \
  -E output.elasticsearch.hosts=["elasticsearch:9200"]  

替换您的 Elasticsearch 主机和端口。

如果您正在 Elastic Cloud 中使用托管的 Elasticsearch 服务,请使用前面显示的语法将 -E output.elasticsearch.hosts 行替换为 Cloud ID 和 elastic 密码。

自定义您的配置

编辑

您之前下载的 metricbeat.docker.yml 文件配置为根据应用于容器的 Docker 标签部署 Beats 模块。有关更多详细信息,请参阅 基于提示的自动发现。将标签添加到您的应用程序 Docker 容器,当部署它们时,Beats 自动发现功能将获取它们。这是一个 Apache HTTP 服务器容器的示例命令,其中包含用于配置 Apache HTTP 服务器的 Filebeat 和 Metricbeat 模块的标签

docker run \
  --label co.elastic.logs/module=apache2 \
  --label co.elastic.logs/fileset.stdout=access \
  --label co.elastic.logs/fileset.stderr=error \
  --label co.elastic.metrics/module=apache \
  --label co.elastic.metrics/metricsets=status \
  --label co.elastic.metrics/hosts='${data.host}:${data.port}' \
  --detach=true \
  --name my-apache-app \
  -p 8080:80 \
  httpd:2.4

自定义镜像配置

编辑

可以将您的 Metricbeat 配置嵌入到自定义镜像中。这是一个实现此目的的示例 Dockerfile

FROM docker.elastic.co/beats/metricbeat:8.17.0
COPY --chown=root:metricbeat metricbeat.yml /usr/share/metricbeat/metricbeat.yml

监控主机

编辑

在容器中执行 Metricbeat 时,如果您想监控主机或其他容器,有一些重要事项需要注意。让我们逐步了解一些使用 Docker 作为容器编排工具的示例。

此示例突出显示了使 system 模块在容器内部正常工作所需的更改。这使 Metricbeat 能够从容器内部监控主机。

docker run \
  --mount type=bind,source=/proc,target=/hostfs/proc,readonly \ 
  --mount type=bind,source=/sys/fs/cgroup,target=/hostfs/sys/fs/cgroup,readonly \ 
  --mount type=bind,source=/,target=/hostfs,readonly \ 
  --mount type=bind,source=/var/run/dbus/system_bus_socket,target=/hostfs/var/run/dbus/system_bus_socket,readonly \ 
  --env DBUS_SYSTEM_BUS_ADDRESS='unix:path=/hostfs/var/run/dbus/system_bus_socket' \ 
  --net=host \ 
  --cgroupns=host \ 
  docker.elastic.co/beats/metricbeat:8.17.0 -e -system.hostfs=/hostfs

Metricbeat 的 系统模块通过 Linux proc 文件系统收集大部分数据,该文件系统通常位于 /proc。由于容器尽可能与主机隔离,因此容器的 /proc 中的数据与主机的 /proc 不同。为了解决这个问题,您可以将主机的 /proc 文件系统挂载到容器内部,并告诉 Metricbeat 在查找 /proc 时使用 hostfs=/hostfs 配置值在 /hostfs 目录内查找。

默认情况下,系统进程指标集启用了 cgroup 报告,因此您需要在容器中挂载主机的 cgroup 挂载点。它们需要挂载在 hostfs 配置值指定的目录内。

如果您想通过使用 系统文件系统指标集从主机监控文件系统,那么这些文件系统需要在容器内部挂载。它们可以挂载在任何位置。

系统用户指标集系统服务指标集都需要访问 dbus。挂载 dbus 套接字并将 DBUS_SYSTEM_BUS_ADDRESS 环境变量设置为挂载的系统套接字路径。

系统网络指标集使用来自 /proc/net/dev 或使用 hostfs=/hostfs 时来自 /hostfs/proc/net/dev 的数据。使此文件包含主机网络设备的唯一方法是使用 --net=host 标志。这是由于 Linux 命名空间;简单地将主机的 /proc 绑定挂载到 /hostfs/proc 是不够的。

使用主机的 cgroup 命名空间而不是私有命名空间运行容器。虽然这是可选的,但在主机模式下运行时,系统进程指标集可能会产生更正确的 cgroup 指标。

仅当主机系统运行 Linux 时,特殊文件系统 /proc/sys 才可用。尝试绑定挂载这些文件系统将在 Windows 和 MacOS 上失败。

如果在 Linux 上使用 系统套接字指标集,则需要授予 Metricbeat 更多权限。此指标集从 /proc 读取文件,这些文件是其他用户拥有的内部对象的接口。默认情况下,Docker 上禁用读取所有这些文件所需的权限(sys_ptracedac_read_search)。要授予这些权限,也需要这些标志

--user root --cap-add sys_ptrace --cap-add dac_read_search

监控另一个容器中的服务

编辑

接下来,让我们看一个从 Metricbeat 容器监控容器化服务的示例。

docker run \
  --network=mysqlnet \ 
  -e MYSQL_PASSWORD=secret \ 
  docker.elastic.co/beats/metricbeat:8.17.0

将 Metricbeat 和 MySQL 容器放置在同一个 Docker 网络上,使 Metricbeat 可以访问 MySQL 容器的暴露端口,并使主机名 mysql 可解析为 Metricbeat。

如果您不想将某些值硬编码到 Metricbeat 配置中,则可以将它们作为环境变量或作为 Metricbeat 的命令行标志传递到容器中(请参阅 命令参考中的 -E CLI 标志)。

mysql 模块配置如下所示

metricbeat.modules:
- module: mysql
  metricsets: ["status"]
  hosts: ["tcp(mysql:3306)/"] 
  username: root
  password: ${MYSQL_PASSWORD} 

mysql 主机名将解析为 mysqlnet Docker 网络上名为 mysql 的容器的地址。

将在启动时评估 MYSQL_PASSWORD 变量。如果未设置该变量,则会在启动时导致错误。