💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
部署与应用
技能目标
-
理解
Prometheus
的常用组件
-
理解配置文件与核心功能使用
-
掌握
Kubeadm
方式部署
Prometheus
监控
-
掌握
Prometheus+Grafana
图表展示
5.1 Prometheus+Grafana 监控概述
5.1.1 什么是 Prometheus
Prometheus
(普罗米修斯)是一个最初在
SoundCloud
上构建的监控系统。自
2012
年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,
Prometheus
于
2016
年加入云原生云计算基金会(
CNCF
),成为继
Kubernetes
之后的第
二个托管项目。
事实上,作为新一代的监控框架,
Prometheus
具有以下特点:
多维数据模型:由度量名称和键值对标识的时间序列数据;
PromSQL
:一种灵活的查询语言,可以利用多维数据完成复杂的查询;
不依赖分布式存储,单个服务器节点可直接工作;
基于
HTTP
的
pull
方式采集时间序列数据;
推送时间序列数据通过
PushGateway
组件支持;
通过服务发现或静态配置发现目标;
多种图形模式及仪表盘支持。
Prometheus
适用于以机器为中心的监控以及高度动态面向服务架构的监控。
5.1.2 什么是 Grafana
Grafana
是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪
表盘和图形编辑器,支持
Graphite
、
zabbix
、
InfluxDB
、
Prometheus
、
OpenTSDB
、
Elasticsearch
等作为数据源,比
Prometheus
自带的图表展示功能强大太多,更加灵活,
有丰富的插件,功能更加强大。本章推荐使用的监控图表模板,集群资源监控模板
id
:
3116
,主机
Node
监控模板
id
:
9276
。在后期使用图表展示时可以通过
id
号导入所需的
监控模板。
5.1.3 为什么要用 Prometheus+Grafana 监控
监视应用程序的当前状态是预测问题和发现生产环境中瓶颈的最有效方法之一。监控是
整个产品周期中最重要的一环,及时预警减少故障影响面,而且能根据历史数据追溯问题。
一般在早期服务业务系统很少,通常可以用系统工具来解决,例如经常用到的监控命令
如
free
、
vmstat
、
df
、
top
、
iftop
等,这些适合临时性分析性能及排查故障中使用。随着互
联网
+
时代的发展人们对互联网依赖越来越大,一般常规性监控命令,不能满足现在业务的
需求。目前业内有很多不错的开源产品可供选择,利用开源产品很容易能做到这一点。如表
5-1
所示。
表
5-1 Zabbix,open-Falcon,Premetheus+Grafana
监控对比
监控方案 | 告警 | 特点 | 适用 |
Zabbix | Yes | 大量定制工作 | 大部分的互联网公司 |
open-falcon | Yes | 功能模块分解比较细,显得更复杂 | 系统和应用监控 |
Prometheus+Grafana | Yes | 扩展性好 | 容器、应用、主机全方位监控 |
5.1.3 Prometheus 组件
为了理解
Prometheus
工作原理,先来剖析下
Prometheus
的结构。
Prometheus
主要
包括以下组件,但是其中许多组件是可选的。
1.Prometheus 结构
Prometheus Server
:
用于收集指标和存储时间序列数据,并提供查询接口;
client Library
:
客户端库(例如
Go
,
Python
,
Java
等),为需要监控的服务产
生相应的
/metrics
并暴露给
Prometheus Server
。目前已经有很多软件原生就支持
Prometheus
并提供
/metrics
,可以直接使用。对于像操作系统已经不提供
/metrics
,
可以使用
exporter
,或者自己开发
exporter
来提供
/metrics
服务;
push gateway
:
主要用于临时性的
jobs
。由于这类
jobs
存在时间较短,可能在
Prometheus
来
pull
之前就消失了。
Jobs
定时将指标
push
到
push gateway
,再
由
Prometheus Server
从
Push gateway
上
pull
。这种方式主要用于服务层面的
metrics
;
exporter
:
用于暴露已有的第三方服务的
metrics
给
Prometheus
;
alertmanager
:
从
Prometheus server
端接收到
alerts
后,会进行去除重复数
据,分组,并路由到对应的接受方式,发出报警。常见的接收方式有:电子邮件,
pagerduty
,
OpsGenie, webhook
等;
Web UI
:
Prometheus
内置一个简单的
Web
控制台,可以查询指标,查看配置
信息或者
Service Discovery
等,实际工作中,查看指标或者创建仪表盘通常使
用
Grafana
,
Prometheus
作为
Grafana
的数据源。
2.Prometheus 数据模型
Prometheus
将所有数据存储为时间序列;具有相同度量名称以及标签属于同一个指标。
每个时间序列都由度量标准名称和一组键值对(也称为标签)唯一标识。
时间序列格式:
<metric name>{<label name>=<label value>, ...}
示例:
api_http_requests_total{method="POST", handler="/messages"}
3.Prometheus 指标类型
Counter
:递增的计数器;
Gauge
:可以任意变化的数值;
Histogram
:对一段时间范围内数据进行采样,并对所有数值求和与统计数量;
Summary
:与
Histogram
类似。
4.Prometheus 指标实例
实例:可以抓取的目标称为实例(
Instances
)。
作业:具有相同目标的实例集合称为作业(
Job
)。
5.1.4 Prometheus 配置文件及核心功能使用
Prometheus
的主配置文件是
YAML
格式,使用
--config.file
指定配置文件的位置。以下
列出本节重要的配置项。
1. 全局配置文件
Prometheus
以
scrape_interval
规则周期性从监控目标上收集数据,然后将数据存储到
本地存储上。
scrape_interval
可以设定全局也可以设定单个
metrics
。
Prometheus
以
evaluation_interval
规则周期性对告警规则做计算,然后更新告警状态。
evaluation_interval
只有设定在全局。
global
:全局配置。
alerting
:告警配置。
rule_files
:告警规则。
scrape_configs
:配置数据源,称为
target
,每个
target
用
job_name
命名。又分
为静态配置和服务发现。
global:
\\
默认抓取周期,可用单位
ms
、
smhdwy
,默认
1
分钟
[ scrape_interval: <duration> | default = 1m ]
\\
默认抓取超时时间为
10
秒
[ scrape_timeout: <duration> | default = 10s ]
\\
估算规则的默认周期,默认
1
分钟
[ evaluation_interval: <duration> | default = 1m ]
\\
和外部系统(例如
AlertManager
)通信时为时间序列或者告警(
Alert
)
\\
强制添加的标签列表
external_labels:
[ <labelname>: <labelvalue> ... ]
\\
规则文件列表
rule_files:
[ - <filepath_glob> ... ]
\\
抓取配置列表
scrape_configs:
[ - <scrape_config> ... ]
\\Alertmanager
相关配置
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
\\
远程读写特性相关的配置
remote_write:
[ - <remote_write> ... ]
remote_read:
[ - <remote_read> ... ]
2. 实例作业配置文件
scrape_configs
配置项是根据目标(
target
),以静态方式或者自动发现方式指定配
置任务(
job
)以
http/s
周期性的收到(
scrape/pull
),指定目标(
target
)上的指标数据
(
metric
)。
Prometheus
将收到(
scrape
)的指标(
metric
)数据保存在本地或者远程存储上。
\\
任务名称,自动作为抓取到指标的一个标签
job_name: <job_name>
\\
抓取周期
[ scrape_interval: <duration> | default = <global_config.scrape_interval> ]
\\
每次抓取的超时
[ scrape_timeout: <duration> | default = <global_config.scrape_timeout> ]
\\
从目标抓取指标的
URL
路径
[ metrics_path: <path> | default = /metrics ]
\\
当添加标签发现指标已经有同名标签时,是否保留原有标签不覆盖
[ honor_labels: <boolean> | default = false ]
\\
抓取协议
[ scheme: <scheme> | default = http ]
\\HTTP
请求参数
params:
[ <string>: [<string>, ...] ]
\\
身份验证信息
basic_auth:
[ username: <string> ]
[ password: <secret> ]
[ password_file: <string> ]
\\Authorization
请求头取值
[ bearer_token: <secret> ]
\\
从文件读取
Authorization
请求头
[ bearer_token_file: /path/to/bearer/token/file ]
\\TLS
配置
tls_config:
[ <tls_config> ]
\\
代理配置
[ proxy_url: <string> ]
\\DNS
服务发现配置
dns_sd_configs:
[ - <dns_sd_config> ... ]
\\
文件服务发现配置
file_sd_configs:
[ - <file_sd_config> ... ]
\\K8S
服务发现配置
kubernetes_sd_configs:
[ - <kubernetes_sd_config> ... ]
\\
此
Job
的静态配置的目标列表
static_configs:
[ - <static_config> ... ]
\\
目标重打标签配置
relabel_configs:
[ - <relabel_config> ... ]
\\
指标重打标签配置
metric_relabel_configs:
[ - <relabel_config> ... ]
\\
每次抓取允许的最大样本数量,如果在指标重打标签后,样本数量仍然超过限制,则
整个抓取认为失败
\\0
表示不限制
[ sample_limit: <int> | default = 0
3. Prometheus 主配置标签
relabel_configs
配置文件中的标签可以允许在采集之前对任何目标及其标签进行修改
和替换,利于后期展示和理解,如图
5.1
所示。
图
5.1 relabel_config
配置文件内标签
replace
:默认通过
regex
匹配
source_label
的值,使用
replacement
来引用表达式
匹配的分组;
keep
:删除
regex
与连接不匹配的目标
source_labels
;
drop
:删除
regex
与连接匹配的目标
source_labels
;
labeldrop
:删除
regex
匹配的标签;
labelkeep
:删除
regex
不匹配的标签;
hashmod
:设置
target_label
为
modules
连接的哈希值
source_labels
;
labelmap
:匹配
regex
所有标签名称。然后复制匹配标签的值进行分组,
r
eplacement
分组引用(
${1},${2},…
)替代。
4. 文件服务发现
Prometheus
也提供了服务发现功能,可以从
consul
,
dns
,
kubernetes
,
file
等等多种
来源发现新的目标。其中最简单的是从文件发现服务。
支持服务发现的来源:
azure_sd_configs
//
支持微软云服务发现
consul_sd_configs
//
支持
consul
自动注册服务发现
dns_sd_configs
//
支持
dns
服务发现
ec2_sd_configs
//
支持阿里云服务发现
openstack_sd_configs //
支持
OpenStack
服务发现
file_sd_configs
//
支持文件服务发现
gce_sd_configs
//
支持
GCE
服务发现
kubernetes_sd_configs//
支持
K8s
服务发现
marathon_sd_configs //
支持
Marathon
服务发现
nerve_sd_configs
//
支持
Nerve
服务发现
serverset_sd_configs //
支持
Zookeeper Serverset
服务发现
triton_sd_configs
//
支持
Triton
服务发现
5.2 K8s 集群快速部署 Prometheus
5.2.1 环境介绍
1.本节实验环境
本节结合之前章节
k8s Kubeadm
环境来部署安装
Prometheus
及
Grafana
,实
验环境包括一台
Master
节点,两台
Node
节点,关于本章
kubeadm
环境不做过多介
绍,重点关注
Prometheus
相关内容,具体配置要求如表
5-2
所示。
表
5-2 Kubeadm
安装
Prometheus
环境
主机名 | IP 地址 | 操作系统 | 主要软件 |
k8s-master | 192.168.9.206 | CentOS 7.3 x86_64 | Prometheus,Grafana |
k8s-node01 | 192.168.9.207 | CentOS 7.3 x86_64 | node_exporter |
k8s-node02 | 192.168.9.208 | CentOS 7.3 x86_64 | NFS,node_exporter |
2.实验要求
本节的实验要求如下:
通过
Kubeadm
实现快速部署
Prometheus+Grafana
监控系统。
完成对
K8s
资源监控并使用
Grafana
展示。
完成对
K8s Node
节点基础资源监控并用
Grafana
展示。
3.实现思路本节实验的实现思路大致如下:
(
1
)部署三台主机
K8s Kubeadm
基础环境。
(
2
)准备
Prometheus+Grafana
部署的
yaml
文件。
(
3
)通过
K8s
文件快速部署
Prometheus+Grafana
集群。
(
4
)通过
Grafana
添加数据源导入
K8s
资源监控模板实现
Grafana
图表展示。
4.实验拓扑
本节实验拓扑如图
5.2
所示。
图
5.2 Prometheus
实验拓扑
5.2.2 部署 Prometheus
1. 安装 K8s
通过
Kubeadm
方式安装
K8s
,安装方法可参考 K8s集群部署。
2. 上传 yaml 文件
将编写好的
yaml
文件,上传到
k8s-master
主机的“
root/prometheus
”目录下。
[root@k8s-master prometheus]# ll
-rw-r--r--. 1 root root 644 6
月
22 17:03 alertmanager-configmap.yaml
-rw-r--r--. 1 root root 2194 6
月
22 17:18 alertmanager-deployment.yaml
-rw-r--r--. 1 root root 400 6
月
24 00:10 alertmanager-pvc.yaml
-rw-r--r--. 1 root root 392 6
月
22 16:59 alertmanager-service.yaml
-rw-r--r-- 1 root root 1446 6
月
20 10:50 grafana.yaml
//
部署
Grafana
drwxr-xr-x 2 root root
77 6
月
20 12:24 node
//
部署
Promethues Hosts Agent
二进制文件
-rw-r--r-- 1 root root 5096 6
月
20 12:28 prometheus-configmap.yaml
//Promethues
主配置文件
-rw-r--r-- 1 root root 1080 6
月
19 22:57 prometheus-rbac.yaml
//
授权
Promethues
访问
k8s API
-rw-r--r-- 1 root root 4848 6
月
19 22:57 prometheus-rules.yaml
//Promethues
报警规则
-rw-r--r-- 1 root root 392 6
月
19 22:57 prometheus-service.yaml //Promethues
暴露访问端口
-rw-r--r-- 1 root root 3368 6
月
19 23:17 prometheus-statefulset.yaml //
通过有状态对象部署
Promethues
[root@k8s-master prometheus]#
grep 192.168.9. *.yaml
//
如果
IP
不同则需要修改
alertmanager-pvc.yaml:
server: 192.168.9.208
grafana.yaml:
server: 192.168.9.208
prometheus-configmap.yaml:
- 192.168.9.207:9100
prometheus-configmap.yaml:
- 192.168.9.208:9100
prometheus-statefulset.yaml:
server: 192.168.9.208
3. 应用 Prometheus RBAC 授权
只在
master
节点上执行。
[root@k8s-master prometheus]#
kubectl apply -f prometheus-rbac.yaml
4. 通过 configmap 创建 Prometheus 主配置文件
只在
master
节点上执行。
[root@k8s-master prometheus]#
kubectl apply -f prometheus-configmap.yaml
5. 部署 NFS
在
k8s-node02
节点部署
NFS
服务,可参考
Linux
网络服务nfs服务部署
。
6. 部署 Prometheus 及 Services
Prometheus
部署操作在
master
节点上执行。在执行
yaml
文件部署前需要先在
k8s-node02
节点上完成
NFS
共享存储的安装,并且在所有
node
节点创建挂载目录,配置
过程如下所示。
[root@k8s-node02 ~]#
vim /etc/exports
//
启动
nfs
和
rpcbind
服务
/data/file 192.168.9.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
[root@k8s-node02 ~]#
mkdir -p /data/file/prometheus-data
//k8s-node02
节点执行
[root@k8s-master prometheus]#
kubectl apply -f prometheus-statefulset.yaml
//
有拉取镜像操
作,如果网络较慢可能会失败超时
[root@k8s-master prometheus]#
kubectl apply -f prometheus-service.yaml
7. 查看已部署的 Prometheus Pod 及 svc
Pod
结果为
runing
,说明
Promethues
部署成功,可以用
svc
暴露出来的端口访问
Prometheus
控制台。
[root@k8s-master prometheus]#
kubectl get pod,svc -n kube-system
8. 验证是否部署成功
Prometheus
默认部署完成,只有运行程序的
Node
节点可以从外部访问,可通过如下
设置方式来实现通过任意节点来访问
Prometheus
控制台。三个节点都需要执行。
[root@k8s-master prometheus]#
iptables -P FORWARD ACCEPT
[root@k8s-master prometheus]#
echo 1 > /proc/sys/net/ipv4/ip_forward
如果部署成功,可通过访问
http://192.168.9.206:30090
来查看
Prometheus
的控制台
页面,如图
5.3
所示。
图 5.3 Prometheus 图形界面
5.2.3 部署 Grafana 图表展示
1. 部署 Grafana
在
k8s-master
主机进行操作。需要在部署
Grafana yaml
文件之前创建
Grafana
挂载
的数据目录。
[root@k8s-master prometheus]#
mkdir -p /data/file/grafana-data
//
三个节点均需创建
[root@k8s-master prometheus]#
chmod -R 777 /data/file/grafana-data/
//
三个节点均需创建
[root@k8s-master prometheus]#
kubectl apply -f grafana.yaml
//
有拉取镜像操作
2. 查看 Grafana 部署是否成功
通过查看
Pod
是否为
runing
状态及其暴露的端口,判断
Grafana
部署是否成功。
[root@k8s-master prometheus]#
kubectl get pod,svc -n kube-system
3. 验证并访问 Grafana
如果通过
http://192.168.9.207:30007
能访问到控制台,就说明
Grafana
部署成功。控
制台界面如图
5.4
所示。
图 5.4 Grafana 控制台
5.2.4 监控 k8s Node 节点
Prometheus
社区提供的
NodeExporter
项目可以对主机的关键度量指标进行监控。通
过
Kubernetes
的
DeamonSet
可以在各个主机节点上部署有且仅有一个
NodeExporter
实
例,实现对主机性能指标数据的监控。但由于容器隔离原因,使用容器
NodeExporter
并不
能正确获取到宿主机磁盘信息,故此本章将
NodeExporter
部署到宿主机上来对
Node
进行
监控。
1. 部署 Prometheus Agent 代理
[root@k8s-master prometheus]# cd /root/prometheus/
[root@k8s-master prometheus]# scp -r node 192.168.9.207:/root/
[root@k8s-master prometheus]# scp -r node 192.168.9.208:/root/
执行以下操作,安装
Prometheus Agent
。并通过
netstat
命令判断是否成功。
[root@k8s-node01 node]#
sh node_exporter.sh
[root@k8s-node02 node]#
sh node_exporter.sh
[root@k8s-node01 node]#
netstat -anplt | grep node_export
tcp6
0
0 :::9100
:::*
LISTEN
32399/node_exporter
tcp6
0
0 192.168.9.207:9100
192.168.9.208:19304
ESTABLISHED
32399/node_exporter
[root@k8s-node02 node]#
netstat -anplt | grep node_export
tcp6
0
0 :::9100
:::*
LISTEN
32399/node_exporter
tcp6
0
0 192.168.9.207:9100
192.168.9.208:19304
ESTABLISHED
32399/node_exporter
2. 修改 Prometheus 主配置文件
在
k8s-master
节点上修改
prometheus-configmap.yaml
文件,并重新应用该配置文件。
需要修改的地方已加粗。其中
192.168.9.207-208
是
K8s
的
Node
节点。
[root@k8s-master prometheus]#
vim prometheus-configmap.yaml
#
Prometheus
configuration
format
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: EnsureExists
data:
prometheus.yml: |
rule_files:
- /etc/config/rules/*.rules
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: k8s-nodes
//
需要添加的配置文件
static_configs:
- targets:
- 192.168.9.207:9100
- 192.168.9.208:9100
……
3. 应用 confgmap 配置文件
执行以下操作,使其更新到
Prometheus
主配置文件中。
[root@k8s-master prometheus]#
kubectl apply -f prometheus-configmap.yaml
4. 通过 Prometheus 控制台查看配置文件
访问
http://192.168.9.206:3009/graph
,上方菜单栏单击
Status
链接,之后再单击
Configuration
子链接,可以看到刚刚添加的
K8s Node
节点,如图
5.5
所示。
图 5.5 Configuration 配置项
5. 查看是否更新成功
从图
5.6
中可知,刚添加的
Node
节点,已更新到
Prometheus
配置文件中。
图 5.6 config 配置内容
5.2.5 配置 Grafana Dashbord
1. 创建 k8s-node Dashbord
(
1
)根据
Node id
导入监控模板,并用
Grafana
展示。首先进入控制面板首页,如图
5.7
所示。
图 5.7 Grafana 控制面板
(
2
)添加数据源。单击设置按钮(小齿轮图标),选择“
Data Source
”,如图
5.8
所
示。
图 5.8 选择数据源
(
3
)数据源选择
Prometheus
。鼠标放到
Prometheus
上,选择最右侧的“
Select
”按
钮,如图
5.9
所示。
图 5.9 添加
Prometheus
数据源
(
4
)配置数据源。
HTTP
配置项下的
URL
填写“
http://prometheus:9090
”,这里的
prometheus
是
K8s
集群内的
Service
名,也可以使用
IP
地址代替,如图
5.10
所示。
图 5.10 Prometheus 数据源配置
配置完成后,单击最下方的“
Save & Test
”按钮保存设置。
(
5
)通过
Node id
导入监控模板。单击首页左侧搜索框下面的
+
的按钮。选择
import
按钮,输入监控模板
id
:
9276
。单击
Load
按钮加载即可,最后单击
Import
按钮导入,如
图
5.11
所示。
图 5.11 监控模板导入
(
6
)完成上述步骤后,可以查看到
Node
节点在
Dashbord
监控页面展示情况,如图
5.12
所示。
图 5.12 监控展示页面
2. 创建 k8s 集群资源监控状态 Dashbord
(
1
)重复“创建
k8s-node Dashbord
”的前两步,把模板
id
修改为
3119
,如图
5.13
所示。
图 5.13 导入
3119
资源监控面板
(
2
)创建完成后,如图
5.14
所示。
图 5.14 资源面板状态
至此,
Dashbord
已经正确显示。接下来配置
Alertmanager
报警功能。
5.2.6 部署 Alertmanager 报警
在
Prometheus
平台中,告警由独立的组件
Alertmanager
处理。通常情况下,首先定
位
Prometheus Alertmanager
所在的位置,然后在
Prometheus
配置中创建告警规则,最后
配置
Alertmanager
来处理告警并发送给接收者(邮件,
webhook
、
slack
等)。
1. 报警流程
Prometheus
告警和通知的设置,首先部署
Alertmanager
,然后配置
Prometheus
与
Alertmanager
通信,最后在
Prometheus
中创建告警规则,如图
5.15
所示。
图 5.15 报警流程
2. 配置 Prometheus 与 Alertmanager 通信
[root@k8s-master prometheus]#
vi prometheus-configmap.yaml
//
添加如下内容
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:80"]
2. 在 Prometheus 中创建告警规则
查看报警规则示例。
groups:
- name: example
#
报警规则组名称
rules:
#
任何实例
5
分钟内无法访问发出告警
- alert: InstanceDown
expr: up == 0
for: 5m #
持续时间 , 表示持续一分钟获取不到信息,则触发报警
labels:
severity: page #
自定义标签
annotations:
summary: "Instance {{ $labels.instance }} down" #
自定义摘要
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5
minutes." #
自定义具体描述
3. 告警状态
Alertmanager
中产生告警信息后,这些信息有如下三种状态。
Inactive
:没有触发阈值。
Pending
:已触发阈值,但未满足告警持续时间。
Firing
:已触发阈值且满足告警持续时间。警报发送到
Notification Pipeline
,经过
处理,发送给接受者。
4. 告警发送
route
属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺
序进行匹配。示例如下所示。
route:
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
group_by: [cluster, alertname]
#
所有不匹配以下子路由的告警都将保留在根节点,并发送到
“default-receiver”
routes:
#
所有
service=mysql
或者
service=cassandra
的告警分配到数据库接收端
- receiver: 'database-pager'
group_wait: 10s
match_re:
service: mysql|cassandra
# 所有带有
team=frontend
标签的告警都与此子路由匹配
#
按产品和环境分组的,而不是集群
- receiver: 'frontend-pager'
group_by: [product, environment]
match:
team: frontend
group_by
:报警分组依据;
group_wait
:为一个组发送通知的初始等待时间,默认
30s
;
group_interval
:在发送新告警前的等待时间。通常
5m
或以上;
repeat_interval
:发送重复告警的周期。如果已经发送了通知,再次发送之前需要
等待多长时间。通常
3
小时或以上。
主要处理流程:
(
1
)当接收到
Alert
,根据
labels
判断属于哪些
Route
(可存在多个
Route
,一个
Route
有多个
Group
,一个
Group
有多个
Alert
)。
(
2
)将
Alert
分配到
Group
中,没有则新建
Group
。
(
3
)新的
Group
等待
group_wait
指定的时间(等待时可能收到同一
Group
的
Alert
),
根据
resolve_timeout
判断
Alert
是否解决,然后发送通知。
(
4
)已有的
Group
等待
group_interval
指定的时间,判断
Alert
是否解决,当上次发
送通知到现在的间隔大于
repeat_interval
或者
Group
有更新时会发送通知。
5. 告警收敛(分组、抑制、静默)
告警面临最大问题,是告警条目太多,相当于狼来了的形式。收件人很容易麻木,不再
继续理会,从而导致关键的告警常常被淹没,贻误处理故障的最佳时间。
Alertmanger
在一
定程度上很好的解决了这个问题。
Prometheus
成功的把一条告警发给了
Altermanager
,而
Altermanager
并不是简简单单的直接发送出去,这样就会导致告警信息过多,重要告警被
淹没,它对告警信息做了适当的收敛,如图
5.16
所示。
下面是告警收敛手段:
分组(
group
):将类似性质的警报分类为单个通知;
抑制(
Inhibition
):当警报发出后,停止重复发送由此警报引发的其他警报;
静默(
Silences
):是一种简单的特定时间静音提醒的机制。
图 5.16 告警收敛过程
6. Prometheus 一条告警怎么触发流程
Prometheus 的告警触发流程如图 5.17 所示。
图
5.17
告警触发流程
报警处理流程如下:
(
1
)
Prometheus Server
监控目标主机上暴露的
http
接口(这里假设接口
A
),通过
上述
Promethes
配置的
'scrape_interval'
定义的时间间隔,定期采集目标主机上监控数据。
(
2
)当接口
A
不可用的时候,
Server
端会持续的尝试从接口中取数据,直到
"scrape_timeout"
时间之后停止尝试。这时候把接口的状态变为
“DOWN”
。
(
3
)
Prometheus
同时根据配置的
"evaluation_interval"
的时间间隔,定期(默认
1min
)
的对
Alert Rule
进行评估。当到达评估周期的时候,发现接口
A
为
DOWN
,即
UP=0
为真,
激活
Alert
,进入
“PENDING”
状态,并记录当前
active
的时间。
(
4
)当下一个
alert rule
的评估周期到来的时候,发现
UP=0
继续为真,然后判断警报
Active
的时间是否已经超出
rule
里的
‘for’
持续时间,如果未超出,则进入下一个评估周期;
如果时间超出,则
alert
的状态变为
“FIRING”
;同时调用
Alertmanager
接口,发送相关报警
数据。
(
5
)
Alertmanager
收到告警数据后,会将告警信息进行分组,然后根据
Alertmanager
配置的
“group_wait”
时间先进行等待。等
wait
时间过后再发送报警信息。
(
6
)属于同一个
Alert Group
的警报,在等待的过程中可能进入新的
alert
,如果之前
的报警已经成功发出,那么间隔
“group_interval”
的时间间隔后再重新发送报警信息。比如配
置的是邮件报警,那么同属一个
group
的报警信息会汇总在一个邮件里进行发送。
(
7
) 如 果
Alert Group
里 的 警 报 一 直 没 发 生 变 化 并 且 已 经 成 功 发 送 , 等 待
‘repeat_interval’
时间间隔之后再重复发送相同的报警邮件;如果之前的警报没有成功发送,
则相当于触发第
6
条条件,则需要等待
group_interval
时间间隔后重复发送。
(
8
)最后警报信息具体发给谁,满足什么样的条件下指定警报接收人,设置不同报警
发送频率,由
Alertmanager
的
route
路由规则进行配置。
7. 通过部署 yaml 文件部署 Alertmanager
设置报警邮箱信息。在
k8s-master
上修改
alertmanager-configmap.yaml
,将邮箱配
置参数修改为自己的邮箱,具体操作如下所示。
[root@k8s-master prometheus]#
vi alertmanager-configmap.yaml
//
省略部分内容
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
smtp_smarthost: '
smtp.163.com:25
'
smtp_from: '
18810044263@163.com
'
//
发送邮箱
smtp_auth_username: '
18810044263@163.com
'
//
发送用户
smtp_auth_password: '
yourself_password
'
//
修改为自己的密码
receivers:
- name: default-receiver
email_configs:
- to: "
shikun_zhou@126.com
"
//
修改为接收者邮箱
//
省略部分内容
在
k8s-master
节点上,分别执行
configmap
配置文件、
pvc
存储文件、
Alertmanager
主程序文件,
Services
暴露端口文件。
[root@k8s-node01 ~]#
mkdir /data/file/alertmanager-data/
[root@k8s-node01 ~]#
chmod -R 777 /data/file/alertmanager-data/
[root@k8s-master prometheus]#
kubectl apply -f alertmanager-configmap.yaml
[root@k8s-master prometheus]#
kubectl apply -f alertmanager-pvc.yaml
[root@k8s-master prometheus]#
kubectl apply -f alertmanager-deployment.yaml
[root@k8s-master prometheus]#
kubectl apply -f alertmanager-service.yaml
配置告警,修改
prometheus
主配置文件,指定
rules
目录。
[root@k8s-master prometheus]#
vi prometheus-statefulset.yaml
……
volumeMounts:
- name: config-volume
mountPath: /etc/config
- name: prometheus-data
mountPath: /data
subPath: ""
- name: prometheus-rules
//
新增报警规则内容
mountPath: /etc/config/rules
terminationGracePeriodSeconds: 300
volumes:
- name: config-volume
configMap:
name: prometheus-config
- name: prometheus-rules
//
新增报警规则内容
configMap:
name: prometheus-rules
- name: prometheus-data
persistentVolumeClaim:
claimName: prometheus-data
……
[root@k8s-master prometheus]#
kubectl apply -f prometheus-rules.yaml
[root@k8s-master prometheus]#
kubectl apply -f prometheus-statefulset.yaml
打开
Prometheus
控制台,在上方菜单栏中,单击
Status
链接,之后单击
Rules
。由结
果可知,新增的报警规则已成功添加,如图 5.18 所示。
图 5.18 新增报警规则
验证报警功能。在
k8s-node01
上停掉
Agent
,操作命令如下所示。
[root@k8s-node01 node]#
systemctl stop node_exporter
到
Prometheus
控制的“
Alert
”链接下,根据告警规则,
k8s-node01
节点会先出现
Pending
状态,之后变为
Firing
状态,如图
5.19
和
5.20
所示。
图 5.19 报警
Pending
状态
图 5.20 报警
Firing
状态
此时,查看之前配置的接收邮箱,会看到关于
k8s-node01
的报警信息,如图
5.21
所示。
图 5.21 接收报警信息
至此,
Promethues
监控部署完成。