该策略说明仅适用于旧的包年包月类型的 Prometheus 实例。按量付费类型和资源包类型的 Prometheus 实例,请参考控制台的模板管理中的默认模板内容。
Kubernetes Master 组件
非托管集群提供如下指标:
策略名称 | 策略表达式 | 持续时间 | 策略描述 |
客户端访问 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 核心组件运行了不同的版本 |
Kubelet
策略名称 | 策略表达式 | 持续时间 | 策略描述 |
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 从采集目标消失 |
Kubernetes 资源使用
策略名称 | 策略表达式 | 持续时间 | 策略描述 |
集群 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% |
Kubernetes 工作负载
策略名称 | 策略表达式 | 持续时间 | 策略描述 |
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状态 |
Kubernetes 节点
策略名称 | 策略表达式 | 持续时间 | 策略描述 |
文件系统空间快耗尽 | ( 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 是否正常配置 |