前面基础用法我们已经有所了解了,但部署永远都是第一步。如果想要稳定运行下去集群的监控是必须的
这里我们使用一个新的工具,"Prometheus"来监控我们的集群。不过再此之前,我们要了解一些不要的信息
一. 监控的目标
#一个监控系统需要能够有效的⽀持"⽩盒监控"和"⿊盒监控"
#可以在系统或者服务在发⽣故障时能够快速通知相关的⼈员进⾏处理。
1.黑盒监控 #通常是在外部对主机或服务的观察方式
#比如curl的状态码、能否ping通、端口或进程什么的
2.白盒监控 #获取资源的详细信息,通过这些信息来对可能发生的故障进行预防
#比如: 可以通过查看某段时间范围内新增的磁盘容量,来推算什么时候可能会满,等等更详细的信息去做预防操作
二. promethues架构
#官方地址
https://prometheus.io/
#上述架构图中组件的作用
prometheus server #监控服务端,用于收集、存储、查询数据
pushgateway #将自定义监控项收集整合再推送到prometheus上存储
job/exporters #会收集节点上的资源指标信息,推送、拉取到pushgateway或proetheus
alertmanager #根据规则进行报警
grafana #好看的监控页面
service discovery #我们可以通过k8s的api动态发现集群的信息
#眼看十遍不如操作一遍,看不懂没关系,接着走
三. prometheus数据模型
Prometheus会将所有采集到的样本数据以"时间序列"的⽅式保存在内存数据库中并且定时保存到硬盘上。
而"时间序列"是按照 "时间戳" 和 "值" 的序列顺序存放的,我们称之为向量(vector).
每条"时间序列"通过指标名称(metrics name)和⼀组标签集(labelset)命名
#如下图
#x轴表示时间
#y轴表示数据值
Y轴
4 |
3 | | |
2 | | | | |
1 | | | | |
0 9:01 9:02 9:03 9:04 9:05 -->x轴
#通常来说,时间序列可以定义为一个数据点的序列
#这些数据点会按照时间的顺序,从一个数据源来进行索引
#在prometheus的范围内,这些数据点是在固定的时间间隔内收集的。
#因此这种数据以图形形式表示时,通常会绘制数据随时间进行变更。(动态)
四. prometheus中时间序列的表示方法
#在上图时间序列中的每⼀个"|"称为⼀个样本(sample),由以下三部分组成
1.指标(metric) #被测量的目标的属性,比如服务器的主机名、集群名称等
2.测量值(value) #一个目标可能有多个值,每个测量值对应一个具体的指标。比如服务器的CPU使用率、磁盘IO等
3.时间戳(timestamp) #标记数据的时间戳
格式如下
#指标 #时间戳 #测量值
<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355
http_request_total{status="200", method="GET"}@1434417561287 => 94334
http_request_total{status="404", method="GET"}@1434417560938 => 38473
http_request_total{status="404", method="GET"}@1434417561287 => 38544
http_request_total{status="200", method="POST"}@1434417560938 => 4748
http_request_total{status="200", method="POST"}@1434417561287 => 4785
五. 指标的使用
#格式
<metric_name>[{<label_1="value_1">,<label_N="value_N">}] <datapoint_numerical_value>
语法含义
1. <metric_name> #指标名称,通常为某个属性的值,比如cpu大小、使用率、延迟等
#每个属性都有单独的指标名称,一般情况下名称和作用相同
#如 http_request_total 表示当前系统接收到的HTTP请求总量
2. [{<label_1="value_1">,<label_N="value_N">}]
#k/v形式展示,我们通常会设置多个标签来对查询的数据进⾏过滤、聚合等。下面有个小案例
3. <datapoint_numerical_value> #数据值的范围
标签查询案例
#比如,我想要匹配的是localhost主机上prometheus的metrics页面http请求总量
prometheus_http_requests_total{instance="localhost:9090",handler="/metrics"}
#返回
prometheus_http_requests_total{code="200", handler="/metrics", instance="localhost:9090", job="prometheus"} 63
小知识
在使用标签时要注意,以" __ "作为前缀的标签,是系统保留的关键字,只能在系统内部使⽤。
在Prometheus的底层实现中,指标名称实际上是以 __name__=<metrics name> 的形式保存在数据库中的
#如下的prometheus查看/metrics请求总量的时间序列
prometheus_http_requests_total{instance="localhost:9090",handler="/metrics"}
#实际上等同于下面的语句
{__name__="prometheus_http_requests_total",instance="localhost:9090",handler="/metrics"}
#所以再碰到这种语句不要无辜脸 (⊙ˍ⊙)
六. 部署prometheus服务
(~ ̄▽ ̄)~ 费劲的都过去了,开始正式部署把。
为了好理解,先以服务形式部署,然后再用k8s模式
#获取prometheus主体文件(代下载地址#http://gitd.cc/)
wget https://github.com/prometheus/prometheus/releases/download/v2.24.1/prometheus-2.24.1.linux-amd64.tar.gz
#或者用我的
https://download.csdn.net/download/qq_42883074/15646951
#解压软件包
tar -zxvf prometheus-2.24.1.linux-amd64.tar.gz
#创建目录
mkdir -p /usr/share/prometheus/
mkdir -p /etc/prometheus/
touch /etc/prometheus/prometheus.yml
#拷贝主体中的控制台目录、及控制台的库文件
cp -r consoles console_libraries/ /usr/share/prometheus/
#拷贝服务执行文件
cp promtool prometheus /usr/bin/
每次都用二进制文件启停有点麻烦,我们添加到systemd管理
1. 添加服务文件
cat > /usr/lib/systemd/system/prometheus.service <<EOF
[Unit]
Description=The Prometheus monitoring system and time series database.
Documentation=https://prometheus.io
After=network.target
[Service]
User=root
LimitNOFILE=8192
ExecStart=/usr/bin/prometheus \\
--config.file=/etc/prometheus/prometheus.yml \\
--storage.tsdb.path=/var/lib/prometheus/data \\
--web.console.templates=/usr/share/prometheus/consoles \\
--web.console.libraries=/usr/share/prometheus/console_libraries \\
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
2. 启动服务
systemctl daemon-reload
systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus
#prometheus的端口是9090
192.168.1.20:9090