Docker监控教程 - 如何使用Telegraf和InfluxDB监控Docker

导航到

本文最初发布在CNCF博客上,由Cameron Pavey撰写。向下滚动查看作者简介。

为什么监控Docker

与传统非容器化工作负载一样,有几个原因说明为什么监控基于Docker的应用至关重要。密切关注您应用程序的关键指标,可以让您在性能问题和资源分配优化等方面采取主动。如果您的应用程序经常消耗比预期更多的资源,您需要尽早了解这一点。如果这些问题被忽视,可能会导致云服务提供商的意外账单或不满客户的支持请求(如果存在潜在的性能问题)。

如果您有详细的指标来描述应用程序在运行时的行为,您就有机会在问题早期就解决它们。通常,您想收集的指标包括CPU和内存使用情况,以及磁盘和网络I/O,以及其他根据您应用程序需求而定的更多具体指标。

然而,收集大量此类数据可能会很快变得棘手。您需要以有意义的方式收集数据并将其存储,并有一种机制可以拉取数据进行分析和可视化。这正是InfluxDB和Telegraf发挥作用的地方。

InfluxDB是一个专为时间序列数据库设计的数据库,具有许多强大的功能。特别是,内置的数据可视化工具和强大的Flux数据脚本语言是现有时间序列数据库提供的强大补充。InfluxDB可以与Telegraf配合使用,Telegraf是一个基于服务器的代理,用于从各种系统收集指标。得益于灵活的插件架构,Telegraf已经支持300多个插件,用于从不同的端点收集指标,包括Docker。

先决条件

在开始本教程之前,您需要在您的系统上安装并正确配置Docker。您可以通过参考您所选择操作系统的官方文档来安装Docker。如果您使用的是基于Unix的操作系统,您还可以将用户添加到Docker组,以便您可以用非root用户身份使用Docker。

一旦您安装并配置了Docker,您可以通过运行以下命令来验证它是否按预期工作

docker run hello-world

此命令应打印一些输出以确认一切正常

Docker运行hello-world输出

请注意,本教程假定您使用基于Linux的操作系统,如Ubuntu,用于代码片段和命令。教程中稍后有一个部分,如果使用macOS,则命令将失败,但请放心,如果发生这种情况,有一个简单的解决方案。

使用InfluxDB和Telegraf监控Docker

安装Docker后,您现在可以安装并配置InfluxDB和Telegraf。虽然您可以直接在机器上安装这两个软件包,但本教程将向您展示如何作为Docker容器安装和集成它们。

在创建容器之前,您需要创建一个Docker网络,以便它们可以相互通信。您可以使用以下命令来完成此操作

docker network create --driver bridge influxdb-net

InfluxDB

现在您需要创建一个新的influx-data/目录。您将把这个目录挂载到该容器使用的Docker卷上,这意味着即使容器停止运行,您的数据也能持久化

mkdir influx-data && cd influx-data

进入目录后,您可以使用以下命令来拉取influxdb Docker镜像并使用它创建一个容器(将您的influx-data/目录映射到容器的卷)

docker run \
	--name influxdb \
	-p 8086:8086 \
	--volume $PWD:/var/lib/influxdb2 \
	--net=influxdb-net \
	-d \
	influxdb:2.1.1

运行此命令将在容器中启动一个InfluxDB实例,可在主机的IP地址上的8086端口访问。在配置Telegraf之前,您需要设置您的InfluxDB安装并设置一些参数,如bucket名称。

配置InfluxDB

将您的Docker主机IP地址导航到端口8086(如果您在本地上运行Docker,请尝试http://127.0.0.1:8086/。)现在,您应该会看到InfluxDB欢迎屏幕。点击开始。然后,系统会提示您创建初始用户。请记下您提供的初始组织名称初始桶名称,因为您将在Telegraf配置中很快需要它们。

设置初始用户

填写这些详细信息后,点击继续,在最后一页选择稍后配置。然后,您将返回主仪表板。从那里,选择加载您的数据,在随后的页面中选择Telegraf选项卡。

创建Telegraf配置

在此选项卡上,选择+ 创建配置。您将被询问要监控哪种系统。选择Docker并点击继续。为配置提供一个语义名称(如“Docker”)并点击创建和验证。然后,InfluxDB将向您提供一个API令牌和一个URL,这将为您提供Telegraf的部分配置文件。

配置您的API密钥

请记下此API密钥,您将很快需要它。

有了这个API密钥,您就拥有了配置Telegraf容器并开始记录一些度量所需的所有最终部分。对于这个教程,您不需要提供的配置文件,因为将为您提供一个包含一些额外部分的配置文件。

Telegraf

回到您的终端,如果您仍然在influx-data/目录中,您可以离开此目录并创建一个名为telegraf-data/的新目录。此目录将保存Docker将挂载到容器中的Telegraf配置文件。

# If you’re still in the influx-data/ directory
cd ..

mkdir telegraf-data && cd telegraf-data

在此目录中,创建一个名为telegraf.conf的文件,并按如下设置其内容

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"
  gather_services = false
  container_names = []
  source_tag = false
  container_name_include = []
  container_name_exclude = []
  timeout = "5s"
  perdevice = true
  total = false
  docker_label_include = []
  docker_label_exclude = []
  tag_env = ["JAVA_HOME", "HEAP_SIZE"]

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]
  token = "$INFLUX_TOKEN"
  organization = "influx-docker-demo"
  bucket = "influx-docker-demo"

您可能需要编辑此文件的最后一个块,如果您使用了不同的组织名称。同样,如果您给InfluxDB容器起了一个不同于influxdb的名称,您需要在配置文件中更改的urls键的值中反映这一更改。

一旦创建了此文件,您就可以从您的telegraf-data/目录运行以下命令来创建容器

docker run -d --name=telegraf \
	-v $(pwd)/telegraf.conf:/etc/telegraf/telegraf.conf \
	-v /var/run/docker.sock:/var/run/docker.sock \
	--net=influxdb-net \
	--user telegraf:$(stat -c '%g' /var/run/docker.sock) \
	--env INFLUX_TOKEN="your_api_key" \
	telegraf

注意:如果您使用macOS,此命令可能会失败,因为Mac和Linux之间的stat命令略有不同。如果发生这种情况,请尝试将-c标志替换为类似这样的-f标志:–user telegraf:$(stat -f ‘%g’ /var/run/docker.sock)

前面的命令为了正确运行执行了几个重要操作。以下是逐行说明

  • 第一个-v标志挂载了您刚刚创建的配置文件。
  • 第二个-v标志挂载了主机的Docker套接字,这是Telegraf收集有关您的Docker服务器详细信息的方式。
  • –net标志确保此容器和之前创建的InfluxDB容器都在同一网络上,这是您创建的配置文件如何通过DNS名称引用InfluxDB容器(influxdb)的方式。
  • –user标志是必要的,因为Telegraf镜像内部使用名为telegraf的用户和组,因此您必须将其映射到有权访问docker.sock文件的用户。
  • –env标志指定了一个包含您在配置文件中创建的InfluxDB实例API密钥的环境变量。

运行此命令后,您可以检查Docker日志以查看是否存在任何意外问题。

docker logs telegraf

如果一切正常,您应该会看到类似以下输出,没有错误

Docker日志

如果一切看起来都很正常,您就可以在InfluxDB中可视化您的数据了。

如果在尝试访问 /var/run/docker.sock 时出现权限被拒绝的错误,您可以通过运行以下命令来解决这个问题,该命令将更改容器中套接字的权限,允许 telegraf 用户正确访问它

docker exec -u root -it telegraf /bin/sh -c "chmod 666 /var/run/docker.sock"
数据可视化

在浏览器中返回 InfluxDB,从侧边栏中选择 数据。接下来,选择 选项卡,然后选择您配置 Telegraf 使用的数据桶名称

数据桶

这将带您进入 数据探索器 页面,您应该能够看到 Telegraf 提供给 InfluxDB 的数据。默认情况下,捕获了相当多的指标,包括 CPU 和内存使用情况以及网络统计信息。您可以通过点击屏幕底部的不同过滤器查看所有其他可用数据

数据探索器

有关如何从数据中提取有意义的可视化信息的更多信息,您可以参考官方文档以获取更多信息。

总结

在本教程中,您学习了如何使用 DockerTelegrafInfluxDB 监控关键指标。

作为时序数据库,InfluxDB 完美地定位了存储和可视化的指标类型,这些指标通常是应用监控经常处理的,因为通常有大量的定期间隔的数据点。对于如此大量的数据,您必须有一个机制来可视化、搜索和理解数据以获取洞察。InfluxDB 通过其易于配置的可视化和强大的 Flux 数据脚本语言,允许您查询和分析数据,在这方面符合要求。

关于作者

Cameron 是一位居住在墨尔本的全栈开发者。他致力于理解优质代码、开发者生产力和工作满足感的复杂性的永不停止的旅程。