夜莺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
复制代码

 

posted @   潇潇暮鱼鱼  阅读(166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示