使用prometheus-operator构建监控系统 (三) —— 设置自定义告警规则监告警
>根据生产环境的需求,自定义监控指标,并配置触发告警规则后告警信息自动发送到邮箱
### 1.清除原来服务默认的监控指标数据
查看默认的监控指标规则
kubectl get PrometheusRule -n monitoring
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623737469884031.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)删除所有规则
kubectl delete PrometheusRule alertmanager-main-rules kube-prometheus-rules kube-state-metrics-rules kubernetes-monitoring-rules node-exporter
-rules prometheus-k8s-prometheus-rules prometheus-operator-rules -n monitoring
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623737572178289.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)删除完告警规则之后,在prometheus的UI界面查看验证规则是否全部清空
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623737800317278.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
### 2. 自定义监控指标
```
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus: k8s
role: alert-rules
name: host-rules
namespace: monitoring
spec:
groups:
- name: 主机状态-监控告警
rules:
- alert: 主机状态
expr: up == 0
for: 1m
labels:
status: 非常严重
annotations:
summary: "{{$labels.instance}}:服务器宕机"
description: "{{$labels.instance}}:服务器延时超过5分钟"
- alert: CPU使用情况
expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 60
for: 1m
labels:
status: 一般告警
annotations:
summary: "{{$labels.mountpoint}} CPU使用率过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }} CPU使用大于60%(目前使用:{{$value}}%)"
- alert: 内存使用
expr: 100 -(node_memory_MemTotal_bytes -node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes ) / node_memory_MemTotal_bytes * 100> 80
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 内存使用率过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }} 内存使用大于80%(目前使用:{{$value}}%)"
- alert: IO性能
expr: 100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入磁盘IO使用率过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }} 流入磁盘IO大于60%(目前使用:{{$value}})"
- alert: 网络
expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入网络带宽过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }}流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: 网络
expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流出网络带宽过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }}流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: TCP会话
expr: node_netstat_Tcp_CurrEstab > 1000
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} TCP_ESTABLISHED过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }} TCP_ESTABLISHED大于1000%(目前使用:{{$value}}%)"
- alert: 磁盘容量
expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 80
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 磁盘分区使用率过高!"
description: "{{$labels.instance}}:{{$labels.mountpoint }} 磁盘分区使用大于80%(目前使用:{{$value}}%)"
```
创建完规则后在prometheus的UI界面验证规则是否生效
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623738140947201.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
因为这里定义的全部都是主机的一些资源使用信息,使用的指标抽取器为系统默认的指标抽取器,不需要再单独定义
### 3. 配置邮箱告警
```
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:25'
smtp_from: 'test@163.com'
smtp_auth_username: 'test@163.com'
smtp_auth_password: 'GGTEWBFHFGJGCBXFVD'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 10s
repeat_interval: 30s
receiver: 'mail'
receivers:
- name: 'mail'
email_configs:
- to: 'test@163.com'
send_resolved: true
```
kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring
当环境的资源使用率触发了定义的告警规则之后会自动将告警信息发送到邮箱中
### 配置一个k8s环境中展示Pod重启次数的监控模板
#### 首先在prometheus的搜索栏中用PromSQL语句筛选示例
选取monitoring名称空间下的所有Pod的重启次数
kube_pod_container_status_restarts_total{namespace="monitoring"}
#### 在grafana的展示界面中创建自定义模板
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623738936178168.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
选择prometheus的数据源
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623738975319252.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)配置面板
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623739460143537.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)重命名模板参数
![image.png](http://www.icode9.com/i/li/?n=2&i=images/20210615/1623739548824531.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)