告警梳理
梳理需要用于监控的指标以及规则。告警规则前置设定如下:
-
执行间隔:以
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) * 100 | info: 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) * 100 | info: 80 warn: 90 crit: 95 |
集群Pods使用率alert.cluster.pods.usage_rate 重要程序:可有可无 | 每个Node 节点能够维护的Pods 数量是有限制的,当每个Node 的Pods 使用率过高时会引发集群的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) * 100 | info: 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]))) * 100 | info: 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"} * 100 | info: 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) * 1000 | info: 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) * 1000 | info: 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/1024 | info: 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"} == 0 | info: 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/1024 | info: 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/1024 | info: 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/1024 | info: 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 |