如何在CentOS7上使用Docker安装Prometheus

来自菜鸟教程
跳转至:导航、​搜索

Prometheus 联合创作者 Julius Volz 的文章

介绍

Prometheus 是一个开源监控系统和时间序列数据库。 它解决了监控的许多方面,例如指标的生成和收集、在仪表板上绘制结果数据以及异常警报。 为了实现这一点,它提供了各种单独运行但组合使用的组件。

Docker 为您提供了一种使用 Linux 容器(或其他封装技术)封装服务器进程的方法,以便它们更易于管理和相互隔离。 要了解有关 Docker 的更多信息,请参阅 Docker 生态系统:通用组件简介

在本教程中,我们将学习如何安装三个关键组件以在 Docker 上使用 Prometheus。 这些都是:

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

Prometheus 生态系统中还有更多组件,但这三个为使用 Prometheus 提供了一个很好的起点。

先决条件

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

注意: 本文已在 1 CPU/512 MB RAM CentOS 7.1 Droplet 上进行测试。 如本文第 2 步所述,应针对不同数量的可用资源调整 Prometheus 配置。


第 1 步 — 安装 Prometheus

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

所有 Prometheus 组件的 Docker 容器镜像都托管在 Docker Hub 上的 prom 组织下。 在没有任何其他选项的情况下运行 prom/prometheus Docker 映像会使用位于容器内 /etc/prometheus/prometheus.yml 的示例配置文件启动 Prometheus 服务器。 它还使用安装在容器内 /prometheusDocker 数据卷 来存储收集的指标数据。 这个数据卷目录实际上是 Docker 在容器第一次启动时自动创建的主机上的目录。 它里面的数据在同一个容器的重启之间保持不变。

有多种方法可以覆盖默认配置文件。 例如,自定义配置文件可以作为 Docker 数据卷从主机文件系统传递到容器中,或者您可以选择构建一个派生的 Docker 容器,并将您自己的配置文件烘焙到容器映像中。 在本教程中,我们将选择从主机系统传入一个配置文件。

也有不同的模式来组织度量的存储。 在本教程中,我们将使用 Docker 映像的默认行为,即使用 Docker 数据卷 来存储指标。 如果更适合您的需求,您也可以考虑创建一个数据卷容器。

注意: 要了解如何创建 Docker 数据卷,请阅读 如何在 Ubuntu 14.04 上使用 Docker 数据卷(本文的相关部分并非特定于 Ubuntu)。


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

nano ~/prometheus.yml

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

~/prometheus.yml

# 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

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

docker logs container_id

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

docker logs 6a89ac39911e

要找出主机文件系统上存储指标存储量的位置,您可以使用 container_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 数据卷了解如何实现这一点。 本文是针对 Ubuntu 14.04 编写的,但是 docker 命令和配置文件在 CentOS 7 上是一样的。

您现在应该可以通过 http://your_server_ip:9090/ 访问您的 Prometheus 服务器。 通过前往 http://your_server_ip:9090/status 并在 Targets 部分中找到 prometheus 作业的 http://localhost:9090/metrics 端点来验证它是否正在收集有关自身的指标。 此目标的 State 列应将目标的状态显示为 HEALTHY。 相反,http://localhost:9100/metrics(节点导出器)端点仍应显示为 UNHEALTHY,因为节点导出器尚未启动,因此无法被抓取:

总而言之,您现在使用位于主机文件系统上的自定义 Prometheus 配置文件 ~/prometheus.yml 作为 Docker 容器运行 Prometheus。 度量存储位于容器中的 /prometheus 目录中,该目录由本节中解释的 docker inspect 命令显示的路径支持在主机系统上。

第 2 步 — 设置节点导出器

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

请注意,在 Docker 上运行 Node Exporter 会带来一些挑战,因为它的全部目的是公开有关它正在运行的主机的指标。 如果我们在没有其他选项的情况下在 Docker 上运行它,Docker 对文件系统和网络设备等资源的命名空间将导致它仅导出有关容器环境的指标,这与主机环境不同。 因此,通常建议直接在 Docker 之外的主机系统上运行 Node Exporter。 但是,如果您需要使用 Docker 管理所有进程,我们将描述一种解决方法,该解决方法为从 Docker 中导出主机指标提供了合理的近似值。

使用 Docker 在端口 9100 上启动节点导出器:

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

  • 在 Linux 上,Node Exporter 从 /proc/sys 文件系统收集其大部分指标。 这些文件系统使用 Docker 的 -v 标志从主机安装到 /host 目录下的容器中。
  • 通过节点导出器的 -collector.procfs-collector.sysfs 标志,我们指示节点导出器在非标准位置查找 /proc/sys 文件系统。
  • 为了报告主机文件系统指标,我们还使用 Docker 的 -v 标志将整个根 (/) 文件系统安装到容器中(在 /rootfs 处)。
  • 使用 Node Exporter 的 -collector.filesystem.ignored-mount-points 标志来忽略容器内不属于主机系统的任何其他文件系统。 此选项采用挂载点的正则表达式以从报告的指标中排除。
  • 使用 --net=host Docker 标志,我们将容器放置在与主机相同的网络堆栈中,以便从 /proc/net/dev 等文件读取将产生与主机相同的结果(从/proc 从主机挂载的文件系统是不够的)。

请注意,与直接在主机上运行的节点导出器相比,某些指标仍会有所不同。 具体来说,报告有关文件系统使用情况的指标将在其 mountpoint 标签的值中具有 /rootfs 前缀,因为我们在容器中的此前缀下安装在根文件系统中。 也不能保证所描述的解决方法足以满足任何未来的 Node Exporter 功能,因此请自行决定在 Docker 上运行 Node Exporter。

Prometheus 服务器现在应该会自动开始抓取 Node Exporter。 前往位于 http://your_server_ip:9090/status 的 Prometheus 服务器的状态页面并验证 node 作业的 http://your_server_ip:9100/metrics 目标现在显示 HEALTHY 状态:

第 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 映像并创建一个新的 Docker 卷,该卷放置在主机系统的 ~/grafana_db 和容器文件系统的 /var/lib/grafana 处。 在容器中,Grafana 将在 /var/lib/grafana/grafana.db 自动创建并初始化其 SQLite3 数据库。

-e 标志允许将环境变量传递给在 Docker 容器内启动的进程。 在这里,我们使用它将 GF_SECURITY_ADMIN_PASSWORD 环境变量设置为所需的仪表板管理员密码,覆盖默认密码 admin。 环境变量也可用于覆盖任何其他 Grafana 配置设置。 有关详细信息,请参阅 使用环境变量

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

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

有关如何开始使用 Grafana 的更多信息,请参阅 Grafana 文档Prometheus Grafana 文档 还专门展示了如何将 Grafana 与 Prometheus 结合使用。

结论

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

要了解有关使用 Prometheus 的更多信息,请参阅其 文档