Skip to main content

告警梳理

梳理需要用于监控的指标以及规则。告警规则前置设定如下:

  • 执行间隔:以 1 分钟作为默认的告警规则执行间隔。

  • 触发阈值:以连续3次达到触发阈值为前提才触发一次告警。阈值触发在未特殊提醒的前提下,统一使用 >= 的计算方式

  • 告警分级:告警分3个优先级,普通告警(info)、严重告警(warn)、致命告警(crit),分别对应3个不同的阈值。

以下告警阈值初始值为经验设定,在现网配置时会需要根据实际情况进行适当调整,并不断完善该文档。

集群纬度

告警名称告警描述表达式阈值设置
集群CPU使用率

alert.cluster.cpu.usage_rate

重要程序:一般
集群的CPU使用率过高时,意味着需要排查个别容器是否有异常,亦或需要扩展节点资源。

单位%
sum(rate(container_cpu_usage_seconds_total{id="/"}[5m])) by (khaos_product,khaos_cluster) / sum (machine_cpu_cores{}) by (khaos_product,khaos_cluster) * 100info: 80

warn: 90

crit: 95
集群内存使用率

alert.cluster.memory.usage_rate

重要程序:一般
集群的内存使用率过高时,意味着需要排查个别容器是否有异常,抑或需要扩展节点资源。

单位%
sum (container_memory_working_set_bytes{id="/"}) by (khaos_product,khaos_cluster) / sum (machine_memory_bytes{}) by (khaos_product,khaos_cluster) * 100info: 80

warn: 90

crit: 95
集群Pods使用率

alert.cluster.pods.usage_rate

重要程序:可有可无
每个Node节点能够维护的Pods数量是有限制的,当每个NodePods使用率过高时会引发集群的Pods使用率过高,会影响Pod的调度,甚至无法创建Pod

单位%

该规则默认不启用。
sum(kube_pod_status_phase{phase="Running"})) by (khaos_product,khaos_cluster) / sum(kube_node_status_allocatable{resource="pods"}) by (khaos_product,khaos_cluster) * 100info: 80

warn: 90

crit: 95

节点纬度

告警名称告警描述表达式阈值设置
节点CPU使用率

alert.node.cpu.usage_rate

重要程序:重要
CPU使用率过高会导致进程响应慢。

单位%
sum by(khaos_product,khaos_cluster,instance) (irate(node_cpu_seconds_total{mode!="idle"}[5m])) / on(khaos_product,khaos_cluster,instance) group_left sum by (khaos_product,khaos_cluster,instance)((irate(node_cpu_seconds_total{}[5m]))) * 100info: 80

warn: 90

crit: 95
节点内存使用率

alert.node.memory.usage_rate

重要程序:重要
主机内存利用率高会导致进程响应慢。

单位%
100 - ((avg_over_time(node_memory_MemAvailable_bytes{}[5m]) * 100) / avg_over_time(node_memory_MemTotal_bytes{}[5m]))info: 80

warn: 90

crit: 95
节点磁盘使用率

alert.node.storage.usage_rate

重要程序:可有可无
由于节点上挂载的磁盘比较多,我们并不需要关心所有挂载点的磁盘使用率,因此该规则默认不启用。

单位%
100 - 100*(sum(node_filesystem_avail_bytes{device=~"/dev.*", mountpoint!~".*pods.*|.*pvc.*"}) by(khaos_product,khaos_cluster, instance, device) / sum(node_filesystem_size_bytes{device=~"/dev.*", mountpoint!~".*pods.*|.*pvc.*"}) by (khaos_product,khaos_cluster, instance, device))info: 80

warn: 90

crit: 95
节点系统磁盘使用率

alert.node.storage.root.usage_rate

重要程序:重要
系统盘使用率过高会影响系统稳定性。

单位%
100 - 100*(sum(node_filesystem_avail_bytes{device=~"/dev.*", mountpoint="/"}) by(khaos_product,khaos_cluster, instance, device) / sum(node_filesystem_size_bytes{device=~"/dev.*", mountpoint="/"}) by (khaos_product,khaos_cluster, instance, device))info: 80

warn: 90

crit: 95
磁盘 inode 使用率

alert.node.storage.inode.usage_rate

重要程序:重要
使用率如果达到100%会影响磁盘文件的创建。

单位%
100 - node_filesystem_files_free{fstype=~"ext4|xfs"}/node_filesystem_files{fstype=~"ext4|xfs"} * 100info: 80

warn: 90

crit: 95
磁盘读延迟过高

alert.node.storage.io_delay_ms.read

重要程序:重要
影响磁盘内容读取。

单位ms
rate(node_disk_read_time_seconds_total{}[5m]) / (rate(node_disk_reads_completed_total{}[5m])>0) * 1000info: 1000

warn: 3000

crit: 5000
磁盘写延迟过高

alert.node.storage.io_delay_ms.write

重要程序:重要
影响磁盘内容写入。

单位ms
rate(node_disk_write_time_seconds_total{}[5m]) / (rate(node_disk_writes_completed_total{}[5m])>0) * 1000info: 1000

warn: 3000

crit: 5000
节点TCP每秒出包错误率

alert.node.network.tcp.error_rate.out

重要程序:重要
网络出入包错误率过高会严重影响数据面及管控面网络访问。

5m内的平均网络出包错误率。

单位%
100*(sum(node_network_transmit_errs_total{device="eth0"}[5m]) by (khaos_product,khaos_cluster, device, instance)/sum(node_network_transmit_packets_total{device="eth0"}[5m]) by (khaos_product,khaos_cluster, device, instance))info: 5

warn: 10

crit: 30
节点TCP每秒入包错误率

alert.node.network.tcp.error_rate.in

重要程序:重要
网络出入包错误率过高会严重影响数据面及管控面网络访问。

5m内的平均网络入包错误率。

单位%
100*(sum(node_network_receive_errs_total{device="eth0"}[5m]) by (khaos_product,khaos_cluster, device, instance)/sum(node_network_receive_packets_total{device="eth0"}[5m]) by (khaos_product,khaos_cluster, device, instance))info: 5

warn: 10

crit: 30
节点网络流量过大

alert.node.network.flow

重要程序:重要
流量过大可能会影响节点上所有进程的网络通信。原理是1分钟内对外网卡平均流量,包含出+入的流量。流量阈值根据集群硬件条件灵活配置。

单位mb/s
(rate(node_network_receive_bytes_total{device=~"eth.+"}[1m])+rate(node_network_transmit_bytes_total{device=~"eth.+"}[1m]))/1024/1024info: 5000

warn: 8000

crit: 9000
节点网络带宽使用率

alert.node.network.bandwidth_usage_rate

重要程序:重要
流量过大可能会影响节点上所有进程的网络通信。原理是1分钟内对外网卡的平均流量占用总体网卡带宽的百分比。

单位%

注意事项:

node_network_speed_bytes 指标仅在物理机下有效,虚拟机下的该指标可能会负值或者无效。因此该告警作为流量告警的辅助告警规则。
100*(rate(node_network_receive_bytes_total{device=~"eth.+"}[1m])+rate(node_network_transmit_bytes_total{device=~"eth.+"}[1m]))/(node_network_speed_bytes{device=~"eth.+"} > 0)info: 80

warn: 90

crit: 95
节点 NotReady 持续时间(5分钟)

alert.node.status.not_ready5

重要程序:重要
主机上的kubelet无法上报主机状态,可能主机宕机或者不稳定,可能会引发后续Kubernetes集群内部针对该节点的调度、网络访问等问题。

按照持续时间划分不同告警级别。
kube_node_status_condition{condition="Ready",status="true"} == 0info: 1
节点 NotReady 持续时间(10分钟)

alert.node.status.not_ready10

重要程序:重要
warn: 1
节点 NotReady 持续时间(15分钟)

alert.node.status.not_ready15

重要程序:重要
crit: 1
节点Pods使用率

alert.node.status.pods.usage_rate

重要程序:可有可无
每个Node节点能够维护的Pods数量是有限制的,当使用率过高时,Kuberntes调度器将法调度新的Pod到该节点,从而影响节点上的Pod装箱。

该规则默认不启用。

单位%
100*sum(kube_pod_info{}) by (khaos_product,khaos_cluster,node) / sum(kube_node_status_allocatable{resource="pods"}) by (khaos_product,khaos_cluster,node)info: 80

warn: 90

crit: 95
节点异常关机或重启

alert.node.status.shut_reboot

重要程序:重要
节点5分钟内系统启动时间发生变化,可能发生异常关机或者重启,请注意查看。abs((node_boot_time_seconds{} or 0) - node_boot_time_seconds{} offset 5m != 0)crit: 1

容器纬度

告警名称告警描述处理方式表达式阈值设置
容器CPU使用率

alert.container.cpu.usage_rate

重要程序:可有可无
前置条件:只有在容器配置了resources.limits.cpu条件下才能使用。

单位%

该规则默认不启用。
100*sum(rate(container_cpu_usage_seconds_total{namespace=~"argo|khaos|obs|kube-system"}[5m])) by (khaos_product,khaos_cluster,namespace,app_name,pod,container)/sum(container_spec_cpu_quota{namespace=~"argo|khaos|obs|kube-system"}/container_spec_cpu_period{namespace=~"argo|khaos|obs|kube-system"}) by (khaos_product,khaos_cluster,namespace,app_name,pod,container)info: 80

warn: 90

crit: 95
容器内存使用率

alert.container.memory.usage_rate

重要程序:可有可无
前置条件:只有在容器配置了resources.limits.memory条件下才能使用。

单位%

该规则默认不启用。
100*(sum (container_memory_working_set_bytes{namespace=~"argo|khaos|obs|kube-system"}) by (khaos_product,khaos_cluster,namespace,app_name,pod,container)/sum (container_spec_memory_limit_bytes{namespace=~"argo|khaos|obs|kube-system"}) by (khaos_product,khaos_cluster,namespace,app_name,pod,container) <= 1)info: 80

warn: 90

crit: 95
容器磁盘使用率

alert.container.storage.usage_rate

重要程序:可有可无
由于容器内部的挂载点可能很多,并且在Kubernetes下都是通过pv的方式申请存储,对应也有pv的磁盘使用率告警,因此该告警规则默认未启用。

单位%
100*sum(container_fs_usage_bytes{namespace=~"argo|khaos|obs|kube-system"} / (container_fs_limit_bytes{namespace=~"argo|khaos|obs|kube-system"} != 0 )) by (khaos_product,khaos_cluster,namespace,app_name,pod,container,device)info: 80

warn: 90

crit: 95
容器持续 10 分钟 NotReady

(该告警包含数据面容器)

alert.container.not_ready10

重要程序:重要
通过reason字段告警具体原因,reason字段可能得取值如下:

* ContainerCreating

* CrashLoopBackOff

* CreateContainerConfigError

* ErrImagePull

* ImagePullBackOff

* PodInitializing

* OOMKilled

* StartError

* Error

* ContainerStatusUnknown

* Unknown


需要注意:

数据面的告警仅针对内核容器,按照container="khaos-biz"通用配置,并不关心业务Pod中的sidecar容器。

按照持续时间划分不同告警级别。
通过跳板机登录kubernetes集群查看Pod状态,异常容器日志定位准确原因。管控面:

管控面容器处于异常状态,该容器提供的管控能力失效。

reason的异常容器:

(
(kube_pod_container_status_terminated_reason{reason!="Completed",namespace=~"argo|khaos|obs|kube-system"} + kube_pod_container_status_terminated_reason{reason!="Completed",namespace=~"argo|khaos|obs|kube-system"} offset 10m) == 2
or
(kube_pod_container_status_waiting_reason{reason!="Completed",namespace=~"argo|khaos|obs|kube-system"} + kube_pod_container_status_waiting_reason{reason!="Completed",namespace=~"argo|khaos|obs|kube-system"} offset 10m) == 2
)

unkhown的异常容器:

((kube_pod_container_status_ready{namespace=~"argo|khaos|obs|kube-system"} + kube_pod_container_status_ready{namespace=~"argo|khaos|obs|kube-system"} offset 10m) == 0)
unless on(uid)
(
kube_pod_container_status_terminated_reason{namespace=~"argo|khaos|obs|kube-system"}
or
kube_pod_container_status_waiting_reason{namespace=~"argo|khaos|obs|kube-system"}
)

数据面:

数据面容器异常,会影响用户实例,请优先查看!

reason的异常容器:

(
(kube_pod_container_status_terminated_reason{reason!="Completed",container="khaos-biz"} + kube_pod_container_status_terminated_reason{reason!="Completed",container="khaos-biz"} offset 10m) == 2
or
(kube_pod_container_status_waiting_reason{reason!="Completed",container="khaos-biz"} + kube_pod_container_status_waiting_reason{reason!="Completed",container="khaos-biz"} offset 10m) == 2
)

unkhown的异常容器:

((kube_pod_container_status_ready{container="khaos-biz"} + kube_pod_container_status_ready{container="khaos-biz"} offset 10m) == 0)
unless on(uid)
(
kube_pod_container_status_terminated_reason{container="khaos-biz"}
or
kube_pod_container_status_waiting_reason{container="khaos-biz"}
)
info: 1
容器持续 20 分钟 NotReady

(该告警包含数据面容器)

alert.container.not_ready20

重要程序:重要
warn: 1
容器持续 30 分钟 NotReady

(该告警包含数据面容器)

alert.container.not_ready30

重要程序:重要
crit: 1
容器发生持续重启

(该告警包含数据面容器)

alert.pod.status.crash_loop

重要程序:重要
通过reason字段告警具体原因,reason字段可能得取值如下:

* CrashLoopBackOff

* CreateContainerConfigError

* ErrImagePull

* ImagePullBackOff

* OOMKilled

* StartError

* Error

* ContainerStatusUnknown

* Unknown


需要注意:

* 由于容器重启使用了时间退避,最长退避时间为5m,因此这里默认使用15m作为间隔来计算重启递增值。
通过跳板机登录kubernetes集群查看Pod状态,异常容器日志定位准确原因。管控面:

(delta(kube_pod_container_status_restarts_total{namespace=~"argo|khaos|obs|kube-system"} [15m]) > 1) + on(khaos_product,khaos_cluster, namespace, app_name, pod, container) group_right(kube_pod_container_status_last_terminated_reason) 0*(kube_pod_container_status_last_terminated_reason{reason!="Completed",namespace=~"argo|khaos|obs|kube-system"})

数据面(非平台管控面空间)

(delta(kube_pod_container_status_restarts_total{namespace!~"argo|khaos|obs|kube-system"} [15m]) > 1) + on(khaos_product,khaos_cluster, namespace, app_name, pod, container) group_right(kube_pod_container_status_last_terminated_reason) 0*(kube_pod_container_status_last_terminated_reason{reason!="Completed",namespace!~"argo|khaos|obs|kube-system"})
info: 15m 2

warn: 20m 4

crit: 30m 5

Pod纬度

告警名称告警描述处理方式表达式阈值设置
Pod长期处于无法调度状态

(该告警包含数据面容器)

alert.pod.status.unschedulable

重要程序:重要
Pod在一定时间内没有被调度成功,通常是Pod依赖没有满足要求,例如资源请求、亲和性等前置条件无法满足。通过跳板机登录集群,使用kubectl describe命令查看具体原因。kube_pod_status_unschedulable{}info: 10分钟

warn: 20分钟

crit: 30分钟
Pod PVC使用率

(该告警包含数据面容器)

alert.pod.storage.volume.usage_rate

重要程序:重要
PVC对应的PV使用率高时,会影响存储,进而影响服务功能。

需要注意,数据面现网的PVC磁盘使用率都很高。

单位%
清理或扩容PV磁盘。100*(kubelet_volume_stats_used_bytes{}/kubelet_volume_stats_capacity_bytes{})+on(khaos_product,khaos_cluster,persistentvolumeclaim,namespace) group_right(persistentvolumeclaim) 0*kube_pod_spec_volumes_persistentvolumeclaims_info{}info: 80

warn: 90

crit: 95
Pod网络入流量过大

alert.pod.network.flow_rate.in

重要程序:一般
原理是1分钟内的平均流量。需要注意,Pod的网络流量大部分属于集群内部的内网流量。

单位mb/s
rate(container_network_receive_bytes_total{image!="",interface=~"eth.+",namespace=~"argo|khaos|obs|kube-system"}[1m])/1024/1024info: 800

warn: 900

crit: 1000
Pod网络出流量过大

alert.pod.network.flow_rate.out

重要程序:一般
原理是1分钟内的平均流量。需要注意,Pod的网络流量大部分属于集群内部的内网流量。

单位mb/s
rate(container_network_transmit_bytes_total{image!="",interface=~"eth.+",namespace=~"argo|khaos|obs|kube-system"}[1m])/1024/1024info: 800

warn: 900

crit: 1000

服务纬度

云巢组件

vmagent

告警名称告警描述处理方式表达式阈值设置
vmagent 存在错误的集群ID配置

alert.service.khaos.vmagent.incorrect_khaos_cluster

重要程序:一般
有部分集群的集群ID没有更新到vmagent配置中,可能是集群的cluster_values.yaml配置或者CI脚本存在问题。

当集群ID配置错误时,可能会影响上层的告警通知、大盘展示,影响问题的准确定位。

该问题通常与集群ID配置错误一起出现。
首先在catalog仓库中的tencentcloud/arcod/deploys目录检索关键字khaos-cluster看看哪个集群的配置文件有问题。

如果无法找到,那么使用count(kube_pod_info{khaos_cluster="khaos-cluster"})by(namespace)看看是哪个产品的实例,随后对该产品的所有集群遍历查找ns定位是否该集群。
count(kube_pod_info{khaos_cluster="khaos-cluster"})info: 1
vmagent 存在错误的产品标识配置

alert.service.khaos.vmagent.incorrect_khaos_product

重要程序:一般
有部分集群的产品标识没有更新到vmagent配置中,可能是集群的cluster_values.yaml配置或者CI脚本存在问题。

当集群ID配置错误时,可能会影响上层的告警通知、大盘展示,影响问题的准确定位。

该问题通常与集群ID配置错误一起出现。
同上。count(kube_pod_info{khaos_product=""})info: 1
vmagent 错误日志激增

alert.service.khaos.vmagent.log_errors

重要程序:重要
错误日志一段时间内增加过多,可能会影响监控采集能力。

单位
需要去控制台查看vmagent pod的日志确定原因。sum(increase(vm_log_messages_total{level!="info"}[10m])) by (khaos_product, khaos_cluster, app_name, namespace, pod)info: 1000

warn: 3000

crit: 5000
vmagent 本地缓存激增

alert.service.khaos.vmagent.local_cache

重要程序:重要
vmagent上报失败时,会按照远端地址缓存本地数据,如果本地缓存数据激增,表示远端写入失败过多。

单位mb
需要去控制台查看vmagent pod的日志确定原因。判断是否地址配置错误,或者远端写入地址对应的服务异常。sum(vmagent_remotewrite_pending_data_bytes{}) by (job, url)/1024/1024info: 100

warn: 500

crit: 1000

Kubernetes组件

etcd

告警名称告警描述表达式阈值设置
etcd 是否存在主节点

alert.service.kube.etcd.has_leader

重要程序:重要
表示etcd是否可用。

需要注意:TKE托管类型集群的 etcd 服务由于部署在其他独立的集群中,当前集群内的监控组件没有权限访问因此无法采集其指标。
etcd_server_has_leader{}crit: ==0

apiserver

告警英文名告警描述表达式阈值设置
apiserver 服务端请求错误率

alert.service.kube.apiserver.server.error_rate

重要程序:重要
5分钟内apiserver处理的请求错误率较高。

单位%
100*sum(rate(apiserver_request_total{code=~"(?:5..)"}[5m])) by (khaos_product,khaos_cluster,app_name,instance,group,version,resource) / sum(rate(apiserver_request_total{}[5m])) by (khaos_product,khaos_cluster,app_name,instance,group,version,resource)info: 50

warn: 80

crit: 90
客户端向 apiserver 请求错误率

alert.service.kube.apiserver.client.error_rate

重要程序:重要
5分钟内客户端请求apiserver的错误率较高。instance为客户端,host为目标端,job用于识别是否kubelet访问。



单位%
100*(sum(rate(rest_client_requests_total{code=~"(4|5).."}[5m])) by (khaos_product,khaos_cluster,app_name,instance,host) / sum(rate(rest_client_requests_total[5m])) by (khaos_product,khaos_cluster,app_name,instance,host))info: 50

warn: 80

crit: 90
apiserver 服务端请求处理延迟

alert.service.kube.apiserver.latency

重要程序:重要
5分钟内p99的请求处理延迟较高。

单位ms
1000*histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb!~"(?:CONNECT|WATCHLIST|WATCH|PROXY)"} [5m])) without (subresource))info: 3000

warn: 5000

crit: 10000

参考资料