有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
该策略说明仅适用于旧的包年包月类型的 Prometheus 实例。按量付费类型和资源包类型的 Prometheus 实例,请参考控制台的模板管理中的默认模板内容。
Prometheus 监控服务为 Kubernetes 集群预设了 Master 组件Kubelet资源使用工作负载节点 报警模板。

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_observed_generation{job=~".*kube-state-metrics"} !=kube_statefulset_metadata_generation{job=~".*kube-state-metrics"}
15m
部署版本和设置版本不一致,表示 statefulset 变更没有生效
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 更新未生效
( 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 是否正常配置