| 策略名称 |
策略表达式 |
持续时间 |
策略描述 |
| 客户端访问 APIServer 出错 |
(sum(rate(rest_client_requests_total{code=~"5.."}[5m])) by (cluster,instance, job) /sum(rate(rest_client_requests_total[5m])) by (cluster,instance, job))> 0.01 |
15m |
客户端访问 APIServer 出错率大于1% |
| 客户端访问 APIServer 证书快过期 |
apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > 0 and on(job) histogram_quantile(0.01, sum by (cluster, job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 86400 |
无 |
访问 APIServer 的客户端证书将在24小时后过期 |
| 聚合 API 出错 |
sum by(cluster, name, namespace) (increase(aggregator_unavailable_apiservice_count[5m])) > 2 |
无 |
聚合 API 最近5分钟报错 |
| 聚合 API 可用性低 |
(1 – max by(name, namespace, cluster)(avg_over_time(aggregator_unavailable_apiservice[5m]))) * 100 < 90 |
5m |
聚合 API 服务最近5分钟可用性低于90% |
| APIServer 故障 |
absent(sum(up{job="apiserver"}) by (cluster) > 0) |
5m |
APIServer 从采集目标中消失 |
| Scheduler 故障 |
absent(sum(up{job="kube-scheduler"}) by (cluster) > 0) |
15m |
Scheduler 从采集目标中消失 |
| Controller Manager 故障 |
absent(sum(up{job="kube-controller-manager"}) by (cluster) > 0) |
15m |
Controller Manager 从采集目标中消失 |
| Kubernetes 核心组件版本不一致 |
count by (cluster) (count by (cluster, gitVersion) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"gitVersion","$1","gitVersion","(v[0-9]*.[0-9]*).*"))) > 1 |
15m |
Kubernetes 核心组件运行了不同的版本 |
| 策略名称 |
策略表达式 |
持续时间 |
策略描述 |
| Node 状态异常 |
kube_node_status_condition{job=~".*kube-state-metrics",condition="Ready",status="true"} == 0 |
15m |
Node 状态异常持续15m |
| Node 不可达 |
kube_node_spec_taint{job=~".*kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} == 1 |
15m |
Node 不可达,上面的工作负载会重新调度 |
| Node 上运行太多 pod |
count by(cluster, node) ((kube_pod_status_phase{job=~".*kube-state-metrics",phase="Running"} == 1) * on(instance,pod,namespace,cluster) group_left(node) topk by(instance,pod,namespace,cluster) (1, kube_pod_info{job="prometheus-kube-state-metrics"})) /max by(cluster, node) (kube_node_status_capacity_pods{job=~".*kube-state-metrics"} != 1) > 0.95/td> |
15m |
Node 上运行 pod 量快达到上限 |
| Node 状态抖动 |
sum(changes(kube_node_status_condition{status="true",condition="Ready"}[15m])) by (cluster, node) > 2 |
15m |
Node 状态在正常和异常之间抖动 |
| Kubelet 的客户端证书快过期 |
kubelet_certificate_manager_client_ttl_seconds < 86400 |
无 |
Kubelet 客户端证书将在24小时后过期 |
| Kubelet 的服务端证书快过期 |
kubelet_certificate_manager_server_ttl_seconds < 86400 |
无 |
Kubelet 服务端证书将在24小时后过期 |
| Kubelet 客户端证书续签出错 |
increase(kubelet_certificate_manager_client_expiration_renew_errors[5m]) > 0 |
15m |
Kubelet 续签客户端证书出错 |
| Kubelet 服务端证书续签出错 |
increase(kubelet_server_expiration_renew_errors[5m]) > 0 |
15m |
Kubelet 续签服务端证书出错 |
| PLEG 耗时高 |
histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_duration_seconds_bucket[5m])) by (cluster, instance, le) * on(instance, cluster) group_left(node) kubelet_node_name{job="kubelet"}) >= 10 |
5m |
PLEG 操作耗时的99分位数超过10秒 |
| Pod 启动耗时高 |
histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{job="kubelet"}[5m])) by (cluster, instance, le)) * on(cluster, instance) group_left(node) kubelet_node_name{job="kubelet"} > 60 |
15m |
Pod 启动耗时的99分位数值超过60秒 |
| Kubelet 故障 |
absent(sum(up{job="kubelet"}) by (cluster) > 0) |
15m |
Kubelet 从采集目标中消失 |
| 策略名称 |
策略表达式 |
持续时间 |
策略描述 |
| 集群 CPU 资源过载 |
sum by (cluster) ( max by (cluster, namespace, pod, container) ( kube_pod_container_resource_requests_cpu_cores{job=~".*kube-state-metrics"} ) * on(cluster, namespace, pod) group_left() max by (cluster, namespace, pod) ( kube_pod_status_phase{phase=~"Pending|Running"} == 1 )) /sum by (cluster) (kube_node_status_allocatable_cpu_cores) >(count by (cluster) (kube_node_status_allocatable_cpu_cores)-1) / count by (cluster) (kube_node_status_allocatable_cpu_cores) |
5m |
集群内 Pod 申请的 CPU 总量过多,已无法容忍 Node 挂掉 |
| 集群内存资源过载 |
sum by (cluster) ( max by (cluster, namespace, pod, container) ( kube_pod_container_resource_requests_memory_bytes{job=~".*kube-state-metrics"} ) * on(cluster, namespace, pod) group_left() max by (cluster, namespace, pod) ( kube_pod_status_phase{phase=~"Pending|Running"} == 1 )) /sum by (cluster) (kube_node_status_allocatable_memory_bytes) >(count by (cluster) (kube_node_status_allocatable_memory_bytes)-1) /count by (cluster) (kube_node_status_allocatable_memory_bytes) |
5m |
集群内 Pod 申请的内存总量过多,已无法容忍 Node 挂掉 |
| 集群 CPU 配额过载 |
sum by (cluster) (kube_resourcequota{job=~".*kube-state-metrics", type="hard", resource="cpu"}) /sum by (cluster) (kube_node_status_allocatable_cpu_cores) > 1.5 |
5m |
集群内 CPU 配额超过可分配 CPU 总量 |
| 集群内存配额过载 |
sum by (cluster) (kube_resourcequota{job=~".*kube-state-metrics", type="hard", resource="memory"}) /sum by (cluster) (kube_node_status_allocatable_memory_bytes) > 1.5 |
5m |
集群内内存配额超过可分配内存总量 |
| 配额资源快使用完 |
sum by (cluster, namespace, resource) (kube_resourcequota{job=~".*kube-state-metrics", type="used"}) /sum by (cluster, namespace, resource) (kube_resourcequota{job=~".*kube-state-metrics", type="hard"} > 0) >= 0.9 |
15m |
配额资源使用率超过90% |
| CPU 执行周期受限占比高 |
sum(increase(container_cpu_cfs_throttled_periods_total{container!="", }[5m])) by (cluster, container, pod, namespace) /sum(increase(container_cpu_cfs_periods_total{}[5m])) by (cluster, container, pod, namespace) > ( 25 / 100 ) |
15m |
CPU 执行周期受到限制的占比高 |
| Pod 的 CPU 使用率高 |
sum(rate(container_cpu_usage_seconds_total{job="kubelet", metrics_path="/metrics/cadvisor", image!="", container!="POD"}[5m])) by (cluster, namespace, pod, container) / sum(kube_pod_container_resource_limits_cpu_cores) by (cluster, namespace, pod, container) > 0.75 |
15m |
Pod 的 CPU 使用率超过75% |
| Pod 的内存使用率高 |
sum(container_memory_working_set_bytes{job="kubelet", metrics_path="/metrics/cadvisor", image!="", container!="POD"}) by (cluster, namespace, pod, container) /sum(kube_pod_container_resource_limits_memory_bytes) by (cluster, namespace, pod, container) > 0.75 |
15m |
Pod 的内存使用率超过75% |
| 策略名称 |
策略表达式 |
持续时间 |
策略描述 |
| Pod 频繁重启 |
increase(kube_pod_container_status_restarts_total{job=~".*kube-state-metrics"}[5m]) > 0 |
15m |
Pod 最近5m频繁重启 |
| Pod 状态异常 |
sum by (namespace, pod, cluster) ( max by(namespace, pod, cluster) ( kube_pod_status_phase{job=~".*kube-state-metrics", phase=~"Pending|Unknown"} ) * on(namespace, pod, cluster) group_left(owner_kind) topk by(namespace, pod) ( 1, max by(namespace, pod, owner_kind, cluster) (kube_pod_owner{owner_kind!="Job"}) )) > 0 |
15m |
Pod处于 NotReady 状态超过15分钟 |
| 容器状态异常 |
sum by (namespace, pod, container, cluster) (kube_pod_container_status_waiting_reason{job=~".*kube-state-metrics"}) > 0 |
1h |
容器长时间处于 Waiting 状态 |
| Deployment 部署版本不匹配 |
kube_deployment_status_observed_generation{job=~".*kube-state-metrics"} !=kube_deployment_metadata_generation{job=~".*kube-state-metrics"} |
15m |
部署版本和设置版本不一致,表示 deployment 变更没有生效 |
| Deployment 副本数不匹配 |
( kube_deployment_spec_replicas{job=~".*kube-state-metrics"} != kube_deployment_status_replicas_available{job=~".*kube-state-metrics"}) and ( changes(kube_deployment_status_replicas_updated{job=~".*kube-state-metrics"}[5m]) == 0) |
15m |
实际副本数和设置副本数不一致 |
| Statefulset 部署版本不匹配 |
( kube_statefulset_status_replicas_ready{job=~".*kube-state-metrics"} != kube_statefulset_status_replicas{job=~".*kube-state-metrics"}) and ( changes(kube_statefulset_status_replicas_updated{job=~".*kube-state-metrics"}[5m]) == 0) |
15m |
部署版本和设置版本不一致,表示 statefulset 变更没有生效 |
| Statefulset 副本数不匹配 |
kube_statefulset_status_observed_generation{job=~".*kube-state-metrics"} !=kube_statefulset_metadata_generation{job=~".*kube-state-metrics"} |
15m |
实际副本数和设置副本数不一致 |
| Statefulset 更新未生效 |
( max without (revision) ( kube_statefulset_status_current_revision{job=~".*kube-state-metrics"}unless kube_statefulset_status_update_revision{job=~".*kube-state-metrics"} ) * ( kube_statefulset_replicas{job=~".*kube-state-metrics"} != kube_statefulset_status_replicas_updated{job=~".*kube-state-metrics"} )) and ( changes(kube_statefulset_status_replicas_updated{job=~".*kube-state-metrics"}[5m]) == 0) |
15m |
Statefulset 部分 pod 没有更新 |
| Daemonset 变更卡住 |
( ( kube_daemonset_status_current_number_scheduled{job=~".*kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{job=~".*kube-state-metrics"} ) or ( kube_daemonset_status_number_misscheduled{job=~".*kube-state-metrics"} != 0 ) or ( kube_daemonset_updated_number_scheduled{job=~".*kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{job=~".*kube-state-metrics"} ) or ( kube_daemonset_status_number_available{job=~".*kube-state-metrics"} != kube_daemonset_status_desired_number_scheduled{job=~".*kube-state-metrics"} )) and ( changes(kube_daemonset_updated_number_scheduled{job=~".*kube-state-metrics"}[5m]) == 0) |
15m |
Daemonset 变更超过15分钟 |
| Daemonset 部分 node 未调度 |
kube_daemonset_status_desired_number_scheduled{job=~".*kube-state-metrics"} -kube_daemonset_status_current_number_scheduled{job=~".*kube-state-metrics"} > 0 |
10m |
Daemonset 在部分 node 未被调度 |
| Daemonset 部分 node 被错误调度 |
kube_daemonset_status_number_misscheduled{job=~".*kube-state-metrics"} > 0 |
15m |
Daemonset 被错误调度到一些 node |
| Job 运行太久 |
kube_job_spec_completions{job=~".*kube-state-metrics"} – kube_job_status_succeeded{job=~".*kube-state-metrics"} > 0 |
12h |
Job 执行时间超过12小时 |
| Job 执行失败 |
kube_job_failed{job=~".*kube-state-metrics"} > 0 |
15m |
Job 执行失败 |
| 副本数和 HPA 不匹配 |
(kube_hpa_status_desired_replicas{job=~".*kube-state-metrics"} !=kube_hpa_status_current_replicas{job=~".*kube-state-metrics"}) andchanges(kube_hpa_status_current_replicas[15m]) == 0 |
15m |
实际副本数和 HPA 设置的不一致 |
| 副本数达到 HPA 最大值 |
kube_hpa_status_current_replicas{job=~".*kube-state-metrics"} ==kube_hpa_spec_max_replicas{job=~".*kube-state-metrics"} |
15m |
实际副本数达到 HPA 配置的最大值 |
| PersistentVolume 状态异常 |
kube_persistentvolume_status_phase{phase=~"Failed|Pending",job=~".*kube-state-metrics"} > 0 |
15m |
PersistentVolume 处于 Failed 或 Pending状态 |
| 策略名称 |
策略表达式 |
持续时间 |
策略描述 |
| 文件系统空间快耗尽 |
( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 3and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0) |
1h |
文件系统空间预计在4小时后使用完 |
| 文件系统空间使用率高 |
( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 15and predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0) |
1h |
文件系统可用空间低于5% |
| 文件系统 inode 快耗尽 |
( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 3and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0) |
1h |
文件系统 inode 预计在4小时后使用完 |
| 文件系统 inode 使用率高 |
( node_filesystem_files_free{job="node-exporter",fstype!=""} / node_filesystem_files{job="node-exporter",fstype!=""} * 100 < 20and predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=""}[6h], 4*60*60) < 0and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0) |
1h |
文件系统可用 inode 低于3% |
| 网卡状态不稳定 |
changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2 |
2m |
网卡状态不稳定,在 up 和 down 间频繁变化 |
| 网卡接收出错 |
increase(node_network_receive_errs_total[2m]) > 10 |
1h |
网卡接收数据出错 |
| 网卡发送出错 |
increase(node_network_transmit_errs_total[2m]) > 10 |
1h |
网卡发送数据出错 |
| 机器时钟未同步 |
min_over_time(node_timex_sync_status[5m]) == 0 |
10m |
机器时间最近未同步,检查 NTP 是否正常配置 |
| 机器时钟漂移 |
( node_timex_offset_seconds > 0.05and deriv(node_timex_offset_seconds[5m]) >= 0)or( node_timex_offset_seconds < -0.05and deriv(node_timex_offset_seconds[5m]) <= 0) |
10m |
机器时间漂移超过300秒,检查 NTP 是否正常配置 |