文档

使用Prometheus配置报警规则的最佳实践

更新时间:

ACK集群默认提供阿里云Prometheus监控和开源Prometheus监控。本文介绍在使用Prometheus监控ACK集群时,如何配置报警规则,以及报警规则说明。

索引

配置Prometheus报警规则

在阿里云Prometheus监控自定义PromQL配置报警规则

在阿里云Prometheus监控自定义PromQL配置报警规则的具体操作,请参见Prometheus告警规则

在开源Prometheus监控自定义PromQL配置报警规则

  1. 配置告警通知策略。

    开源Prometheus监控支持Webhook地址、钉钉机器人、Email等告警通知方式。您可以通过配置ack-prometheus-operator应用中receiver参数来设置Prometheus报警通知方式。具体操作,请参见告警配置

  2. 创建报警规则。

    在集群中部署PrometheusRule CRD,定义报警规则。更多信息,请参见Deploying Prometheus Rules

    apiVersion: monitoring.coreos.com/v1
    kind: PrometheusRule
    metadata:
      labels:
        # labels与Prometheus CRD中match ruleSelector -> matchLabels保持一致。
        prometheus: example
        role: alert-rules
      name: prometheus-example-rules
    spec:
      groups:
      - name: example.rules
        rules:
        - alert: ExampleAlert
          # expr为PromQL对数据的查询和触发条件,此处可参考本文报警规则说明列表中PromQL配置列。
          expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 90
  3. 查看报警规则是否生效。

    1. 执行以下命令,将集群中的Prometheus映射到本地9090端口。

      kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
    2. 在浏览器输入localhost:9090,查看Prometheus Server控制台。

    3. 在开源Prometheus页面顶部,选择Status > Rules

      Rules页面查看报警规则。如果Rules页面显示目标报警规则,表明该报警规则已生效。

报警规则说明

ACK从集群稳定性、集群节点异常、集群节点水位、应用容器副本异常、工作负载异常、存储异常、网络异常等多个方面,通过集群、应用的运维经验沉淀,总结梳理出以下Prometheus重要报警规则配置。

报警规则包含容器副本异常、工作负载异常等内容,分为以下级别。

  • Critical:造成集群、应用、甚至业务影响,需要立即处理。

  • Warning:造成集群、应用、甚至业务影响,需要尽快排查。

  • Normal:涉及重要功能变更。

下方列表中PromQL配置列均以适配阿里云Prometheus(ARMS-Prometheus)撰写,开源Prometheus请去掉job="_kube-state-metrics"等Label条件。

异常类别

详细描述

重要级别

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异常问题排查

Pod启动失败

Critical

sum_over_time(increase(kube_pod_container_status_restarts_total{}[1m])[5m:1m]) > 3

最近5分钟Pod启动异常累计3次以上触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群容器副本异常报警规则集,设置Pod启动失败报警规则。更多信息,请参见容器服务报警管理

关于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版集群增强集群调度等核心能力,并提供SLA保障。推荐升级为ACK Pro版集群。更多信息,请参见ACK Pro版集群概述

容器CPU限流频繁

Warning

rate(container_cpu_cfs_throttled_seconds_total[3m]) * 100 > 25

容器CPU被频繁限流。最近3分钟被限流CPU时间片>25%

CPU时间片限流(CPU Throttling)会减少容器内进程获得的CPU时间片,影响容器内进程运行时长,有可能导致容器进程的业务行为变慢。

针对这种情况,您需要确定Pod的CPUresource limit是否配置过小。推荐使用CPU Burst性能优化策略,优化CPU限流现象。更多信息,请参见CPU Burst性能优化策略。如果你的集群节点使用多核机型的服务器,推荐使用CPU拓扑感知调度,最大化利用碎片化CPU。更多信息,请参见CPU拓扑感知调度

工作负载异常

Deployment可用副本状态异常

Critical

kube_deployment_spec_replicas{} != kube_deployment_status_replicas_available{}

Daemonset可用副本数未达到预期触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群应用工作负载报警规则集,设置Deployment可用副本状态异常报警规则。更多信息,请参见容器服务报警管理

确定是否有Deployment的Pod启动失败。

  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查

  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。

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可用副本状态异常报警规则。更多信息,请参见容器服务报警管理

确定是否有Deployment的Pod启动失败。

  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查

  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。

Daemonset副本调度异常

Critical

kube_daemonset_status_number_misscheduled{job} > 0

Daemonset副本调度异常报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群应用工作负载报警规则集,设置Daemonset副本调度异常报警规则。更多信息,请参见容器服务报警管理

确定是否有Deployment的Pod启动失败。

  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查

  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。

Job运行失败

Critical

kube_job_status_failed{} > 0

Job执行失败异常触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群应用工作负载报警规则集,设置Job运行失败报警规则。更多信息,请参见容器服务报警管理

在对应Job下的Pod的日志中查看详细失败信息。

  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查

  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。

存储异常

PersistentVolume状态异常

Critical

kube_persistentvolume_status_phase{phase=~"Failed|Pending"} > 0

存储卷PV状态异常触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群存储异常事件报警规则集,设置PersistentVolume状态异常报警规则,更多信息。请参见容器服务报警管理

关于PersistentVolume状态异常的处理方法,请参见云盘存储卷FAQ的云盘挂载内容。

节点磁盘空间不足10%

Critical

((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes) < 10

节点某磁盘块设备可用空间不足10%触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群资源异常报警规则集,设置集群节点 - 磁盘使用率 >=85%报警规则。更多信息,请参见容器服务报警管理

建议扩容节点和节点磁盘。更多信息,请参见云盘存储卷FAQ的云盘挂载内容。

节点状态异常

节点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状态是否符合预期,例如正在置换节点、下线节点、或手动置此节点为不可用状态等。

    重要

    若不符合预期,请尽快确保此节点上的业务Pod是否受影响,必要时进行Pod驱逐,避免影响线上业务。

  • 节点不可用可由多种原因导致,您可以通过检查节点的Condition来判断是否有常见异常,例如内存压力过大、磁盘空间满等。

宿主机水位异常

节点内存水位高于80%

Warning

node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 20

节点内存水位高于80%触发报警。

在容器服务控制台报警配置页面报警规则管理页签下,单击集群资源异常报警规则集,设置集群节点 - 内存使用率 >=85%报警规则。更多信息,请参见容器服务报警管理

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,集群中Pod内存需求量是否合理。更多信息,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod Memory Request。更多信息,请参见资源画像

  • 规划容量,扩容节点。具体操作,请参见扩缩容ACK集群的节点

节点内存水位高于90%

Critical

node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10

节点内存水位高于90%。

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,集群中Pod内存需求量是否合理。更多信息,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod Memory Request。更多信息,请参见资源画像

  • 规划容量,扩容节点。具体操作,请参见扩缩容ACK集群的节点

容器节点水位异常

节点CPU水位高于80%

Warning

100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80

节点CPU水位高于80%触发报警

在容器服务控制台报警配置页面报警规则管理页签下,单击集群资源异常报警规则集,设置集群节点 - CPU使用率 >=85%报警规则。更多信息,请参见容器服务报警管理

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,集群中Pod内存需求量是否合理。更多信息,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod CPU Request。更多信息,请参见资源画像

  • 规划容量,扩容节点。具体操作,请参见扩缩容ACK集群的节点

节点CPU水位高于90%

Critical

100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 90

节点CPU水位高于90%。

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,集群中Pod内存需求量是否合理。更多信息,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod CPU Request。更多信息,请参见资源画像

  • 规划容量,扩容节点。具体操作,请参见扩缩容ACK集群的节点

网络异常

集群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证书。

弹性伸缩

HPA当前副本数已达最大副本设置数

Warning

max(kube_horizontalpodautoscaler_spec_max_replicas) by (namespace, horizontalpodautoscaler) - max(kube_horizontalpodautoscaler_status_current_replicas) by (namespace, horizontalpodautoscaler) <= 0

您需要在ARMS-Prometheus启用horizontalpodautoscaler相关指标(默认关闭)。此指标为免费指标。弹性伸缩

请检查HPA策略是否符合预期。

相关文档

  • 本页导读 (1)
文档反馈