阿里云-使用Prometheus配置报警规则的最佳实践

文章目录
  1. 1. 使用Prometheus配置报警规则的最佳实践 - 阿里云
  2. 2. 报警规则说明
    1. 2.1. 容器副本异常
    2. 2.2. 工作负载异常
    3. 2.3. 存储异常
    4. 2.4. 节点状态异常
    5. 2.5. 宿主机水位异常
    6. 2.6. 节点资源异常
    7. 2.7. 网络异常
    8. 2.8. 弹性伸缩异常
    9. 2.9. 参考资料

使用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配置中的参数,以适应不同的监控需求。

参考资料