prometheus监控K8S
监控告警功能

alertmanager邮箱告警配置
首先开通SMTP服务,QQ邮箱:设置–帐号–开通POP3/SMTP服务,记住生成的密码(其它邮箱同理)

编辑prometheus的values.yaml文件,配置邮箱告警

[root@master01 prometheus]# vi prometheus/values.yaml
# 定位到alertmanager的配置文件,
alertmanagerFiles:alertmanager.yml:global:resolve_timeout: 5m# 邮箱告警配置smtp_hello: 'prometheus'smtp_from: 'xxx@qq.com'smtp_smarthost: 'smtp.qq.com:465'  # 其它邮箱请填写相应的hostsmtp_auth_username: 'xxx@qq.com'smtp_auth_password: 'xxxxxxxxxxxxxxxx'smtp_require_tls: false            # qq邮箱需要设定templates:- '/etc/config/*.tmpl'               # 指定告警模板路径receivers:- name: emailemail_configs:- to: 'x@qq.com'                 #接收报警邮箱地址headers: {"subject":'{{ template "email.header" . }}'}html: '{{ template "email.html" . }}'send_resolved: true            # 发送报警解除邮件route:group_wait: 5s                     # 分组等待时间group_interval: 5s                 # 上下两组发送告警的间隔时间receiver: emailrepeat_interval: 5m                # 重复发送告警时间inhibit_rules:                       # 告警抑制:当多级别规则同时生效时,只发送最高级别的告警- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname']
  template_email.tmpl: |-           # 告警模版{{ define "email.header" }}{{ if eq .Status "firing"}}[Warning]: {{ range .Alerts }}{{ .Annotations.summary }} {{ end }}{{ end }}{{ if eq .Status "resolved"}}[Resolved]: {{ range .Alerts }}{{ .Annotations.resolve_summary }} {{ end }}{{ end }}{{ end }}{{ define "email.html" }}{{ if gt (len .Alerts.Firing) 0 -}}<font color="#FF0000"><h3>[Warning]:</h3></font>{{ range .Alerts }}告警级别:{{ .Labels.severity }}   <br>告警类型:{{ .Labels.alertname }}   <br>故障主机: {{ .Labels.instance }}   <br>告警主题: {{ .Annotations.summary }}   <br>告警详情: {{ .Annotations.description }}   <br>触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}   <br>{{- end }}{{- end }}{{ if gt (len .Alerts.Resolved) 0 -}}<font color="#66CDAA"><h3>[Resolved]:</h3></font>{{ range .Alerts }}告警级别:{{ .Labels.severity }}   <br>告警类型:{{ .Labels.alertname }}   <br>故障主机: {{ .Labels.instance }}   <br>告警主题: {{ .Annotations.resolve_summary }}   <br>告警详情: {{ .Annotations.resolve_description }}   <br>触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}   <br>恢复时间: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}   <br>{{- end }}{{- end }}{{- end }}

prometheus告警规则配置
接着配置告警规则,以“物理节点状态”为例,先在prometheus控制台测试此条告警规则,确保输出有效:up{component="node-exporter"}

在values中配置告警规则(就在alertmanger的配置文件下方)

serverFiles:alerting_rules.yml:groups:- name: 物理节点状态-监控告警rules:- alert: Node-upexpr: up {component="node-exporter"} == 0for: 2slabels:severity: criticalannotations:summary: "服务器{{ $labels.kubernetes_node }}已停止运行!"description: "检测到服务器{{ $labels.kubernetes_node }}已异常停止,IP: {{ $labels.instance }},请排查!"resolve_summary: "服务器{{ $labels.kubernetes_node }}已恢复运行!"resolve_description: "服务器{{ $labels.kubernetes_node }}已恢复运行,IP: {{ $labels.instance }}。"

更新prometheus
编辑完成后,更新prometheus
每次增加规则中都需要upgrage,更新后pod中的“configmap-reload”容器会重载配置文件,可能需要等待几分钟
[root@master01 ]# helm upgrade prometheus -n prometheus .
查询alertmanger的配置文件是否更新(server同理):
[root@master01 prometheus]# kubectl logs -f -n prometheus prometheus-alertmanager-7757db759b-9nq9c prometheus-alertmanager

查询server的configmap(alertmanger同理)
[root@master01 prometheus]# kubectl get configmap -n prometheus
[root@master01 prometheus]# kubectl describe configmaps -n prometheus prometheus-server

在alert控制台查看告警规则是否生效:

告警测试
关掉其中一台节点测试

可观察到Alert中,该告警规则状态由Inactive转到Pending再到Firing,而当状态转为Firing,将发送告警邮件
Pending到Firing的变化默认为1分钟,若想缩短时间,请修改value.yaml中的server.global.scrape_interval字段,如15s

告警邮件

附告警规则
部分参考自阿里云Prometheus监控报警规则

K8S组件状态
target状态
sum by (instance,job) (up)
CPU使用率
round (sum by (instance,job) (rate(process_cpu_seconds_total[2m]) * 100)) > 80
句柄数
sum by (instance,job) (process_open_fds) > 600
虚拟内存
sum by (instance,job) (round(process_virtual_memory_bytes/1024/1024)) > 4096
集群资源状态
资源限制:总CPU资源过载(超过80%)
集群 CPU 过度使用,CPU 已经过度使用无法容忍节点故障

round(sum(kube_pod_container_resource_requests{resource=“cpu”}) / sum(kube_node_status_allocatable{resource=“cpu”})*100) > 80
资源限制:总内存资源过载(超过80%)
集群内存过度使用,内存已经过度使用无法容忍节点故障

round(sum(kube_pod_container_resource_requests{resource=“memory”}) / sum(kube_node_status_allocatable{resource=“memory”})100) > 80
KubeletTooManyPods(Pod过多)
max(max(kubelet_running_pods) by(instance) * on(instance) group_left(node) kubelet_node_name) by(node) / max(kube_node_status_capacity{resource=“pods”} != 1) by(node) > 0.9
Node资源状态
CPU使用率
round((1 - avg(rate(node_cpu_seconds_total{component=“node-exporter”,mode=“idle”}[5m])) by (instance)) * 100)
内存
round((1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes)))
100)
剩余容量
(round((node_filesystem_avail_bytes{fstype=~“ext4|xfs”} / node_filesystem_size_bytes{fstype=~“ext4|xfs”}) * 100 < 30 ) and node_filesystem_readonly{fstype=~“ext4|xfs”} == 0)
预测剩余容量
( round(predict_linear(node_filesystem_avail_bytes{fstype=~“ext4|xfs”}[24h], 7246060)/1024/1024/1024) < 30 and node_filesystem_readonly{fstype=~“ext4|xfs”} == 0 )
节点磁盘的IO使用率
100-(avg(rate(node_disk_io_time_seconds_total[2m])) by(instance)
100) < 80
NodeNetworkReceiveErrs(Node网络接收错误)
sum (increase(node_network_receive_errs_total[2m])) by (instance) > 10
NodeNetworkTransmitErrs(Node网络传输错误)
sum (increase(node_network_transmit_errs_total[2m])) by (instance) > 10
入网流量带宽
持续5分钟高于100M

((sum(rate (node_network_receive_bytes_total{device!~‘tap.|veth.|br.|docker.|virbr*|lo*’}[5m])) by (instance)) /102400) > 100
出网流量带宽
((sum(rate (node_network_transmit_bytes_total{device!~‘tap.|veth.|br.|docker.|virbr*|lo*’}[5m])) by (instance))/102400) > 100
TCP_ESTABLISHED过高
node_netstat_Tcp_CurrEstab > 1000
Pod
PodCpu75(Pod的CPU使用率大于75%)
container!=“POD”, container!=“”}[2m]

{name=~“.+”}:筛选,避免重复指标

round(100*(sum(rate(container_cpu_usage_seconds_total {name=~“.+”}[2m])) by (namespace,pod) / sum(kube_pod_container_resource_limits{resource=“cpu”}) by (namespace,pod))) > 75
PodMemory75(Pod的内存使用率大于75%)
100 * sum(container_memory_working_set_bytes{name=~“.+”}) by (namespace,pod) / sum(kube_pod_container_resource_limits {resource=“memory”}) by (namespace,pod) > 75
pod_status_no_running(Pod的状态为未运行)
sum (kube_pod_status_phase{phase!=“Running”}) by (namespace,pod,phase) > 0
PodMem4GbRestart(Pod的内存大于4096MB)
(sum (container_memory_working_set_bytes{name=~“.+”})by (namespace,pod,container_name) /1024/1024) > 4096
PodRestart(Pod重启)
{pod!~“aws-load-balancer-controller.*”}

sum (round(increase (kube_pod_container_status_restarts_total[5m]))) by (namespace,pod) > 0
KubePodCrashLooping(Pod出现循环崩溃)
rate(kube_pod_container_status_restarts_total{app_kubernetes_io_name=“kube-state-metrics”}[15m]) * 60 * 5 > 0
KubePodNotReady(Pod未准备好)
sum by (namespace, pod) (max by(namespace, pod) (kube_pod_status_phase{app_kubernetes_io_name=“kube-state-metrics”, phase=~“Pending|Unknown”}) * on(namespace, pod) group_left(owner_kind) max by(namespace, pod, owner_kind) (kube_pod_owner{owner_kind!=“Job”})) > 0
KubeContainerWaiting(容器等待)
sum by (namespace, pod, container) (kube_pod_container_status_waiting{app_kubernetes_io_name=“kube-state-metrics”}) > 0
Deployment
KubeDeploymentGenerationMismatch(出现部署集版本不匹配)
kube_deployment_status_observed_generation{app_kubernetes_io_name=“kube-state-metrics”} != kube_deployment_metadata_generation{app_kubernetes_io_name=“kube-state-metrics”}
KubeDeploymentReplicasMismatch(出现部署集副本不匹配)
( kube_deployment_spec_replicas{app_kubernetes_io_name=“kube-state-metrics”} != kube_deployment_status_replicas_available{app_kubernetes_io_name=“kube-state-metrics”} ) and ( changes(kube_deployment_status_replicas_updated{app_kubernetes_io_name=“kube-state-metrics”}[5m]) == 0 )
检测到部署集有更新
sum by (namespace, deployment) (changes(kube_deployment_status_observed_generation{app_kubernetes_io_name=“kube-state-metrics”}[5m])) > 0
StatefulSet
KubeStatefulSetGenerationMismatch(状态集版本不匹配)
kube_statefulset_status_observed_generation{app_kubernetes_io_name=“kube-state-metrics”} != kube_statefulset_metadata_generation{app_kubernetes_io_name=“kube-state-metrics”}
KubeStatefulSetReplicasMismatch(状态集副本不匹配)
( kube_statefulset_status_replicas_ready{app_kubernetes_io_name=“kube-state-metrics”} != kube_statefulset_status_replicas{app_kubernetes_io_name=“kube-state-metrics”} ) and ( changes(kube_statefulset_status_replicas_updated{app_kubernetes_io_name=“kube-state-metrics”}[5m]) == 0 )
检测到状态集有更新
sum by (namespace, statefulset) (changes(kube_statefulset_status_observed_generation{app_kubernetes_io_name=“kube-state-metrics”}[5m]))
PV&PVC
KubePersistentVolumeFillingUp(块存储PVC容量即将不足)
sum by (namespace,persistentvolumeclaim) (round(kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes*100)) < 20
KubePersistentVolumeErrors(PV容量出错)
sum by (persistentvolume) (kube_persistentvolume_status_phase{phase=~“Failed|Pending”,app_kubernetes_io_name=“kube-state-metrics”}) > 0
KubePersistentVolumeFillingUp(PVC空间耗尽预测)
通过PVC资源使用6小时变化率预测 接下来4天的磁盘使用率

(kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes ) < 0.4 and predict_linear(kubelet_volume_stats_available_bytes[6h], 4 * 24

prometheus监控告警功能相关推荐

  1. zabbix企业级分布式监控系统第二版pdf_XSKY监控告警功能通过Zabbix官方认证,轻松支持微信短信等实时告警...

    近日,XSKY SDS产品提供的Zabbix监控告警功能通过Zabbix官方认证,并入选Zabbix官方推荐的存储监控解决方案. 随着XSKY SDS产品深入各个行业,客户对存储监控的需求越来越高,希 ...

  2. prometheus监控+告警

    1 开始安装前的准备 1.1 修改主机名 1.2 关闭防火墙 1.3 关闭seliunx 1.4 关闭防火墙 1.5 下载阿里云的yum源 2 下载所用到的包 2.1 安装 node_porter 2 ...

  3. Prometheus监控告警

    监控告警-Prometheus 第一章:概述 本章将介绍监控告警的一些基本概念. 1.1 什么是监控告警? 监控是什么? 说白了就是用一种形式去盯着.观察服务器,把服务器的各种行为表现都显示出来,用以 ...

  4. 服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志

    一 Prometheus 入门 1.1 入门介绍 运维体系~指标监控 先来一张图,说明一下Prometheus监控相关的软件和知识点. 1: 首先要安装:Prometheus, 负责收集各种监控指标, ...

  5. Prometheus监控告警规则

    Prometheus监控MongoDB报警规则.MySQL报警规则.Nginx报警规则.Redis报警规则. MongoDB报警规则 报警名称 表达式 采集数据时间(分钟) 报警触发条件 Mongod ...

  6. Prometheus监控告警搭建(一)

    一.监控组件 监控需要的组件 alertmanager-0.21.0.linux-amd64.tar.gzgrafana-7.4.0.linux-amd64.tar.gzmysqld_exporter ...

  7. 自从上线了 Prometheus 监控告警,真香!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 对很多人来说,未知.不确定.不在掌控的东西,会有潜意识的逃 ...

  8. prometheus 监控告警安装与设置

    1.什么是Prometheus? Prometheus (普罗米修斯)是由 SoundCloud开发的开源监控报警系统和时序列数据库 . 2.Prometheus的特点 多维度数据模型. 灵活的查询语 ...

  9. 2021 大促 AntMonitor 总结 - 云原生 Prometheus 监控实践

    文|陈岸琦(花名:敖清 ) 蚂蚁集团高级开发工程师 负责蚂蚁 Prometheus 监控原生功能 在蚂蚁集团的落地与产品化建设 本文 6566 字 阅读 15 分钟 前 言 日志和指标是监控不可或缺的 ...

最新文章

  1. phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏
  2. 浅析网站优化工作具体包括哪些内容?
  3. 机器学习笔记:Adam
  4. 5.Vue 计算属性和侦听器
  5. 如何在DB2安装重启后登陆Administrator系统账号
  6. CodeForces - 1559D2 Mocha and Diana (Hard Version)(思维)
  7. xgboost之spark上运行-scala接口
  8. iptables详解(13):iptables动作总结之二
  9. Java开发学习必须了解的基础知识点
  10. android开机渲染视频太久,Android过度渲染优化解决方案
  11. oracle增加表字段_史上最详细的oracle 中的CR块介绍--一致性读
  12. (十四)洞悉linux下的Netfilteriptables:开发一个match模块【实战】
  13. 【毕业设计/课程设计】基于大数据个性化音乐推荐算法分析
  14. struct termios结构体详解【转】
  15. 移动端开发框架mui介绍
  16. vc2005和IE冲突 主要是在通过向导添加方法或变量的时候会报脚本错误。
  17. 记录下IDEA导入web项目遇到的web facet问题
  18. mysqlfulljoin
  19. 网络安全三同步怎么实施
  20. IDEA添加快捷注释功能

热门文章

  1. 电容式液晶屏可实现多点触控
  2. Linux系统架构概述
  3. 计组3——加/减法器构造
  4. 怎么样把聊天记录彻底删除?
  5. speedoffice(Word)怎么修改纸张方向
  6. Excel如何对单元格内的分隔数据进行求和操作?
  7. iPhone解锁的三种方法【附全型号进入恢复模式方法】
  8. python : Tkinter布局
  9. HGDB 数据库用户密码参数查询设置
  10. LPC1768的iic通讯