首页 运维干货Docker环境部署Prometheus实践

Docker环境部署Prometheus实践

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

一、Prometheus简介

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。

Docker环境部署Prometheus实践插图

Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。 Prometheus目前在开源社区相当活跃。 Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。

1.系统架构图

Docker环境部署Prometheus实践插图(1)

2.基本原理

Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。

其大概的工作流程是:

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  3. Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
  4. 在Grafana图形界面中,可视化查看采集数据。

3.Prometheus的特性

  • 多维度数据模型。

  • 灵活的查询语言。

  • 不依赖分布式存储,单个服务器节点是自主的。

  • 通过基于HTTP的pull方式采集时序数据。

  • 可以通过中间网关进行时序列数据推送。

  • 通过服务发现或者静态配置来发现目标服务对象。

  • 支持多种多样的图表和界面展示,比如Grafana等。

4.Prometheus的组件

  • Prometheus Server 主要负责数据采集和存储,提供PromQL查询语言的支持。

  • Alertmanager 警告管理器,用来进行报警。

  • Push Gateway 支持临时性Job主动推送指标的中间网关。

  • Exporters 输出被监控组件信息的HTTP接口。

  • Grafana 监控数据展示Web UI。

5.服务发现

由于 Prometheus 是通过 Pull 的方式主动获取监控数据,也就是每隔几秒钟去各个target采集一次metric。所以需要手工指定监控节点的列表,当监控的节点增多之后,每次增加节点都需要更改配置文件,尽管可以使用接口去热更新配置文件,但仍然非常麻烦,这个时候就需要通过服务发现(service discovery,SD)机制去解决。

Prometheus 支持多种服务发现机制,可以自动获取要收集的 targets,包含的服务发现机制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以参考手册的配置页面。可以说 SD 机制是非常丰富的,但目前由于开发资源有限,已经不再开发新的 SD 机制,只对基于文件的 SD 机制进行维护。针对我们现有的系统情况,我们选择了静态配置方式。

二、部署PrometheusServer

1. 使用官方镜像运行

由于Prometheus官方镜像没有开启热加载功能,而且时区相差八小时,所以我们选择了自己制作镜像,当然你也可以使用官方的镜像,提前创建Prometheus配置文件prometheus.yml和Prometheus规则文件rules.yml,然后通过如下命令挂载到官方镜像中运行:

使用官方镜像部署可以参考我的这篇文章:Docker部署Prometheus实现微信邮件报警。

2. 制作镜像

现在我们创建自己的Prometheus镜像,当然你也可以直接使用我制作的镜像

首先去Prometheus下载二进制文件安装包解压到package目录下,我的Dockerfile目录结构如下:

分别创建图中的目录,可以看到conf目录中有一些名为supervisord的文件,这是因为在容器中的进程我们选择使用supervisor进行管理,当然如果不想使用的化可以进行相应的修改。

制作prometheus-start.sh启动脚本,Supervisor启动Prometheus会调用该脚本

制作Prometheus-start.conf启动文件,Supervisord的配置文件

制作supervisord.conf启动文件

制作container-entrypoint守护文件,容器启动后执行的脚本

在conf目录下新建Prometheus.yml配置文件,这个是Prometheus配置监控主机的文件

在conf目录下新建rules目录,编写service_down.yml规则文件,这个也可以等到容器创建后再编写,这里我们就直接写好添加到镜像中

制作dockerfile 镜像文件

Dockerfile中安装了supervisor进程管理工具和SSH服务,指定了字符集和时区。

生成镜像并运行容器服务

访问prometheus Web页面 IP:9090

Docker环境部署Prometheus实践插图(2)

三、部署监控组件Exporter

Prometheus 是使用 Pull 的方式来获取指标数据的,要让 Prometheus 从目标处获得数据,首先必须在目标上安装指标收集的程序,并暴露出 HTTP 接口供 Prometheus 查询,这个指标收集程序被称为 Exporter ,不同的指标需要不同的 Exporter 来收集,目前已经有大量的 Exporter 可供使用,几乎囊括了我们常用的各种系统和软件,官网列出了一份常用Exporter的清单 ,各个 Exporter 都遵循一份端口约定,避免端口冲突,即从 9100 开始依次递增,这里是完整的 Exporter端口列表 。另外值得注意的是,有些软件和系统无需安装 Exporter,这是因为他们本身就提供了暴露 Prometheus 格式的指标数据的功能,比如 Kubernetes、Grafana、Etcd、Ceph 等。

1. 部署主机监控组件

各节点主机使用主机网络模式部署主机监控组件node-exporter,官方不建议将其部署为Docker容器,因为该node_exporter设计用于监控主机系统。需要访问主机系统,而且通过容器的方式部署发现磁盘数据不太准确。二进制部署就去看项目文档吧

容器正常运行后,进入Prometheus容器,在Prometheus.yml 文件中添加node-exporter组件地址

热加载更新Prometheus

查看Prometheus的web页面已经可以看到node-exporter,然后我们就可以定义报警规则和展示看板了,这部分内容在后面配置Alertmanager和Grafana上会详细介绍。

Docker环境部署Prometheus实践插图(3)

2.部署容器监控组件

各节点主机部署容器监控组件cadvisor-exporter,我这边Docker网络使用的macvlan方式,所以直接给容器分配了IP地址。

同样的,容器正常运行后,我们访问Cadvisor的Web页面 IP+8080 端口

Docker环境部署Prometheus实践插图(4)

现在我们进入Prometheus容器,在prometheus.yml主机文件中添加cadvisor组件

热加载更新Prometheus

可以看到,Prometheus添加的cadvisor状态为UP,说明正常接收数据。

Docker环境部署Prometheus实践插图(5)

3. 部署Redis监控组件

容器部署Redis服务监控组件redis_exporter,--redis.passwd指定认证口令,如果你的redis访问没有密码那么就无需指定后面参数。

在prometheus.yml 添加redis-exporter

然后热加载更新,步骤同上。

4.部署应用监控组件

中间件部署JVM监控组件jmx_exporter, 这种方式是适用于代码中没有暴露应用metrics信息的服务,无需进行代码改动,在应用启动时调用该jar包暴露jmx信息,然后在Prometheus分别指定应用的地址即可。

  1. 首先下载jar :https://github.com/prometheus/jmx_exporter(jmx_prometheus_javaagent-0.11.0.jar )
  2. 下载配置文件,有tomcat和weblogic注意区分:https://github.com/prometheus/jmx_exporter/tree/master/example_configs
  3. 然后在中间件启动参数添加以下内容,指定配置文件和jar包的路径:

上面我指定暴露metrics信息的端口为12345,所以我们在prometheus.yml文件中添加即可:

其他步骤同上,Prometheus热加载更新即可。

5. 部署进程监控组件

因为我们容器是使用单独的网络部署的,相当于胖容器的方式,所以需要在监控的容器中部署process-exporter进程监控组件来监控容器的进程,

软件包下载:

配置文件:process-name.yaml

启动参数:

在Prometheus.yml 添加该容器的IP地址,端口号为9256

ok,现在我们热加载更新Prometheus的主机文件

四、部署Alertmanager报警组件

1. Alertmanager 概述

Alertmanager处理客户端应用程序(如Prometheus服务器)发送的告警。 它负责对它们进行重复数据删除,分组和路由,以及正确的接收器集成,例如电子邮件,PagerDuty或OpsGenie。 它还负责警报的静默和抑制。

以下描述了Alertmanager实现的核心概念。 请参阅配置文档以了解如何更详细地使用它们。

  • 分组(Grouping)
    分组将类似性质的告警分类为单个通知。 这在大型中断期间尤其有用,因为许多系统一次失败,并且可能同时发射数百到数千个警报。
    示例:发生网络分区时,群集中正在运行数十或数百个服务实例。 一半的服务实例无法再访问数据库。 Prometheus中的告警规则配置为在每个服务实例无法与数据库通信时发送告警。 结果,数百个告警被发送到Alertmanager。
    作为用户,只能想要获得单个页面,同时仍能够确切地看到哪些服务实例受到影响。 因此,可以将Alertmanager配置为按群集和alertname对警报进行分组,以便发送单个紧凑通知。
    这些通知的接收器通过配置文件中的路由树配置告警的分组,定时的进行分组通知。
  • 抑制(Inhibition)
    如果某些特定的告警已经触发,则某些告警需要被抑制。
    示例:如果某个告警触发,通知无法访问整个集群。 Alertmanager可以配置为在该特定告警触发时将与该集群有关的所有其他告警静音。 这可以防止通知数百或数千个与实际问题无关的告警触发。
  • 静默(SILENCES)
    静默是在给定时间内简单地静音告警的方法。 基于匹配器配置静默,就像路由树一样。 检查告警是否匹配或者正则表达式匹配静默。 如果匹配,则不会发送该告警的通知。在Alertmanager的Web界面中可以配置静默。
  • 客户端行为(Client behavior)
    Alertmanager对其客户的行为有特殊要求。 这些仅适用于不使用Prometheus发送警报的高级用例。 #制作镜像方式和Prometheus类似,稍作更改即可,此步省略。

设置警报和通知的主要步骤如下:

  1. 设置并配置Alertmanager;
  2. 配置Prometheus对Alertmanager访问;
  3. 在普罗米修斯创建警报规则;

2. 部署Alertmanager组件

首先需要创建Alertmanager的报警通知文件,我这里使用企业微信报警,其中企业微信需要申请账号认证,方式如下:

  1. 访问网站注册企业微信账号(不需要企业认证)。

  2. 访问apps创建第三方应用,点击创建应用按钮 -> 填写应用信息:

  3. 创建报警组,获取组ID:

Docker环境部署Prometheus实践插图(6)

Docker环境部署Prometheus实践插图(7)

Docker环境部署Prometheus实践插图(8)

新建alertmanager.yml报警通知文件

参数说明:

  • corp_id: 企业微信账号唯一 ID, 可以在我的企业中查看。

  • to_party: 需要发送的组。

  • agent_id: 第三方企业应用的 ID,可以在自己创建的第三方企业应用详情页面查看。

  • api_secret: 第三方企业应用的密钥,可以在自己创建的第三方企业应用详情页面查看。

然后我们创建企业微信的消息模板,template/wechat.tmpl

这个报警的模板其中的值是在Prometheus触发的报警信息中提取的,所以你可以根据自己的定义进行修改。

运行Alertmanager容器

容器运行完成后查看web页面 IP:9093

Docker环境部署Prometheus实践插图(9)

3. 配置报警规则

Prometheus的报警规则通过PromQL语句编写

进入Prometheus容器的rules目录,上面我们制作镜像的时候已经创建好并挂载到了容器中,现在我们编写其他的规则文件

编写主机监控规则文件,rules/host_sys.yml

编写容器监控规则文件,rules/container_sys.yml

编写redis监控规则文件,redis_check.yml

编写服务停止监控规则,rules/service_down.yml

编写报警规则可以参考后面Grafana展示看板后的数据展示语句,需要注意的是,我们容器使用的是胖容器的方式,即当作虚拟机来使用,所以需要添加应用和服务停止的Exporter,如果你的容器守护进程直接就是应用的话,只需要监控容器的启停就可以了。

测试微信报警

Docker环境部署Prometheus实践插图(10)

五、Grafana展示组件

虽然 Prometheus 提供的 Web UI 也可以很好的查看不同指标的视图,但是这个功能非常简单,只适合用来调试。要实现一个强大的监控系统,还需要一个能定制展示不同指标的面板,能支持不同类型的展现方式(曲线图、饼状图、热点图、TopN 等),这就是仪表盘(Dashboard)功能。

Prometheus 开发了一套仪表盘系统PromDash,不过很快这套系统就被废弃了,官方开始推荐使用 Grafana 来对 Prometheus 的指标数据进行可视化,这不仅是因为 Grafana 的功能非常强大,而且它和 Prometheus 可以完美的无缝融合。

Grafana是一个用于可视化大型测量数据的开源系统,它的功能非常强大,界面也非常漂亮,使用它可以创建自定义的控制面板,你可以在面板中配置要显示的数据和显示方式,它支持很多不同的数据源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等,而且它也支持众多的插件 。

1. 部署Grafana服务容器

运行后访问IP:3000,user:admin pass:passwd

Docker环境部署Prometheus实践插图(11)

2. 添加Prometheus数据源

Docker环境部署Prometheus实践插图(12)

3. 导入监控模板

使用编号导入模板,Grafana服务需要联网,否则需要到Grafana模板下载JSON文件导入。

Docker环境部署Prometheus实践插图(13)

下面是我使用的几个模板,导入后可以根据自己的情况定义变量值

Docker环境部署Prometheus实践插图(14)

  • 主机监控展示看板Node-exporter导入 8919 模板
  • 容器监控展示看板cadvisor-exporter导入193 模板
  • 应用监控展示看板jmx-exporter导入8563 模板
  • Redis监控展示看板Redis-exporter导入2751 模板
  • 进程监控展示看板Process-exporter导入249 模板

六、PromQL语句

七、使用Concul HTTP注册方式实现服务发现

一般是用服务发现需要应用需要服务注册,我们这边因为微服务改造还没完成,还有一些tomcat和weblogic中间件,而且选用的注册中心是Eurka,所以为了在代码不改动的情况下使用服务发现,选择了concul 作为注册中心,因为是consul是可以通过http方式注册的。

1. consul 内部原理

Docker环境部署Prometheus实践插图(15)

Consul分为Client和Server两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到Server;Server节点有一个Leader和多个Follower,Leader节点会将数据同步到Follower,Server的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader。

集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。单个数据中心的流言协议同时使用TCP和UDP通信,并且都使用8301端口。跨数据中心的流言协议也同时使用TCP和UDP通信,端口使用8302。

集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据轻微陈旧的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。

具体consul的原理及架构请访问:http://blog.didispace.com/consul-service-discovery-exp/

2. 使用docker部署consul 集群

浏览器访问容器映射的8900端口:

Docker环境部署Prometheus实践插图(16)

3. 服务注册到Consul

使用HTTP API 方式注册node-exporter服务到Consul

解注册:

注册多个服务到consul,使用脚本:

Docker环境部署Prometheus实践插图(17)

4. Prometheus 配置consul 服务发现

consul 可以使用的元标签:

修改Prometheus.yml 文件,使用relabel将consul的元标签重写便于查看

Prometheus 热加载更新

访问Prometheus web页面

Docker环境部署Prometheus实践插图(18)

应用注册到consul

在不需要开发修改代码的前提下,我们可以使用Prometheus的jmx-exporter收集应用的相关指标,在应用中间件tomcat/weblogic等调用jmx-exporter,具体方式查看https://www.jianshu.com/p/dfd6ba5206dc

启动应用后会启动12345端口暴露jvm数据,现在我们要做的就是将这个端口注册到Consul上,然后Prometheus会从consul 拉取应用主机。

使用脚本实现

执行脚本注册到consul

Docker环境部署Prometheus实践插图(19)

配置Grafana JVM 监控模板

Load 8563模板

Docker环境部署Prometheus实践插图(20)

原文来自:https://www.jianshu.com/p/dde0dc1761ec 作者:Anson_前行

本文链接:http://www.yunweipai.com/38765.html

网友评论comments

发表评论

电子邮件地址不会被公开。

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部