文章目录
使用Prometheus配置报警规则的最佳实践 - 阿里云
ACK
从集群稳定性、集群节点异常、集群节点水位、应用容器副本异常、工作负载异常、存储异常、网络异常等多个方面,通过集群、应用的运维经验沉淀,总结梳理出以下Prometheus
重要报警规则配置。
报警规则包含容器副本异常、工作负载异常等内容,分为以下级别。
-
Critical
:造成集群、应用、甚至业务影响,需要立即处理。 -
Warning
:造成集群、应用、甚至业务影响,需要尽快排查。 -
Normal
:涉及重要功能变更。
报警规则说明
ACK从集群稳定性、集群节点异常、集群节点水位、应用容器副本异常、工作负载异常、存储异常、网络异常等多个方面,通过集群、应用的运维经验沉淀,总结梳理出以下Prometheus重要报警规则配置。
容器副本异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
Pod状态异常 | Critical | min_over_time(sum by (namespace, pod, phase) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[5m:1m]) > 0 |
最近5分钟内,Pod的状态有异常时,触发报警。 | 关于Pod状态异常的处理方法,请参见Pod异常问题排查。 |
Pod启动失败 | Critical | sum_over_time(increase(kube_pod_container_status_restarts_total{})[5m:1m]) > 3 |
最近5分钟内,Pod启动异常累计3次以上时,触发报警。 | 关于Pod启动失败的处理方法,请参见Pod异常问题排查。 |
超1000个Pod调度失败异常 | Critical | sum(sum(max_over_time(kube_pod_status_phase{ phase=~"Pending"}[5m])) by (pod)) > 1000 |
最近5分钟内,累计有1000个Pod处于调度失败Pending状态时,触发报警。 | 可能是大规模集群调度场景下任务压力过大引起的。推荐使用ACK集群Pro版。 |
容器CPU限流频繁 | Warning | rate(container_cpu_cfs_throttled_seconds_total[3m]) * 100 > 25 |
容器CPU被频繁限流。最近3分钟内,被限流的CPU时间片大于25%时,触发报警。 | 针对这种情况,请评估Pod的CPU资源Limit是否配置过小。推荐使用CPU Burst性能优化策略。 |
容器副本Pod的CPU资源水位高于85% | Warning | sum(irate(container_cpu_usage_seconds_total{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container!="",container!="POD"}[1m])) by (namespace,pod) / sum(container_spec_cpu_quota{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container!="",container!="POD"}/100000) by (namespace,pod) * 100 <= 100 or on() vector(0) >= 85 |
在指定命名空间或Pod下,容器副本Pod的CPU资源水位超过Pod Limit的85%时,会触发报警。 | 当Pod的CPU资源水位较高时,会造成CPU资源限流,导致CPU时间片分配不足,最终影响Pod中进程的执行。 |
容器副本Pod的内存资源水位高于85% | Warning | (sum(container_memory_working_set_bytes{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container !="",container!="POD"}) by (pod,namespace)/ sum(container_spec_memory_limit_bytes{pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*",container !="",container!="POD"}) by (pod, namespace) * 100) <= 100 or on() vector(0) >= 85 |
容器副本Pod的内存资源水位高于Pod Limit的85%时,触发报警。 | 当Pod的内存资源水位较高时,会造成Pod被OOMKilled,继而导致Pod重启。 |
工作负载异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
Deployment可用副本状态异常 | Critical | kube_deployment_spec_replicas{} != kube_deployment_status_replicas_available{} |
Deployment可用副本数未达到预期时,触发报警。 | 确定是否有Deployment的Pod启动失败。 |
DaemonSet副本状态异常 | Critical | ((100 - kube_daemonset_status_number_ready{} / kube_daemonset_status_desired_number_scheduled{} * 100) or (kube_daemonset_status_desired_number_scheduled{} - kube_daemonset_status_current_number_scheduled{})) > 0 |
DaemonSet的可用副本数未达到预期时,触发报警。 | 确定是否有Deployment的Pod启动失败。 |
DaemonSet副本调度异常 | Critical | kube_daemonset_status_number_misscheduled{job} > 0 |
DaemonSet的副本调度异常时,触发报警。 | 确定是否有Deployment的Pod启动失败。 |
Job运行失败 | Critical | kube_job_status_failed{} > 0 |
Job执行失败时,触发报警。 | 在对应Job下的Pod的日志中查看详细失败信息。 |
存储异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
PersistentVolume状态异常 | Critical | kube_persistentvolume_status_phase{phase=~"Failed|Pending"} > 0 |
存储卷PV状态异常时,触发报警。 | 关于PersistentVolume状态异常的处理方法,请参见云盘存储卷FAQ的云盘挂载内容。 |
节点磁盘空间不足10% | Critical | ((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes) < 10 |
节点某磁盘块设备可用空间不足10%时,触发报警。 | 建议扩容节点和节点磁盘。 |
节点状态异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
节点NotReady状态持续3分钟 | Critical | (sum(max_over_time(kube_node_status_condition{condition="Ready",status="true"}[3m]) <= 0) by (node)) or (absent(kube_node_status_condition{condition="Ready",status="true"})) > 0 |
集群节点NotReady状态持续3分钟时,触发报警。 | 确定节点NotReady状态是否符合预期。 |
宿主机水位异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
宿主机内存水位高于85% | Warning | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 85 |
该集群的宿主机内存水位高于85%时,触发报警。 | 释放资源。推荐使用成本洞察功能检查是否有Pod占用了可调度资源。 |
宿主机内存水位高于90% | Critical | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 90 |
该集群的宿主机内存水位高于90%。 | 释放资源。推荐使用成本洞察功能检查是否有Pod占用了可调度资源。 |
宿主机CPU水位高于85% | Warning | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) >= 85 |
该集群的宿主机CPU水位高于85%时,触发报警。 | 释放资源。推荐使用成本洞察功能检查是否有Pod占用了可调度资源。 |
宿主机CPU水位高于90% | Critical | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) >= 90 |
该集群的宿主机CPU水位高于90%时,触发报警。 | 释放资源。推荐使用成本洞察功能检查是否有Pod占用了可调度资源。 |
节点资源异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
节点CPU资源分配率高于85% | Normal | (sum(sum(kube_pod_container_resource_requests{resource="cpu"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 85 |
该集群节点的CPU已分配水位高于85%时,触发报警。 | 该节点可再被调度的资源不足,超过可分配规格的Pod需要被调度到其他节点。 |
节点CPU超卖率高于300% | Warning | (sum(sum(kube_pod_container_resource_limits{resource="cpu"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 300 |
该集群节点的CPU超卖水位高于300%时,触发报警。 | 节点上已调度的Pod的资源Limit的总和远大于节点总可分配资源。 |
节点内存使用水位高于85% | Warning | sum(container_memory_working_set_bytes{pod!=""}) by (node) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85 |
该集群节点的内存水位高于85%时,触发报警。 | 释放资源。推荐使用成本洞察功能检查是否有Pod占用了可调度资源。 |
节点内存资源分配率高于85% | Normal | (sum(sum(kube_pod_container_resource_requests{resource="memory"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85 |
该集群节点的内存已分配水位高于85%时,触发报警。 | 该节点可再被调度的资源不足,超过可分配规格的Pod需要被调度到其他节点。 |
节点内存超卖率高于300% | Warning | (sum(sum(kube_pod_container_resource_limits{resource="memory"}) by (pod, node) * on (pod) group_left max(kube_pod_status_ready) by (pod, node)) by (node)) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 300 |
该集群节点的内存超卖水位高于300%时,触发报警。 | 节点上已调度的Pod的资源限制Limit的总和远大于节点总可分配资源。 |
网络异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
集群CoreDNS可用性异常-请求跌零 | Critical | (sum(rate(coredns_dns_request_count_total{}[1m]))by(server,zone)<=0) or (sum(rate(coredns_dns_requests_total{}[1m]))by(server,zone)<=0) |
仅ACK托管集群(Pro版、基础版)支持检测该异常。 | 检查集群中CoreDNS Pod是否正常。 |
集群CoreDNS可用性异常-panic异常 | Critical | sum(rate(coredns_panic_count_total{}[3m])) > 0 |
仅ACK托管集群(Pro版、基础版)支持检测该异常。 | 检查集群中CoreDNS Pod是否正常。若CoreDNS行为不符合预期,请提交工单咨询。 |
集群IngressController证书即将过期 | Warning | ((nginx_ingress_controller_ssl_expire_time_seconds - time()) / 24 / 3600) < 14 |
您需要安装部署ACK Ingress Controller组件,并开启Ingress功能。 | 重新签发Ingress Controller证书。 |
弹性伸缩异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
---|---|---|---|---|
HPA当前副本数已达最大副本设置数 | Warning | max(kube_horizontalpodautoscaler_spec_max_replicas) by (namespace, horizontalpodautoscaler) - max(kube_horizontalpodautoscaler_status_current_replicas) by (namespace, horizontalpodautoscaler) <= 0 |
您需要在阿里云Prometheus启用horizontalpodautoscaler 相关指标(默认关闭)。此指标为免费指标。 |
请检查HPA策略是否符合预期。 |
说明:
-
规则说明中的操作入口指报警配置页面的报警规则管理页签。您可以登录容器服务管理控制台,在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择报警配置。在报警配置页面,单击报警规则管理页签,进行对应报警规则的更新。
-
85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。
-
针对某些报警规则,可能需要根据实际情况调整PromQL配置中的参数,以适应不同的监控需求。