upload successful

介绍

Prometheus需要多种第三方工具来收集数据,如接下来要使用的cAdvisor和node-exporter,最终Prometheus使用Grafana进行监控数据的展示
Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

Prometheus 的优点

  • 非常少的外部依赖,安装使用超简单
  • 已经有非常多的系统集成 例如:docker HAProxy Nginx JMX等等
  • 服务自动化发现
  • 直接集成到代码
  • 设计思想是按照分布式、微服务架构来实现的

Prometheus 的特性

  • 自定义多维度的数据模型
  • 非常高效的存储 平均一个采样数据占 ~3.5 bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
  • 强大的查询语句
  • 轻松实现数据可视化

Prometheus的牛逼之处

Prometheus是一个非常优秀的监控工具。准确的说,应该是监控方案。Prometheus提供了监控数据搜集,存储,处理,可视化和告警一套完整的解决方案;
可以将它理解为图表显示器,或者资源整合器

下面是Prometheus的框架结构。如图。

upload successful

相关组件:

  • Prometheus Server
    Prometheus Server负责从运行了node-exporter拉取和存储监控数据,并提供一套灵活的查询语言(promQL)供用户使用
  • node-exporter
    exporter负责收集目标对象(host,container。。。)的性能数据,并通过HTTP接口供prometheus server获取
  • WebUI/Grafana/API clients
    是一系列的可视化组件
    监控数据的可视化展示对于监控方案至关重要。之前prometheus自己开发了一套工具,不过后来废弃了,因为开源社区出现了更优秀的产品:Grafana。Grafana能够与Prometheus无缝集成,提供完美的数据展示功能。
  • Alertmanager
    用户可以定义基于数据监控的告警规则,规则会触发告警,会通过预定义的方式发出告警通知。支持的方式包括Email,pagerduty,webhook等

Prometheus的亮点

prometheus最大的亮点和先进性是他的多维数据模型
多维可以理解为,可以从不同的角度去让用户获取到用户想要看到的监控数据,比如同样是监控内存的使用情况,可以监控容器、镜像、user等使用内存的情况。

Prometheus的优势

  • 通过维度对数据进行说明,附加更多的业务信息,进而满足不同业务的需求。同时维度是可以动态添加的,比如再给数据添加一个user维度,就可以按照用户来统计内存的使用量了。
  • prometheus丰富的查询语句能够灵活,充分挖掘数据的价值。比如对数据进行计算,这些只是查询语言中很小的一部分功能。Prometheus 对多维数据进行分片、聚合的强大能力。

主机信息

hostname IP 服务
Server1 172.16.1.16 Docker
Server2 172.16.1.17 Docker

部署监控

node-exporter:负责采集主机的信息和操作系统的信息,以容器的方式运行在监控主机上
cAdvisor:负责采集容器的信息,以容器的方式运行在监控主机上,主要功能:展示主机和容器两个层次的监控数据、展示历史变化数据、在与Prometheus搭配使用时,可以将cAdvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。

下载镜像

只需要在一台中进行下载Prometheus的镜像即可,作为Prometheus服务器
node-exporter主要用来收集主机的硬件使用数据,这样就可以使用cAdvisor和node-exporter将容器与主机的数据都进行了收集

Server1

1
2
3
4
[root@Server1 ~]# docker pull prom/prometheus
[root@Server1 ~]# docker pull prom/node-exporter
[root@Server1 ~]# docker pull google/cadvisor
[root@Server1 ~]# docker pull grafana/grafana

Server2

1
[root@Server2 ~]# docker pull prom/node-exporter

运行export容器

exporter端口为:9100
以下映射的目录大部分都在/var/lib/docker目录下

Server1

1
2
3
4
5
6
7
8
docker run -d -p 9100:9100 --volume /proc/:/host/proc \
--volume /sys/:/host/sys --volume /:/rootfs --name exporter \
prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points \
"^(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers\
|rootfs/var/lib/docker/overlay2\
|rootfs/run/docker/netns|rootfs/var/lib/docker/devicemapper\
|rootfs/var/lib/docker/aufs)($$|/)"

Server2

1
2
3
4
5
6
7
8
docker run -d -p 9100:9100 --volume /proc/:/host/proc \
--volume /sys/:/host/sys --volume /:/rootfs --name exporter \
prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points \
"^(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers\
|rootfs/var/lib/docker/overlay2\
|rootfs/run/docker/netns|rootfs/var/lib/docker/devicemapper\
|rootfs/var/lib/docker/aufs)($$|/)"
1
[root@Server1 ~]# systemctl stop firewalld

访问: http://172.16.1.16:9100/metrics

upload successful

运行cadvisor容器

cAdvisor的端口号是8080

Server1

1
2
3
docker run --volume /:/rootfs:ro --volume /var/run:/var/run:rw \
--volume /sys:/sys:ro --volume /var/lib/docker:/var/lib/docker:ro \
-d -p 8080:8080 --name cadvisor google/cadvisor

Server2

1
2
3
docker run --volume /:/rootfs:ro --volume /var/run:/var/run:rw \
--volume /sys:/sys:ro --volume /var/lib/docker:/var/lib/docker:ro \
-d -p 8080:8080 --name cadvisor google/cadvisor

访问:http://172.16.1.16:8080/metrics

upload successful

运行Prometheus

需要使用一个yml文件来指定需要监控的内容,将两台主机的cAdvisor与exporter监控到的数据拉取到Prometheus Server中
将这个配置文件映射到Prometheus Server的容器中
去官网找示例文件,修改为如下,我这里是使用的官网的最下面的那个示例,截止到startic_configs:
修改内容:rule_files注释掉,添加static_configs:下面的内容,用来指定exporter抓取的数据

Server1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@Server1 ~]# vim prometheus.yml
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # Evaluate rules every 15 seconds.

# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'

rule_files:
# - 'prometheus.rules.yml'

scrape_configs:
- job_name: 'prometheus'

# Override the global default and scrape targets from this job every 5 seconds.
# scrape_interval: 5s

static_configs:
- targets: ['172.16.1.16:9090','172.16.1.16:8080','172.16.1.16:9100','172.16.1.17:8080','172.16.1.17:9100']

在以上文件中,将两台主机的5个ip:port都添加即可,9090为Prometheus Server的端口

1
docker run -d --volume /root/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus -p 9090:9090 prom/prometheus

访问172.16.1.16:9090
upload successful

运行Grafana

使用grafana可以显示更加绚丽的图形化界面
grafana的端口号是3000

1
2
3
[root@Server1 ~]# docker run -d -i --name grafana \
-e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
-e "GF_SECURITY_ADMIN_PASSWORD=secret" -p 3000:3000 grafana/grafana

访问http://172.16.1.16:3000
默认用户名:admin 密码:secret

upload successful

连接Prometheus

upload successful

upload successful

upload successful
点击下方Save & Test 保存
添加监控面板

upload successful
这里需要导入json文件,在grafana官网即可下载;
https://grafana.com/grafana/dashboards?dataSource=prometheus&search=Docker

upload successful

upload successful
导入之后点击Import即可!

由于之前下载了中文版面板,我这里就直接用中文版了,看起来还不错!

upload successful

例:新添加监控主机

如果后期需要新加监控主机,需要在prometheus.yml文件中末尾targets中添加新主机的IP+8080/9100端口,重启cadivsor和Prometheus容器即可!
新加主机:172.16.1.18

1
2
3
4
5
[root@Server1 ~]# vi prometheus.yml
- targets: ['172.16.1.16:9090','172.16.1.16:8080','172.16.1.16:9100','172.16.1.17:8080','172.1172.16.1.18:8080','172.16.1.18:9100']

[root@Server1 ~]# docker restart cadvisor
[root@Server1 ~]# docker restart prometheus

upload successful