如何在 Ubuntu 14.04 上使用 Docker 安装 Prometheus

Prometheus共同創造者Julius Volz的文章

介绍

Prometheus是一个开源的监控系统和时间序列数据库,它解决了监控的许多方面,如指标的生成和收集,在仪表板上绘制结果的数据,并警告异常。

Docker 提供了使用 Linux 容器(或其他封装技术)封装服务器流程的方法,以便它们更容易管理和彼此隔离。

在本教程中,我们将学习如何在Docker上安装使用Prometheus的三个关键组件:

  • 一个 Prometheus 服务器来收集指标并查询它们
  • 一个节点导出器来导出系统指标以 Prometheus 兼容的格式
  • Grafana,一个基于 Web 的图形仪表板构建程序,支持 Prometheus 以及其他后端

Prometheus 生态系统中还有许多其他组成部分,但这三个组成部分是使用 Prometheus 的良好起点。

前提条件

要遵循本教程,您将需要:

<$>[注] 注: 本文已在 1 CPU/512 MB RAM Ubuntu 14.04 Droplet 上进行测试。

步骤 1 – 安装 Prometheus

本节将解释如何使用 Docker 安装 Prometheus 主服务器。在继续之前,请确保在 Prerequisites 部分安装 Docker。 Prometheus 服务器是 Prometheus 生态系统的核心部分,负责收集和存储指标以及处理表达式查询和生成警报。

所有 Prometheus 组件的 Docker 容器图像都被托管在 Docker Hub 上的 prom 组织下。 运行prom/prometheus Docker 图像而无需任何其他选项,将 Prometheus 服务器启动,使用位于容器内在 /etc/prometheus/prometheus.yml 的示例配置文件。 它还使用在容器内安装在 /prometheus’ 的 Docker 数据量来存储收集的指标数据。 该数据量目录实际上是主机上的一个目录,当容器首次启动时,Docker 会自动创建它。

例如,一个自定义配置文件可以从主机文件系统作为Docker数据量传入容器,或者你可以选择构建一个衍生Docker容器,并将自己的配置文件烤到容器图像中。

在本教程中,我们将使用 Docker 图像的默认行为使用 Docker 数据量来存储指标。

<$>[注] 注: 要了解如何创建 Docker 数据量,请阅读 如何在 Ubuntu 14.04 上使用 Docker 数据量

首先,在主机文件系统上创建一个最小的 Prometheus 配置文件在 ~/prometheus.yml:

1nano ~/prometheus.yml

将以下内容添加到文件中(用您的 Droplet 的 IP 地址替换 your_server_ip):

 1[label ~/prometheus.yml]
 2# A scrape configuration scraping a Node Exporter and the Prometheus server
 3# itself.
 4scrape_configs:
 5  # Scrape Prometheus itself every 5 seconds.
 6  - job_name: 'prometheus'
 7    scrape_interval: 5s
 8    target_groups:
 9      - targets: ['localhost:9090']
10
11  # Scrape the Node Exporter every 5 seconds.
12  - job_name: 'node'
13    scrape_interval: 5s
14    target_groups:
15      - targets: ['your_server_ip:9100']

此示例配置使得 Prometheus 可以从自身中扫描指标(因为 Prometheus 还以 Prometheus 兼容的格式揭示了关于自身的指标),以及从 Node Exporter 中扫描指标,我们将在稍后设置它。

使用外部配置文件启动 Prometheus Docker 容器:

1docker 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'而终止。 Prometheus的网络端口(9090),使其通过主机系统的外部IP地址可以到达.
  • ‘-v'选项将"prometheus.yml"配置文件从主机文件系统挂入"Prometheus"的容器内期望它的位置("/etc/prometheus/prometheus.yml").
  • ‘-config.file'选项被设定为"Prometheus"配置文件在容器内的位置 存储. local.path' 选项配置了度量衡存储位置 存储.local.memory-chunks`选项调整 普罗米修斯对主机系统的内存用量很小的RAM(只有512MB),在这个教程中存储的时间序列也很少(刚刚不到1000个). 它指示普罗米修斯只将一万个样本块保存在内存中(大约每系列有10个块),而不是默认的1048576. ** 这是一个值,当运行 Prometheus 在一个拥有更多RAM 的机器上以及存储更多时间序列时,你绝对需要调用** . 请参看普罗米修斯的[储存文档] (http://prometheus.io/docs/operating/storage/) 有关此细节的更多信息.

您可以使用以下命令列出所有正在运行的 Docker 容器:

1docker ps

例如,您将看到 Prometheus Docker 容器的类似内容:

1[secondary_label Output of `docker ps`]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36a89ac39911e prom/prometheus      "/bin/prometheus -con"   2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike

使用docker ps输出中显示的容器ID,您可以使用以下命令检查运行 Prometheus 服务器的日志:

1docker logs container_id

在我们的例子中,命令将是:

1docker logs 6a89ac39911e

要查找主机的文件系统中存储的指标存储量在何处,您可以使用 container_id 执行以下操作:

1docker inspect container_id

这将输出有关您的容器配置的信息,包括任何安装的 Docker 卷的主机路径。

在输出中找到一个类似于此的部分:

 1[secondary_label Output of `docker inspect`]
 2...
 3"Mounts": [
 4    {
 5        "Source": "/home/sammy/prometheus.yml",
 6        "Destination": "/etc/prometheus/prometheus.yml",
 7        "Mode": "",
 8        "RW": true
 9    },
10    {
11        "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c",
12        "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data",
13        "Destination": "/prometheus",
14        "Driver": "local",
15        "Mode": "",
16        "RW": true
17    }
18],
19...

在本示例中,指标被存储在主机系统上的 /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a01d8207cd6c/_data 中。此目录在首次启动 Prometheus 容器时由 Docker 自动创建。它被映射到容器中的 /prometheus’ 目录中。此目录中的数据在同一容器的重新启动过程中仍然存在。 如果您喜欢,您也可以安装一个现有的主机目录来存储指标数据。 请参阅 [如何在 Ubuntu 14.04 上使用 Docker 数据集(INKL0) ) 如何实现这一点。

您现在应该能够在http://your_server_ip:9090/``上访问您的Prometheus服务器。 请检查它是否正在收集有关其自身的指标,然后转到http://your_server_ip:9090/status并在Prometheus工作中的http://localhost:9090/metrics终端点,在Targets**部分。 该目标的State** 列应该显示目标的状态为HEALTHY** 。 相比之下,http://localhost:9100/metrics(Node Exporter)终端点仍然应该显示为UNUNHEALTHY** `,因为节点出口器尚未启动,因此无法删除:

The Node Exporter target should be shown as UNHEALTHY

要总结一下,现在 Prometheus 运行为 Docker 容器,使用位于主机文件系统上的自定义 Prometheus 配置文件 `~/prometheus.yml。

步骤 2 – 设置 Node 出口器

在本节中,我们将安装 Prometheus Node Exporter. Node Exporter 是一个服务器,它暴露了 Prometheus 有关正在运行的主机(节点)的指标,其中包括有关机器的文件系统,网络设备,处理器使用,内存使用等指标。

请注意,在 Docker 上运行 Node Exporter 会带来一些挑战,因为它的整个目的是揭示正在运行的主机的指标。如果我们在 Docker 上运行它而没有其他选项,则 Docker 对文件系统和网络设备等资源的命名空间会导致它只导出有关容器环境的指标,这将与主机环境不同。

若要在端口 9100 上使用 Docker 启动 Node Exporter:

1docker 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 标志用于为 host 指标提供合理的接近:

  • 在Linux上,节点输出器从 " /proc " 和 "/sys " 文件系统收集其大部分的度量。 这些文件系统从主机被挂入/主机目录下方的容器,使用多克的-v旗。 *通过节点输出者的'-收集.procfs'和'-收集.sysfs'等旗帜,我们指示节点输出者在非标准位置寻找'/proc'和'/sys'文件系统. *为了报告主机文件系统衡量标准,我们还将整个根('/'')文件系统上载到容器中(以'/rootfs'),再次使用多克克'-v'旗. *使用节点导出器'-collectionor.filesystem.ignored-mount-points'旗来忽略容器内不属于主机系统的任何其他文件系统. 此选项使用正常的挂载点表示, 以排除所报的度量符。
  • 使用 -- net=host Docker旗下,我们把容器放入与主机相同的网络堆栈中,这样从"/proc/net/dev"等文件读取结果将产生与主机相同的结果(从主机所挂载的"/proc"文件系统读取是不够的). (韩语)_

请注意,一些指标仍会与直接在主机上运行的 Node Exporter 相比有所不同. 具体来说,有关文件系统使用情况的指标将在它们的 mountpoint 标签的值中具有/rootfs前缀,因为我们在集装箱中的根文件系统中安装了这个前缀。

Prometheus 服务器现在应该自动开始扫描 Node Exporter。 转到您的 Prometheus 服务器的状态页面,点击 http://your_server_ip:9090/status,并确认 http://your_server_ip:9100/metrics 任务的目标现在显示一个 HEALTHY 状态:

The Node Exporter target should be shown as HEALTHY

步骤 3 – 设置 Grafana

最后,我们将设置Grafana。Grafana是一个图形仪表板构建程序,支持Prometheus作为对图表数据查询的后端。

Grafana 将其仪表板元数据(如哪些仪表板存在以及应该显示哪些图表)存储在可配置的基于 SQL 的数据库中. Grafana 支持使用本地文件支持的 SQLite3 数据库以及外部数据库服务器,如 MySQL 或 PostgreSQL。

在本教程中,我们将使用由 Docker 数据量支持的 SQLite3 数据库. 参见 如何和何时使用 Sqlite 有关更多信息。

启动 Grafana 作为一个 Docker 容器,使用您选择的管理员密码(‘admin_password’):

1docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana

这将从 Docker Hub 下载 Grafana Docker 图像,并创建一个新的 Docker 卷,在主机系统中放置在 ~/grafana_db,在容器文件系统中放置在 /var/lib/grafana。

-e 旗允许将环境变量传输到 Docker 容器内启动的流程中。在这里,我们使用它来将GF_SECURITY_ADMIN_PASSWORD环境变量设置为所需的仪表板管理员密码,取代了admin的默认密码。

要验证 Grafana 是否正确运行,请点击 http://your_server_ip:3000/. 管理员用户名为 admin,密码是您之前启动 Docker 容器时选择的密码。

Log in to Grafana with your chosen password

登录后,您应该看到Grafana的主要视图:

Grafana main view

请参阅 Grafana 文档 有关如何开始使用 Grafana 的更多信息。

结论

恭喜您!您已经设置了一个 Prometheus 服务器、一个 Node Exporter 和 Grafana – 所有这些都使用 Docker. 尽管这些服务器目前都在同一台机器上运行,但这只是用于演示目的。 在生产设置中,通常会在每个监控的机器上运行 Node Exporter、多个 Prometheus 服务器(根据组织的需求),以及一个单一的 Grafana 服务器来绘制这些服务器的数据。

要了解有关普罗米修斯一般使用的更多信息,请参阅其 文档

Published At
Categories with 技术
comments powered by Disqus