如何在 Ubuntu 14.04 上使用 Docker 安装 Prometheus
普罗米修斯联合创始人 Julius Volz的文章
介绍
Prometheus 是一个开源监控系统和时间序列数据库。它解决了监控的许多方面,例如指标的生成和收集、在仪表板上绘制结果数据以及对异常发出警报。为了实现这一点,它提供了各种单独运行但组合使用的组件。
Docker 为您提供了一种使用 Linux 容器(或其他封装技术)封装服务器进程的方法,以便更轻松地管理它们并将它们彼此隔离。要了解有关 Docker 的更多信息,请参阅Docker 生态系统:常用组件简介。
在本教程中,我们将学习如何安装在 Docker 上使用 Prometheus 的三个关键组件。它们是:
- Prometheus 服务器用于收集指标并进行查询
- 节点导出器,用于以 Prometheus 兼容格式导出系统指标
- Grafana 是一款基于 Web 的图形仪表板构建器,支持 Prometheus 和其他后端
Prometheus 生态系统中还有许多其他组件,但这三个组件为使用 Prometheus 提供了一个良好的起点。
先决条件
要遵循本教程,您需要:
- Ubuntu 14.04 Droplet
- 具有访问权限的用户
sudo
(有关详细信息,请参阅使用 Ubuntu 14.04 进行初始服务器设置教程) - 按照如何在 Ubuntu 14.04 上安装和使用 Docker Compose第 1 步的说明安装 Docker
注意:本文已在 1 CPU/512 MB RAM 的 Ubuntu 14.04 Droplet 上进行了测试。应根据本文第 1 步中所述的不同可用资源量调整 Prometheus 配置。
第1步 - 安装Prometheus
本节将介绍如何使用 Docker 安装主 Prometheus 服务器。在继续之前,请确保按照先决条件部分安装 Docker。Prometheus 服务器是 Prometheus 生态系统的核心部分,负责收集和存储指标以及处理表达式查询和生成警报。
所有 Prometheus 组件的 Docker 容器镜像都托管在Docker Hub 上的promprom/prometheus
组织下。运行Docker 镜像而不使用任何其他选项将启动 Prometheus 服务器,其中包含位于/etc/prometheus/prometheus.yml
容器内的示例配置文件。它还使用安装在容器内的Docker 数据卷/prometheus
来存储收集的指标数据。此数据卷目录实际上是主机上的目录,Docker 在容器首次启动时自动创建该目录。其中的数据在同一容器重新启动之间保留。
有多种方法可以覆盖默认配置文件。例如,可以将自定义配置文件作为 Docker 数据卷从主机文件系统传递到容器中,或者您可以选择构建派生的 Docker 容器,并将您自己的配置文件嵌入到容器映像中。在本教程中,我们将选择从主机系统传入配置文件。
组织指标存储也有不同的模式。在本教程中,我们将使用 Docker 镜像的默认行为,即使用Docker 数据卷来存储指标。如果这更适合您的需求,您也可以考虑创建数据卷容器。
注意:要了解如何创建 Docker 数据卷,请阅读如何在 Ubuntu 14.04 上使用 Docker 数据卷。
首先,在主机文件系统上创建一个最小的 Prometheus 配置文件~/prometheus.yml
:
nano ~/prometheus.yml
将以下内容添加到文件(替换your_server_ip
为您的 Droplet 的 IP 地址):
# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
# Scrape Prometheus itself every 5 seconds.
- job_name: 'prometheus'
scrape_interval: 5s
target_groups:
- targets: ['localhost:9090']
# Scrape the Node Exporter every 5 seconds.
- job_name: 'node'
scrape_interval: 5s
target_groups:
- targets: ['your_server_ip:9100']
此示例配置使 Prometheus 从自身(因为 Prometheus 还以与 Prometheus 兼容的格式公开有关自身的指标)以及 Node Exporter(我们将在稍后设置)抓取指标。虽然 Prometheus 可以使用主机名在其容器内连接到自身localhost
,但它需要使用服务器的外部 IP 抓取 Node Exporter,因为 Node Exporter 将在具有单独网络命名空间的单独容器中运行。
使用外部配置文件启动Prometheus Docker容器:
docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000
第一次运行此命令时,它将从 Docker Hub 中提取 Docker 映像。
这个命令相当长,包含很多命令行选项。我们来详细看一下:
- 该
-d
选项以分离模式启动 Prometheus 容器,这意味着容器将在后台启动,并且不会通过按 来终止CTRL+C
。 - 该
-p 9090:9090
选项公开 Prometheus 的 Web 端口 (9090),并使其可通过主机系统的外部 IP 地址访问。 - 该
-v [...]
选项将prometheus.yml
配置文件从主机文件系统挂载到容器内 Prometheus 期望的位置(/etc/prometheus/prometheus.yml
)。 - 该选项根据容器内
-config.file
Prometheus 配置文件的位置进行设置。 - 该选项配置容器内的
-storage.local.path
指标存储位置。 - 最后,该
-storage.local.memory-chunks
选项将 Prometheus 的内存使用量调整为主机系统非常小的 RAM 量(仅 512MB)和本教程中存储的少量时间序列(略低于 1000)。它指示 Prometheus 仅在内存中保留 10000 个样本块(每个系列大约 10 个块),而不是默认的 1048576。当在具有更多 RAM 的机器上运行 Prometheus 并存储更多时间序列时,您肯定需要调整这个值。有关此内容的更多详细信息,请参阅 Prometheus 的存储文档。
您可以使用以下命令列出所有正在运行的 Docker 容器:
docker ps
例如,对于 Prometheus Docker 容器,您将看到类似以下内容:
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a89ac39911e prom/prometheus "/bin/prometheus -con" 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike
使用输出中显示的容器 ID docker ps
,您可以使用以下命令检查正在运行的 Prometheus 服务器的日志:
docker logs container_id
在我们的示例中,命令将是:
docker logs 6a89ac39911e
要找出主机文件系统上指标存储卷的存储位置,您可以使用以下命令运行容器 ID:
docker inspect container_id
这将输出有关容器配置的信息,包括任何已安装的 Docker 卷的主机路径。
在输出中找到与此类似的部分:
Output of `docker inspect`...
"Mounts": [
{
"Source": "/home/sammy/prometheus.yml",
"Destination": "/etc/prometheus/prometheus.yml",
"Mode": "",
"RW": true
},
{
"Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c",
"Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data",
"Destination": "/prometheus",
"Driver": "local",
"Mode": "",
"RW": true
}
],
...
在此示例中,指标存储在/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data
主机系统上。此目录是 Docker 在首次启动 Prometheus 容器时自动创建的。它被映射到/prometheus
容器中的目录中。此目录中的数据在重新启动同一容器时会保留。如果愿意,您还可以挂载现有主机目录来存储指标数据。请参阅如何在 Ubuntu 14.04 上使用 Docker 数据卷以了解如何实现此目的。
现在,您应该能够通过 访问 Prometheus 服务器。前往Targets部分并找到作业的端点,验证它是否正在收集有关自身的指标。此目标的State列应显示目标的状态为HEALTHY。相反,(Node Exporter)端点仍应显示为UNHEALTHY ,因为 Node Exporter 尚未启动,因此无法抓取数据:http://your_server_ip:9090/
http://your_server_ip:9090/status
http://localhost:9090/metrics
prometheus
http://localhost:9100/metrics
总而言之,您现在可以使用~/prometheus.yml
位于主机文件系统上的自定义 Prometheus 配置文件将 Prometheus 作为 Docker 容器运行。指标存储位于/prometheus
容器中的目录中,该目录由本节中说明的命令显示的路径在主机系统上备份docker inspect
。
第 2 步 - 设置节点导出器
在本节中,我们将安装 Prometheus 节点导出器。节点导出器是一个服务器,它公开有关其运行的主机(节点)的 Prometheus 指标。这包括有关机器的文件系统、网络设备、处理器使用情况、内存使用情况等的指标。
请注意,在 Docker 上运行 Node Exporter 会带来一些挑战,因为它的全部目的是公开有关其所运行主机的指标。如果我们在 Docker 上运行它而没有其他选项,Docker 对文件系统和网络设备等资源的命名空间将导致它仅导出有关容器环境的指标,这与主机环境不同。因此,通常建议在 Docker 之外的主机系统上直接运行 Node Exporter。但是,如果您需要使用 Docker 管理所有进程,我们将描述一种解决方法,它提供了从 Docker 内部导出主机指标的合理近似值。
要使用 Docker 在端口 9100 上启动 Node Exporter:
docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
以下 Docker 和 Node Exporter 标志用于提供主机指标的合理近似值:
/proc
在 Linux 上,Node Exporter 从和文件系统收集大部分指标。这些文件系统使用 Docker 的标志/sys
从主机挂载到目录下的容器中。/host
-v
- 通过节点导出器的
-collector.procfs
和标志,我们指示节点导出器在非标准位置-collector.sysfs
查找/proc
和文件系统。/sys
- 为了报告主机文件系统指标,我们还将整个根(
/
)文件系统挂载到容器(在/rootfs
)中,再次使用 Docker 的-v
标志。 - 使用 Node Exporter 的
-collector.filesystem.ignored-mount-points
标志忽略容器内不属于主机系统的任何其他文件系统。此选项采用挂载点的正则表达式来从报告的指标中排除。 - 使用
--net=host
Docker 标志,我们将容器放入与主机相同的网络堆栈中,以便从文件中读取/proc/net/dev
将产生与主机上相同的结果(/proc
从主机上挂载的文件系统中读取是不够的)。
请注意,与直接在主机上运行的 Node Exporter 相比,某些指标仍会有所不同。具体来说,报告的有关文件系统使用情况的指标将/rootfs
在其标签值中带有前缀mountpoint
,因为我们在容器中的根文件系统中以此前缀挂载。也无法保证所描述的解决方法足以满足任何未来的 Node Exporter 功能,因此请自行决定在 Docker 上运行 Node Exporter。
Prometheus 服务器现在应该会自动开始抓取 Node Exporter。前往 Prometheus 服务器的状态页面,并验证作业的目标现在是否处于健康状态:http://your_server_ip:9090/status
http://your_server_ip:9100/metrics
node
第 3 步 - 设置 Grafana
最后,我们将设置 Grafana。Grafana 是一个图形仪表板构建器,支持 Prometheus 作为查询数据到图表的后端。
Grafana 将其仪表板元数据(例如存在哪些仪表板以及它们应显示哪些图表)存储在可配置的基于 SQL 的数据库中。Grafana 支持使用本地文件支持的 SQLite3 数据库以及外部数据库服务器(例如 MySQL 或 PostgreSQL)。
在本教程中,我们将使用由 Docker 数据卷支持的 SQLite3 数据库。有关更多信息,请参阅如何以及何时使用 Sqlite 。
admin_password
使用您选择的管理员密码 ( ) 启动 Grafana 作为 Docker 容器:
docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana
这将从 Docker Hub 下载 Grafana Docker 镜像,并在~/grafana_db
主机系统上和/var/lib/grafana
容器文件系统中创建一个新的 Docker 卷。在容器中,Grafana 将在 处自动创建并初始化其 SQLite3 数据库/var/lib/grafana/grafana.db
。
该-e
标志允许将环境变量传递给在 Docker 容器内启动的进程。在这里,我们使用它将环境变量设置GF_SECURITY_ADMIN_PASSWORD
为所需的仪表板管理员密码,覆盖默认密码admin
。环境变量也可用于覆盖任何其他 Grafana 配置设置。有关更多详细信息,请参阅使用环境变量。
要验证 Grafana 是否正常运行,请转到。管理员用户名是,密码是您之前启动 Docker 容器时选择的密码。http://your_server_ip:3000/
admin
登录后,您应该看到 Grafana 的主视图:
有关如何开始使用 Grafana 的更多信息,请参阅Grafana 文档。Prometheus Grafana 文档还展示了如何将 Grafana 与 Prometheus 结合使用。
结论
恭喜!您已设置 Prometheus 服务器、Node Exporter 和 Grafana — 全部使用 Docker。尽管它们目前都在同一台机器上运行,但这仅用于演示目的。在生产设置中,通常会在每台受监控的机器上运行 Node Exporter、多个 Prometheus 服务器(根据组织需要)以及单个 Grafana 服务器来绘制来自这些服务器的数据。
要了解有关使用 Prometheus 的更多信息,请参阅其文档。