配置alertmanager-发送报警

Prometheus 一条告警的触发流程、等待时间

报警处理流程如下:

  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时间间隔后重复发送。

同时最后至于警报信息具体发给谁,满足什么样的条件下指定警报接收人,设置不同报警发送频率,这里有alertmanager的route路由规则进行配置。

配置alertmanager

报警:指prometheus将监测到的异常事件发送给alertmanager
通知:alertmanager将报警信息发送到邮件、微信、钉钉等

创建alertmanager配置文件到qq邮箱

alertmanager-cm.yaml文件上传到k8s的k8smaster1节点
链接:https://pan.baidu.com/s/1yWdQMvUTOvAX_KaSCOc2rA?pwd=j2kg
提取码:j2kg

cat alertmanager-cm.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor-sa
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:25'
      smtp_from: '***2657@163.com'
      smtp_auth_username: '***2657@163.com'
      smtp_auth_password: ' ***HWEUJM'
      smtp_require_tls: false
    route:  #用于配置告警分发策略
      group_by: [alertname] # 采用哪个标签来作为分组依据
      group_wait: 10s       # 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
      group_interval: 10s    # 上下两组发送告警的间隔时间
      repeat_interval: 10m    # 重复发送告警的时间,减少相同邮件的发送频率,默认是1h
      receiver: default-receiver  #定义谁来收告警
    receivers:
    - name: 'default-receiver'
      email_configs:
      - to: '***647@qq.com'
        send_resolved: true

alertmanager配置文件解释说明:
smtp_smarthost: 'smtp.163.com:25'
#163邮箱的SMTP服务器地址+端口
smtp_from: '***2657@163.com'
#这是指定从哪个邮箱发送报警
smtp_auth_username: '***2657@163.com'
smtp_auth_password: ' ***HWEUJM'
#这是发送邮箱的授权码而不是登录密码,你们需要用自己的,不要用我的,用我的你会发不出来报警

email_configs:
      - to: '***647@qq.com'
#to后面指定发送到哪个邮箱,我发送到我的qq邮箱,大家需要写自己的邮箱地址,不应该跟smtp_from的邮箱名字重复

  route:  #用于设置告警的分发策略
      group_by: [alertname] 
#alertmanager会根据group_by配置将Alert分组
      group_wait: 10s      
 # 分组等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
      group_interval: 10s   # 上下两组发送告警的间隔时间
      repeat_interval: 10m    # 重复发送告警的时间,减少相同邮件的发送频率,默认是1h
      receiver: default-receiver  #定义谁来收告警
kubectl apply -f alertmanager-cm.yaml

创建prometheus和告警规则配置文件

prometheus-alertmanager-cfg.yaml文件上传到k8s的k8smaster1节点
链接:https://pan.baidu.com/s/1RKD4coRKf7drFirMu6KS-A?pwd=p2z5
提取码:p2z5

修改job里kubernetes-etcd 配置IP 192.168.40.110 为你自己的IP

    - job_name: 'kubernetes-etcd'
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/ca.crt
        cert_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/server.crt
        key_file: /var/run/secrets/kubernetes.io/k8s-certs/etcd/server.key
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.40.110:2379']

kubectl delete -f prometheus-cfg.yaml
kubectl apply -f prometheus-alertmanager-cfg.yaml

安装prometheus和alertmanager

alertmanager.tar.gz镜像包上传的k8s的各个工作节点,手动解压:
链接:https://pan.baidu.com/s/1aT0yqtF06GBQ-sGU5HZpCw?pwd=wly8
提取码:wly8

ctr -n=k8s.io images import  alertmanager.tar.gz

prometheus-alertmanager-deploy.yaml文件上传到k8s的控制节点k8smaster1上:
注意:配置文件指定了nodeName:这个位置要写你自己环境的k8s的node节点名字
链接:https://pan.baidu.com/s/1cTIdWz4q_DTxC09_uZTH2g?pwd=udds
提取码:udds

生成一个etcd-certs,这个在部署prometheus需要

kubectl -n monitor-sa create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.key  --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/ca.crt

通过kubectl apply更新资源清单yaml文件

kubectl delete -f prometheus-deploy.yaml
kubectl apply -f prometheus-alertmanager-deploy.yaml

查看prometheus是否部署成功

kubectl get pods -n monitor-sa | grep prometheus

在这里插入图片描述

部署alertmanager的service,方便在浏览器访问
alertmanager-svc.yaml文件上传到k8s的控制节点k8smaster1:
链接:https://pan.baidu.com/s/18_VLXMiBlhPtm7sZvDaToQ?pwd=5ktr
提取码:5ktr

kubectl apply -f alertmanager-svc.yaml

#查看service在物理机映射的端口

kubectl get svc -n monitor-sa

在这里插入图片描述

注意:上面可以看到prometheus的service在物理机映射的端口是31090,alertmanager的service在物理机映射的端口是30066
http://192.168.40.110:30066/#/alerts
在这里插入图片描述

访问prometheus的web界面
点击Alerts,可看到如下.

在这里插入图片描述

查看详细告警信息

在这里插入图片描述

在这里插入图片描述

扩展:暴力更新配置文件

修改prometheus任何一个配置文件之后,可通过kubectl apply使配置生效,执行顺序如下:

kubectl delete -f alertmanager-cm.yaml
kubectl apply -f alertmanager-cm.yaml
kubectl delete -f prometheus-alertmanager-cfg.yaml
kubectl apply  -f prometheus-alertmanager-cfg.yaml 
kubectl delete -f  prometheus-alertmanager-deploy.yaml
kubectl apply  -f prometheus-alertmanager-deploy.yaml

创建alertmanager配置文件发送到钉钉

打开电脑版钉钉创建机器人
1.创建钉钉机器人
打开电脑版钉钉,创建一个群,创建自定义机器人,按如下步骤创建
https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
https://developers.dingtalk.com/document/app/custom-robot-access

我创建的机器人如下:

群设置–>智能群助手–>添加机器人–>自定义–>添加

机器人名称:test
接收群组:钉钉报警测试

安全设置:
自定义关键词:cluster1

上面配置好之后点击完成即可,这样就会创建一个test的报警机器人,创建机器人成功之后怎么查看webhook,按如下:

点击智能群助手,可以看到刚才创建的test这个机器人,点击test,就会进入到test机器人的设置界面
出现如下内容:
机器人名称:test
接受群组:钉钉报警测试
消息推送:开启
webhook:
https://oapi.dingtalk.com/robot/send?access_token=8a53475677339a11cec453c608543c3d85ea73b330ea70c4b2de96a0839cbb90
安全设置:
自定义关键词:cluster1

安装钉钉的webhook插件,在k8s的控制节点k8smaster1操作
prometheus-webhook-dingtalk-0.3.0.linux-amd64.tar.gz
链接:https://pan.baidu.com/s/14FedEqCtBlxiiHWOxfJVWQ?pwd=lv83
提取码:lv83
解压后

cd prometheus-webhook-dingtalk-0.3.0.linux-amd64

启动钉钉报警插件

nohup ./prometheus-webhook-dingtalk --web.listen-address="0.0.0.0:8060" --ding.profile="cluster1=https://oapi.dingtalk.com/robot/send?access_token=8a53475677339a11cec453c608543c3d85ea73b330ea70c4b2de96a0839cbb90" &

修改alertmanager-cm.yaml

对原来的alertmanager-cm.yaml文件做备份

cp alertmanager-cm.yaml alertmanager-cm.yaml.bak

重新生成一个新的alertmanager-cm.yaml文件

cat >alertmanager-cm.yaml <<EOF
kind: ConfigMap
apiVersion: v1
metadata:
  name: alertmanager
  namespace: monitor-sa
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.163.com:25'
      smtp_from: '1501157****@163.com'
      smtp_auth_username: '1501157****'
      smtp_auth_password:******HWEUJM'
      smtp_require_tls: false
    route:
      group_by: [alertname]
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 10m
      receiver: cluster1
    receivers:
    - name: cluster1
      webhook_configs:
      - url: 'http://192.168.40.110:8060/dingtalk/cluster1/send'
        send_resolved: true
EOF

修改prometheus任何一个配置文件之后,可通过kubectl apply使配置生效,执行顺序如下:

kubectl  delete -f  alertmanager-cm.yaml
kubectl apply  -f alertmanager-cm.yaml
kubectl  delete -f prometheus-alertmanager-cfg.yaml
kubectl  apply  -f prometheus-alertmanager-cfg.yaml 
kubectl  delete -f  prometheus-alertmanager-deploy.yaml
kubectl  apply  -f prometheus-alertmanager-deploy.yaml

创建alertmanager配置文件发送到微信

注册企业微信
登陆网址:
https://work.weixin.qq.com/

找到应用管理,创建应用
应用名字wechat
创建成功之后显示如下:
在这里插入图片描述

AgentId:1000003
Secret:Ov5SWq_JqrolsOj6dD4Jg9qaMu1TTaDzVTCrXHcjlFs

修改alertmanager-cm.yaml

global:
    smtp_smarthost: 'smtp.163.com:25'
    smtp_from: '****72657@163.com'
    smtp_auth_username: '****2657'
    smtp_auth_password: 'BGWHYUOSOOHWEUJM'
    smtp_require_tls: false
route:
    group_by: [alertname]
    group_wait: 10s
    group_interval: 10s
    repeat_interval: 3m
    receiver: "prometheus"
receivers:
- name: 'prometheus'
  wechat_configs:
  - corp_id: wwa82df90a693abb15
    to_user: '@all'
    agent_id: 1000003
    api_secret: Ov5SWq_JqrolsOj6dD4Jg9qaMu1TTaDzVTCrXHcjlFs
参数说明:
secret: 企业微信("企业应用"-->"自定应用"[Prometheus]--> "Secret") 
wechat是本人自创建应用名称
corp_id: 企业信息("我的企业"--->"CorpID"[在底部])
agent_id: 企业微信("企业应用"-->"自定应用"[Prometheus]--> "AgentId") 
wechat是自创建应用名称 #在这创建的应用名字是wechat,那么在配置route时,receiver也应该是Prometheus
to_user: '@all' :发送报警到所有人

Prometheus监控扩展

promethues采集tomcat监控数据

https://note.youdao.com/ynoteshare/index.html?id=0ddfc17eaf7bac94ad4497d7f5356213&type=note

promethues采集redis监控数据

https://note.youdao.com/ynoteshare/index.html?id=b9f87092ce8859cd583967677ea332df&type=note

Prometheus监控mysql

mysqld_exporter-0.10.0.linux-amd64.tar.gz
链接:https://pan.baidu.com/s/1C-OnIetUyMLJpLQa0EwSdw?pwd=wljs
提取码:wljs

yum install mysql -y
yum install mariadb  -y
tar -xvf mysqld_exporter-0.10.0.linux-amd64.tar.gz
cd mysqld_exporter-0.10.0.linux-amd64
cp -ar mysqld_exporter /usr/local/bin/
chmod +x /usr/local/bin/mysqld_exporter

登陆mysql为mysql_exporter创建账号并授权

mysql> CREATE USER 'mysql_exporter'@'localhost' IDENTIFIED BY 'Abcdef123!.';

对mysql_exporter用户授权

mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'localhost';
exit 
创建mysql配置文件、运行时可免密码连接数据库:
cd mysqld_exporter-0.10.0.linux-amd64
cat my.cnf
[client]
user=mysql_exporter
password=Abcdef123!.

启动mysql_exporter客户端

nohup ./mysqld_exporter --config.my-cnf=./my.cnf &

mysqld_exporter的监听端口是9104

修改prometheus-alertmanager-cfg.yaml文件,添加如下

  - job_name: 'mysql'
    static_configs:
    - targets: ['192.168.40.110:9104']
kubectl apply -f prometheus-alertmanager-cfg.yaml
kubectl delete -f prometheus-alertmanager-deploy.yaml
kubectl apply -f prometheus-alertmanager-deploy.yaml

grafana导入mysql监控图表mysql-overview_rev5.json
链接:https://pan.baidu.com/s/12aphXR4gwMyqqwFts9tvGA?pwd=xvab
提取码:xvab

Prometheus监控Nginx

笔记:
https://note.youdao.com/ynoteshare/index.html?id=bea7b4b8f9a78db1679e1ac2ab747da5&type=note

prometheus监控mongodb

笔记:
https://note.youdao.com/ynoteshare/index.html?id=39b54acb1fbc0199f966115ce9523bb6&type=note

Prometheus PromQL语法

PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它可以对时序数据进行筛选和聚合。

数据类型

PromQL 表达式计算出来的值有以下几种类型:

  • 瞬时向量 (Instant vector): 一组时序,每个时序只有一个采样值
  • 区间向量 (Range vector): 一组时序,每个时序包含一段时间内的多个采样值
  • 标量数据 (Scalar): 一个浮点数
  • 字符串 (String): 一个字符串,暂时未用

瞬时向量选择器

瞬时向量选择器用来选择一组时序在某个采样点的采样值。

最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。比如下面的表达式:

apiserver_request_total

在这里插入图片描述

可以通过在后面添加用大括号包围起来的一组标签键值对来对时序进行过滤。比如下面的表达式筛选出了 job 为 kubernetes-apiservers,并且 resource为 pod的时序:

apiserver_request_total{job="kubernetes-apiserver",resource="pods"}
匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符:
=:完全相等
!=: 不相等
=~: 正则表达式匹配
!~: 正则表达式不匹配

下面的表达式筛选出了container是kube-scheduler或kube-proxy或kube-apiserver的时序数据

container_processes{container=~"kube-scheduler|kube-proxy|kube-apiserver"}

区间向量选择器

区间向量选择器类似于瞬时向量选择器,不同的是它选择的是过去一段时间的采样值。可以通过在瞬时向量选择器后面添加包含在 [] 里的时长来得到区间向量选择器。比如下面的表达式选出了所有度量指标为apiserver_request_total且resource是pod的时序在过去1 分钟的采样值。

apiserver_request_total{job="kubernetes-apiserver",resource="pods"}[1m]

在这里插入图片描述

这个不支持Graph,需要选择Console,才会看到采集的数据

说明:时长的单位可以是下面几种之一:
s:seconds
m:minutes
h:hours
d:days
w:weeks
y:years

偏移向量选择器

前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用 offset 来指定要偏移的量。比如下面的表达式选择度量名称为apiserver_request_total的所有时序在 5 分钟前的采样值。

apiserver_request_total{job="kubernetes-apiserver",resource="pods"} offset 5m

在这里插入图片描述

下面的表达式选择apiserver_request_total 度量指标在 1 周前的这个时间点过去 5 分钟的采样值。

apiserver_request_total{job="kubernetes-apiserver",resource="pods"} [5m] offset 1w

聚合操作符

PromQL 的聚合操作符用来将向量里的元素聚合得更少。总共有下面这些聚合操作符:
sum:求和
min:最小值
max:最大值
avg:平均值
stddev:标准差
stdvar:方差
count:元素个数
count_values:等于某值的元素个数
bottomk:最小的 k 个元素
topk:最大的 k 个元素
quantile:分位数

如:

计算k8smaster1节点所有容器总计内存

sum(container_memory_usage_bytes{instance=~"k8smaster1"})/1024/1024/1024

在这里插入图片描述

计算xianchaomaster1节点最近1m所有容器cpu使用率

sum (rate (container_cpu_usage_seconds_total{instance=~"k8smaster1"}[1m])) / sum (machine_cpu_cores{ instance =~"k8smaster1"}) * 100

在这里插入图片描述

计算最近1m所有容器cpu使用率

sum (rate (container_cpu_usage_seconds_total{id!="/"}[1m])) by (id)

在这里插入图片描述

#把id会打印出来
结果如下:
在这里插入图片描述

函数

Prometheus 内置了一些函数来辅助计算,下面介绍一些典型的。
abs():绝对值
sqrt():平方根
exp():指数计算
ln():自然对数
ceil():向上取整
floor():向下取整
round():四舍五入取整
delta():计算区间向量里每一个时序第一个和最后一个的差值
sort():排序

插件Pushgateway,推数据到prometheus server

Pushgateway简介:

  • Pushgateway是prometheus的一个组件
  • prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据)
  • pushgateway则是通过被动方式推送数据到prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给pushgateway, 然后pushgateway再把数据发送给Prometheus server

Pushgateway优点:

  • Prometheus 默认采用定时pull模式拉取targets数据,但是如果不在一个子网或者防火墙,prometheus就拉取不到targets数据,所以可以采用各个target往pushgateway上push数据,然后prometheus去pushgateway上定时pull数据
  • 在监控业务数据的时候,需要将不同数据汇总, 汇总之后的数据可以由pushgateway统一收集,然后由 Prometheus 统一拉取。

pushgateway缺点:

  • Prometheus拉取状态只针对 pushgateway, 不能对每个节点都有效;
  • Pushgateway出现问题,整个采集到的数据都会出现问题
  • 监控下线,prometheus还会拉取到旧的监控数据,需要手动清理 pushgateway不要的数据。

安装pushgateway

在k8s-node节点(192.168.40.111)操作:
链接:https://pan.baidu.com/s/1TNnmlTX2-ADq2wzlIxnOYA?pwd=xjpr
提取码:xjpr

docker load -i pushgateway.tar.gz
docker run -d --name pushgateway -p 9091:9091 prom/pushgateway

在浏览器访问192.168.40.111:9091出现如下ui界面

在这里插入图片描述

修改prometheus-alertmanager-cfg.yaml文件,在k8s-master节点操作
添加如下job

    - job_name: 'pushgateway'
      honor_labels: true
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.40.111:9091']

在这里插入图片描述

kubectl apply -f prometheus-alertmanager-cfg.yaml
kubectl delete -f prometheus-alertmanager-deploy.yaml
kubectl apply -f prometheus-alertmanager-deploy.yaml

在prometheus的targets列表可以看到pushgateway

在这里插入图片描述

被监控服务器执行 推送指定的数据格式到pushgateway

#向 {job="test_job"} 添加单条数据:
echo " metric 3.6" | curl --data-binary @- http://192.168.40.111:9091/metrics/job/test_job

在这里插入图片描述

注:–data-binary 表示发送二进制数据,注意:它是使用POST方式发送的!

添加复杂数据

cat <<EOF | curl --data-binary @- http://192.168.40.111:9091/metrics/job/test_job/instance/test_instance
#TYPE node_memory_usage gauge
node_memory_usage 36
# TYPE memory_total gauge
node_memory_total 36000
EOF

在这里插入图片描述

删除某个组下某个实例的所有数据

curl -X DELETE http://192.168.40.111:9091/metrics/job/test_job/instance/test_instance

删除某个组下的所有数据:

curl -X DELETE http://192.168.40.111:9091/metrics/job/test_job

把数据上报到pushgateway
在被监控服务所在的机器配置数据上报,想要把192.168.40.111这个机器的内存数据上报到pushgateway,下面步骤需要在192.168.40.111操作

cat push.sh
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.40.111"
cat <<EOF | curl --data-binary @- http://192.168.40.111:9091/metrics/job/$job_name/instance/$instance_name
#TYPE node_memory_usages  gauge
node_memory_usages $node_memory_usages
EOF
chmod +x push.sh
sh push.sh

打开pushgateway web ui界面,可看到如下:
在这里插入图片描述
打开prometheus ui界面,可看到如下node_memory_usages的metrics指标

node_memory_usages

在这里插入图片描述

设置计划任务,定时上报数据

crontab -e
*/1 * * * * /usr/bin/bash  /root/push.sh

注意:从上面配置可以看到,我们上传到pushgateway中的数据有job也有instance,而prometheus配置pushgateway这个job_name中也有job和instance,这个job和instance是指pushgateway实例本身,添加 honor_labels: true 参数, 可以避免promethues的targets列表中的job_name是pushgateway的 job 、instance 和上报到pushgateway数据的job和instance冲突。

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值