前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CentOS 7上使用Docker安装Prometheus

如何在CentOS 7上使用Docker安装Prometheus

原创
作者头像
吴凌云
修改2018-10-12 17:59:21
4.7K0
修改2018-10-12 17:59:21
举报

介绍

Prometheus是一个开源监控系统和时间序列数据库。它涉及监控的许多方面,例如度量标准的生成和收集,在仪表板上绘制结果数据以及针对异常情况发出警报。为实现这一目标,它提供了各种组件,这些组件分别运行但组合使用。

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

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

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

普罗米修斯生态系统中有更多组件,但这三个组件为使用普罗米修斯提供了良好的起点。

准备

要学习本教程,您需要:

  • CentOS 7.1 腾讯云CVM
  • 一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

注意:本文已在1 CPU / 512 MB RAM CentOS 7.1 腾讯云CVM上进行了测试。应根据本文第2步中的说明调整Prometheus配置以获取不同数量的可用资源。

第1步 - 安装普罗米修斯

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

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

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

用于组织度量的存储也有不同的模式。在本教程中,我们将使用Docker镜像使用Docker数据卷来存储指标的默认行为。您也可以考虑创建一个数据量容器,以便更好地满足您的需求。

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

代码语言:javascript
复制
nano ~/prometheus.yml

将以下内容添加到文件中(替换your_server_ip为腾讯云CVM的IP地址):

代码语言:javascript
复制
# 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兼容的格式的指标)以及我们稍后将设置的节点导出器。虽然Prometheus可以使用localhost主机名在其容器内连接到自身,但它需要使用服务器的外部IP来刮取Node Exporter,因为Node Exporter将在具有单独网络命名空间的单独容器中运行。

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

代码语言:javascript
复制
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容器:

代码语言:javascript
复制
docker ps

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

代码语言:javascript
复制
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服务器的日志:

代码语言:javascript
复制
docker logs container_id

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

代码语言:javascript
复制
docker logs 6a89ac39911e

要找出存储指标存储卷的主机文件系统的位置,可以使用container_id运行以下命令:

代码语言:javascript
复制
docker inspect container_id

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

在输出中找到与此类似的部分:

代码语言:javascript
复制
...
"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主机系统上。首次启动Prometheus容器时,Docker会自动创建此目录。它映射到/prometheus容器中的目录。此目录中的数据在重新启动同一容器时保持不变。如果您愿意,还可以安装现有主机目录以存储度量标准数据。本文是为Ubuntu 14.04编写的,但Docker命令和配置文件在CentOS 7上是相同的。

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

总而言之,您现在使用自定义Prometheus配置文件将Prometheus作为Docker容器运行,该文件~/prometheus.yml位于主机文件系统上。度量标准存储位于容器中的/prometheus目录中,该目录通过本节中说明的docker inspect命令显示的路径在主机系统上进行备份。

第2步 - 设置节点导出器

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

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

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

代码语言:javascript
复制
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标志用于为主机指标提供合理的近似值:

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

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

Prometheus服务器现在应该自动开始抓取节点导出器。前往http://your_server_ip:9090/statusPrometheus服务器的状态页面,并验证该node作业的http://your_server_ip:9100/metrics目标现在是否显示为HEALTHY状态:

第3步 - 设置Grafana

最后,我们将成立Grafana。Grafana是一个图形化仪表板构建器,支持Prometheus作为查询数据到图形的后端。

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

在本教程中,我们将使用由Docker数据卷支持的SQLite3数据库。

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

代码语言:javascript
复制
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将在/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文档。该普罗米修斯Grafana文档还说明了如何结合使用普罗米修斯专门Grafana。

结论

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

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

更多CentOS教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Install Prometheus using Docker on CentOS 7》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 第1步 - 安装普罗米修斯
  • 第2步 - 设置节点导出器
  • 第3步 - 设置Grafana
  • 结论
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档