夜莺nightingale的一些k8s指标
在夜莺nightingale的安装与启动中已经二进制安装了夜莺系统,其web地址为http://<ip>:17000/,默认用户是 root
,密码是 root.2020。登录后需要修改密码。
使用夜莺系统,主要是使用其告警功能,其告警功能方便易用。
本次项目告警设置为:项目通过邮件发送给各项目管理人,系统告警通过企业微信发送到企业微信告警群
1.设置人员组织
最后的告警是落在业务组管理的,用户-团队-业务组
1.1创建用户
如果需要邮箱接收告警就需要填写邮箱;如果需要企业微信接收告警就添加微信机器人token。这个账户主要用于接收告警,不是为了登录夜莺平台。
1.2创建用户团队
创建用户团队并把用户添加到对应的团队中,其中团队是可以层级创建的
1.3创建业务组
业务组也是可以按照层级创建的,告警规则都是落在各个业务组里的,是按照业务组来划分的规则。业务组管理就是将团队也业务组进行绑定。
2.设置告警通知
在1中的人员中已经给各个账户添加了邮件或者企业微信token,然后还需要配置通知模板。通知设置中的通知媒介和联系方式都不用改,直接用默认的就行。
2.1邮件通知
在告警通知-通知设置里面需要设置SMTP设置,按照实际情况修改其默认配置。
2.1.1邮件模板email
在告警通知-通知模板中设置邮件模板email
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>夜莺告警通知</title> <style type="text/css"> .wrapper { background-color: #f8f8f8; padding: 15px; height: 100%; } .main { width: 600px; padding: 30px; margin: 0 auto; background-color: #fff; font-size: 12px; font-family: verdana,'Microsoft YaHei',Consolas,'Deja Vu Sans Mono','Bitstream Vera Sans Mono'; } header { border-radius: 2px 2px 0 0; } header .title { font-size: 14px; color: #333333; margin: 0; } header .sub-desc { color: #333; font-size: 14px; margin-top: 6px; margin-bottom: 0; } hr { margin: 20px 0; height: 0; border: none; border-top: 1px solid #e5e5e5; } em { font-weight: 600; } table { margin: 20px 0; width: 100%; } table tbody tr{ font-weight: 200; font-size: 12px; color: #666; height: 32px; } .succ { background-color: green; color: #fff; } .fail { background-color: red; color: #fff; } .succ th, .succ td, .fail th, .fail td { color: #fff; } table tbody tr th { width: 80px; text-align: right; } .text-right { text-align: right; } .body { margin-top: 24px; } .body-text { color: #666666; -webkit-font-smoothing: antialiased; } .body-extra { -webkit-font-smoothing: antialiased; } .body-extra.text-right a { text-decoration: none; color: #333; } .body-extra.text-right a:hover { color: #666; } .button { width: 200px; height: 50px; margin-top: 20px; text-align: center; border-radius: 2px; background: #2D77EE; line-height: 50px; font-size: 20px; color: #FFFFFF; cursor: pointer; } .button:hover { background: rgb(25, 115, 255); border-color: rgb(25, 115, 255); color: #fff; } footer { margin-top: 10px; text-align: right; } .footer-logo { text-align: right; } .footer-logo-image { width: 108px; height: 27px; margin-right: 10px; } .copyright { margin-top: 10px; font-size: 12px; text-align: right; color: #999; -webkit-font-smoothing: antialiased; } </style> </head> <body> <div class="wrapper"> <div class="main"> <header> <h3 class="title">{{.Cluster}}集群中{{.RuleName}}</h3> <p class="sub-desc"></p> </header> <hr> <div class="body"> <table cellspacing="0" cellpadding="0" border="0"> <tbody> {{if .IsRecovered}} <tr class="succ"> <th>级别状态:</th> <td>S{{.Severity}} Recovered</td> </tr> {{else}} <tr class="fail"> <th>级别状态:</th> <td>S{{.Severity}} Triggered</td> </tr> {{end}} {{if .RuleNote}} <tr> <th>告警类型:</th> <td>{{.RuleNote}}</td> </tr> {{end}} <tr> <th>告警详情:</th> <td>{{.Cluster}}集群中{{.RuleName}}</td> </tr> <tr> <th>告警集群:</th> <td>{{.Cluster}}</td> </tr> {{if .TargetNote}} <tr> <th>设备备注:</th> <td>{{.TargetNote}}</td> </tr> {{end}} {{if not .IsRecovered}} <tr> <th>触发时值:</th> <td>{{.TriggerValue}}</td> </tr> {{end}} {{if .TargetIdent}} <tr> <th>监控对象:</th> <td>{{.TargetIdent}}</td> </tr> {{end}} {{if .IsRecovered}} <tr> <th>恢复时间:</th> <td>{{timeformat .LastEvalTime}}</td> </tr> {{else}} <tr> <th>触发时间:</th> <td> {{timeformat .TriggerTime}} </td> </tr> {{end}} <tr> <th>发送时间:</th> <td> {{timestamp}} </td> </tr> </tbody> </table> <hr> <footer> <div class="copyright" style="font-style: italic"> 报警太多?使用 <a href="https://flashcat.cloud/product/flashduty/" target="_blank">FlashDuty</a> 做告警聚合降噪、排班OnCall! </div> </footer> </div> </div> </div> </body> </html>
2.1.2邮件头
在告警通知-通知模板中设置邮件头模板mailsubject
设置为当集群为kubernetes-prod,kubernetes-dev,kubernetes-shuiwu的时候,发送带有K8S的邮件头,否则没有K8S头
{{if or (eq .Cluster "kubernetes-prod") (eq .Cluster "kubernetes-dev") (eq .Cluster "kubernetes-shuiwu")}} {{if .IsRecovered}}K8S监控告警Recovered{{else}}K8S监控告警Triggered{{end}}: {{if .RuleNote}}{{.RuleNote}}{{else}}{{.RuleName}}{{end}} {{else}} {{if .IsRecovered}}监控告警Recovered{{else}}监控告警Triggered{{end}}: {{if .RuleNote}}{{.RuleNote}}{{else}}{{.RuleName}}{{end}} {{end}}
2.2企业微信告警
通知模板
**级别状态**: {{if .IsRecovered}}<font color="info">S{{.Severity}} Recovered</font>{{else}}<font color="warning">S{{.Severity}} Triggered</font>{{end}} **规则标题**: {{.RuleName}}{{if .RuleNote}} **规则备注**: {{.RuleNote}}{{end}}{{if .TargetIdent}} **监控对象**: {{.TargetIdent}}{{end}} **监控指标**: {{.TagsJSON}}{{if not .IsRecovered}} **触发时值**: {{.TriggerValue}}{{end}} {{if .IsRecovered}}**恢复时间**: {{timeformat .LastEvalTime}}{{else}}**首次触发时间**: {{timeformat .FirstTriggerTime}}{{end}} {{$time_duration := sub now.Unix .FirstTriggerTime }}{{if .IsRecovered}}{{$time_duration = sub .LastEvalTime .FirstTriggerTime }}{{end}}**距离首次告警**: {{humanizeDurationInterface $time_duration}} **发送时间**: {{timestamp}}
3.设置告警规则
告警主要分为系统告警和项目告警两个大业务组,系统告警主要关注服务器节点的资源情况,项目告警主要关注项目命名空间下的应用pod的告警
3.1系统告警
3.1.1 pod数量
规则名称:node: { $labels.node }} 中pod数量大于95% 备注:K8S中节点Pod数量过多 内置指标:count(kube_pod_info{created_by_kind!~"<none>|Job|CronJobs"}) by (node)/2>=95 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 300 重复通知间隔(分钟): 60 最大发送次数:3
3.1.2内存利用率
规则名称:node: {{ $kubernetes_node }}的内存利用率达到90% 备注:K8S中节点内存利用率过高 内置指标:(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)*100 >=90 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 300 重复通知间隔(分钟): 60 最大发送次数:3
3.1.3cpu利用率
规则名称:node: {{ $labels.instance }}的cpu利用率达到95% 备注:K8S中节点CPU利用率过高 内置指标:(1-sum(rate(node_cpu_seconds_total{mode="idle"}[2m]))by(instance)/sum(rate(node_cpu_seconds_total[2m]))by(instance))*100 >=95 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 300 重复通知间隔(分钟): 60 最大发送次数:3
3.1.4Node未就绪
规则名称:node: {{ $labels.node }} 已超过十分钟为未就绪状态 备注:K8S中节点未就绪 内置指标:kube_node_status_condition{condition="Ready",kubernetes_namespace="kube-system",status="true"} ==0 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):600 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.5有PID压力
规则名称:node: {{ $labels.node }} 有PID压力情况 备注:K8S中节点有PID压力 内置指标:kube_node_status_condition{condition="PIDPressure",kubernetes_namespace="kube-system",status="true"} !=0 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.6有内存压力
规则名称:node: {{ $labels.node }} 有内存压力情况 备注:K8S中节点有内存压力 内置指标:kube_node_status_condition{condition="MemoryPressure",kubernetes_namespace="kube-system",status="true"} !=0 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.7有磁盘压力
规则名称:node: {{ $labels.node }} 有磁盘压力情况 备注:K8S中节点有磁盘压力 内置指标:kube_node_status_condition{condition="DiskPressure", kubernetes_namespace="kube-system",status="true"} !=0 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.8网络不可用
规则名称:node: {{ $labels.node }} 网络不可用 备注:K8S中节点网络不可用 内置指标:kube_node_status_condition{condition="NetworkUnavailable",kubernetes_namespace="kube-system",status="true"} ==1 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 120 重复通知间隔(分钟): 60 最大发送次数:3
3.1.9Node不可调度
规则名称:node: {{ $labels.node }}不可调度 备注:K8S中节点不可调度 内置指标:kube_node_spec_unschedulable!=0 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.10cpu请求率
规则名称:node: {{ $labels.node }}的cpu request请求率达到95% 备注:K8S中节点CPU请求率过高 内置指标:sum(kube_pod_container_resource_requests_cpu_cores)by (node) / sum(kube_node_status_allocatable_cpu_cores)by (node)*100>95 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.11磁盘利用率
规则名称:node: {{ $labels.node }}的data磁盘利用率达到85% 备注:K8S中节点data磁盘利用率过高 内置指标:(1-node_filesystem_avail_bytes{fstype="xfs",mountpoint="/"}/node_filesystem_size_bytes{fstype="xfs",mountpoint="/"})*100 >=85 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 300 重复通知间隔(分钟): 60 最大发送次数:3
3.1.12内存请求率
规则名称:node: {{ $labels.node }}的内存request请求率达到95% 备注:K8S中节点内存请求率过高 内置指标:sum(kube_pod_container_resource_requests_memory_bytes)by (node) / sum(kube_node_status_capacity_memory_bytes)by (node)*100>95 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.13写IO
规则名称:五分钟内iops指标-node: {{ $labels.instance }}的磁盘:{{ $labels.device}} 写IO速率大于300 备注:K8S中节点写IO过高 内置指标:sum (rate(node_disk_writes_completed_total[5m]))by(instance,device) >=300 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.1.14读IO
规则名称:五分钟内iops指标-node: {{ $labels.instance }}的磁盘:{{ $labels.device}} 写IO速率大于300 备注:K8S中节点写IO过高 内置指标:sum (rate(node_disk_writes_completed_total[5m]))by(instance,device) >=300 通知媒介:wecom 告警接收组:admin-system 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.2项目告警
项目是按照命名空间来区分的,所以需要在每个项目的指标中设置命名空间namespace=~"xxx.*",其中xxx为项目的命名空间名
3.2.1DaemonSet启动失败
规则名称:命名空间:{{ $labels.namespace}}中 DaemonSet: {{ $labels.daemonset }}在节点: {{ $labels.kubernetes_node }}上的Pods未安排或是未准备好 备注:K8S中DaemonSet启动失败 内置指标:kube_daemonset_status_number_ready{kubernetes_namespace="kube-system",namespace=~"aps.*"} / kube_daemonset_status_desired_number_scheduled{kubernetes_namespace="kube-system",namespace=~"aps.*"} * 100 < 100 or kube_daemonset_status_desired_number_scheduled{kubernetes_namespace="kube-system",namespace=~"aps.*"} - kube_daemonset_status_current_number_scheduled{kubernetes_namespace="kube-system",namespace=~"aps.*"} > 0 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.2Deployment启动失败
规则名称:命名空间:{{ $labels.namespace}}中Deployment:{{ $labels.deployment }} 实际可用副本数量小于定义的数量,可能存在Pod未准备好。当前可用的副本数为{{ $value }} 备注:K8S中Deployment启动失败 内置指标:kube_deployment_status_replicas_available{kubernetes_namespace="kube-system",namespace=~"aps.*"} < kube_deployment_spec_replicas{kubernetes_namespace="kube-system",namespace=~"aps.*"} 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):300 留观时长(秒): 600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.3Pod重启
规则名称:命名空间:{{ $labels.namespace}}中Pod: {{ $labels.pod }} 正常启动10分钟后,被重启了{{ $value }}次. 备注:K8S中Pod重启了 内置指标:sum(changes(kube_pod_container_status_restarts_total{kubernetes_namespace="kube-system",namespace=~"aps.*"}[10m]))by(env,namespace,pod) >0 and sum(time()-kube_pod_start_time{kubernetes_namespace="kube-system",namespace=~"aps.*"}>10*1000*60)by(env,namespace,pod) 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 3600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.4Pod OOMKilled
规则名称:命名空间:{{ $labels.namespace}}中pod: {{ $labels.pod }}中的容器: {{ $labels.container }}在过去10分钟内,已被OOMKilled{{ $value }}次 备注:K8S中Pod OOMKilled 内置指标:(kube_pod_container_status_restarts_total{kubernetes_namespace="kube-system",namespace=~"aps.*"} - kube_pod_container_status_restarts_total{kubernetes_namespace="kube-system",namespace=~"aps.*"} offset 10m >= 1) and ignoring (reason) min_over_time(kube_pod_container_status_last_terminated_reason{reason="OOMKilled",namespace=~"aps.*"}[10m])==1 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):60 留观时长(秒): 3600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.5cpu利用率
规则名称:命名空间:{{ $labels.namespace}}中pod: {{ $labels.pod }}容器:{{ $labels.container}} 的cpu利用率大于95% 备注:K8S中Pod的cpu利用率过高 内置指标:sum(rate(container_cpu_usage_seconds_total{pod!="",container !="",container!="POD",namespace=~"aps.*"}[2m])) by (namespace,pod,container)/sum(container_spec_cpu_quota{pod!="",container !="",container!="POD",namespace=~"aps.*"}/100000) by (namespace,pod,container) * 100 >=95 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):180 留观时长(秒): 1200 重复通知间隔(分钟): 60 最大发送次数:3
3.2.6Pod非就绪
规则名称:命名空间:{{ $labels.namespace}}中pod: {{ $labels.pod }}已处于非就绪状态超过10分钟 备注:K8S中Pod非就绪 内置指标:sum(kube_pod_status_phase{phase=~"Pending|Unknown|Failed",namespace=~"aps.*"}) by(job,env,namespace,pod) > 0 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):600 留观时长(秒):600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.7StatefulSet启动失败
规则名称:命名空间:{{ $labels.namespace}}中StatefulSet: {{ $labels.statefulset }}准备就绪的副本数与预期的副本数不匹配,当前可用副本数为{{ $value }} 备注:K8S中StatefulSet启动失败 内置指标:kube_statefulset_status_replicas_ready{kubernetes_namespace="kube-system",namespace=~"aps.*"}<kube_statefulset_status_replicas{kubernetes_namespace="kube-system",namespace=~"aps.*"} 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):300 留观时长(秒):600 重复通知间隔(分钟): 60 最大发送次数:3
3.2.8StatefulSet更新失败
规则名称:命名空间:{{ $labels.namespace}}中StatefulSet: {{ $labels.statefulset }}更新未展开 备注:K8S中StatefulSet更新失败 内置指标:max without (revision) (kube_statefulset_status_current_revision unless kube_statefulset_status_update_revision{kubernetes_namespace="kube-system",namespace=~"aps.*"}) * (kube_statefulset_replicas{kubernetes_namespace="kube-system",namespace=~"aps.*"} != kube_statefulset_status_replicas_updated{kubernetes_namespace="kube-system",namespace=~"aps.*"}) 通知媒介:email 告警接收组:aps 执行频率 (s):30 持续时长 (s):300 留观时长(秒):600 重复通知间隔(分钟): 60 最大发送次数:3
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库