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

ACK集群默认兼容阿里云Prometheus监控和开源Prometheus监控。当Prometheus预设指标无法满足您的业务需求时,您可以使用自定义PromQL来创建告警规则,监控集群节点、宿主机、容器副本、工作负载等资源的健康状况。报警规则可以在给定的数据指标达到关注阈值或条件满足时触发报警,并给您发送通知。

前提条件

已在ACK集群中启用Prometheus监控。具体操作,请参见使用阿里云Prometheus监控(推荐)、开源Prometheus监控

通过自定义PromQL配置Prometheus报警规则

ACK集群默认兼容阿里云Prometheus监控和开源Prometheus监控。您可以基于Prometheus监控自定义PromQL配置报警规则,当告警规则设置的条件满足后,系统会产生对应的告警事件发送通知。

阿里云Prometheus监控

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

开源Prometheus监控

  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页面查看报警规则,如果已显示目标报警规则,表明该报警规则已生效。

报警规则说明

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

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

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

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

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

说明

规则说明中的操作入口指报警配置页面的报警规则管理页签。您可以登录容器服务管理控制台集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 报警配置报警配置页面,单击报警规则管理页签,进行对应报警规则的更新。

容器副本异常

详细描述

重要级别

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的CPU的资源Limit是否配置过小。推荐使用CPU Burst性能优化策略,优化CPU限流现象,请参见启用CPU Burst性能优化策略。如果您的集群节点使用多核机型的服务器,推荐使用CPU拓扑感知调度,以最大化地利用碎片化CPU,请参见启用CPU拓扑感知调度

容器副本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未配置Limit,值为0。

85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

如需筛选指定Pod、命名空间的数据,请替换pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*"为实际取值。如需查询集群中所有Pod的相关数据,请删除此筛选条件。

当Pod的CPU资源水位较高时,会造成CPU资源限流,导致CPU时间片分配不足,最终影响Pod中进程的执行。

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

容器副本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的Limit,值为0。

85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

如需筛选指定Pod、命名空间的数据,请替换pod=~"{{PodName}}.*",namespace=~"{{Namespace}}.*"为实际取值。如需查询集群中所有Pod的相关数据,请删除此筛选条件。

当Pod的内存资源水位较高时,会造成Pod被OOMKilled,继而导致Pod重启。

针对这种情况,您需要确定Pod的内存resource limit是否配置过小。推荐使用资源画像功能配置Pod的内存Limit,请参见资源画像

工作负载异常

详细描述

重要级别

PromQL配置

规则说明

常见处理SOP流程

Deployment可用副本状态异常

Critical

kube_deployment_spec_replicas{} != kube_deployment_status_replicas_available{}

Deployment可用副本数未达到预期时,触发报警。

在操作入口,单击集群应用工作负载报警规则集,设置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可用副本状态异常报警规则。更多信息,请参见容器服务报警管理

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

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

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

DaemonSet副本调度异常

Critical

kube_daemonset_status_number_misscheduled{job} > 0

DaemonSet的副本调度异常时,触发报警。

在操作入口,单击集群应用工作负载报警规则集,设置Daemonset副本调度异常报警规则。更多信息,请参见容器服务报警管理

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

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

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

Job运行失败

Critical

kube_job_status_failed{} > 0

Job执行失败时,触发报警。

在操作入口,单击集群应用工作负载报警规则集,设置Job运行失败报警规则。更多信息,请参见容器服务报警管理

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

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

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

存储异常

详细描述

重要级别

PromQL配置

规则说明

常见处理SOP流程

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的云盘挂载内容。

节点状态异常

详细描述

重要级别

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

    若不符合预期,请尽快评估此节点上的业务Pod是否受到影响,必要时请进行Pod驱逐。

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

宿主机水位异常

说明

宿主机资源指标和节点资源指标的区别如下:

  • 此指标为宿主机资源的指标,是对节点所在的物理机或虚拟机等宿主机资源的统计。

  • 水位计算公式中,分子为宿主机上所有进程使用的资源(Usage),分母为宿主机的最大规格(Capacity)。

详细描述

重要级别

PromQL配置

规则说明

常见处理SOP流程

宿主机内存水位高于85%

Warning

(100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 85

该集群的宿主机内存水位高于85%时,触发报警。

在操作入口,单击集群资源异常报警规则集,设置集群节点 - 内存使用率 >= 85%报警规则。更多信息,请参见容器服务报警管理

说明

ACK报警配置中规则由云监控提供,与此Prometheus规则的指标含义一致。

85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

  • 释放资源。

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

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

宿主机内存水位高于90%

Critical

(100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 90

该集群的宿主机内存水位高于90%。

  • 释放资源。

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

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

宿主机CPU水位高于85%

Warning

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

该集群的宿主机CPU水位高于85%时,触发报警,

在操作入口,单击集群资源异常报警规则集,设置集群节点 - CPU使用率 >= 85%报警规则。

说明

ACK报警配置中规则由云监控ECS监控提供,与Prometheus此规则的指标含义一致。

85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

更多信息,请参见容器服务报警管理

  • 释放资源。

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

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

节点资源异常

说明

节点资源指标和宿主机资源指标的区别如下:

  • 此指标为节点资源的指标,是对节点内的容器引擎层消耗和可分配资源的统计,即节点上容器已经消耗的资源(分子)与未被消耗的资源(分母)的比例。

    以内存为例进行说明:

    • 已消耗资源:一个节点使用的内存总资源,即该节点上所有运行容器的工作内存。工作内存包括容器已分配和已使用的内存、容器分配的Page Cache等。

    • 未消耗资源:容器可分配的资源量,将排除宿主机的容器引擎层资源消耗,即ACK的节点预留资源。更多信息,请参见节点资源预留策略

  • 水位计算公式中,分子为节点上所有容器的资源使用量(Usage,决定容器Pod调度的资源指标),分母为节点可为容器分配的资源量(Allocatable)。

详细描述

重要级别

PromQL配置

规则说明

常见处理SOP流程

节点CPU使用水位高于85%

Warning

sum(irate(container_cpu_usage_seconds_total{pod!=""}[1m])) by (node) / sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 >= 85

该集群节点的CPU水位高于85%时,触发报警。

计算公式为

节点已使用资源Usage / 节点总可分配资源Allocatable

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,以及集群中Pod的CPU Request是否合理,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod的CPU Request,以分散Pod,使其调度到不同节点,使各节点资源的可使用量保持平衡。更多信息,请参见资源画像

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

节点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的可分配资源Request的总和 / 节点总可分配资源1Allocatable

  • 该节点可再被调度的资源不足,超过可分配规格的Pod需要被调度到其他节点。

  • 检查该节点上的Pod资源是否存在浪费,导致日常实际资源使用Usage远小于分配资源Request。推荐使用成本洞察功能检查是否有Pod占用了可调度资源,以及集群中Pod的内存Request是否合理,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod的CPU Request,请参见资源画像

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

节点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的总和 / 节点总可分配资源Allocatable

300%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

  • 节点上已调度的Pod的资源Limit的总和远大于节点总可分配资源。当出现业务波峰时,资源使用量飙升会造成CPU时间片分配不足,从而产生抢占和限流,造成进程响应速度变慢等影响。

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

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

节点内存使用水位高于85%

Warning

sum(container_memory_working_set_bytes{pod!=""}) by (node) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85

该集群节点的内存水位高于85%时,触发报警。

计算公式为

节点已使用资源Usage / 节点总可分配资源Allocatable

  • 释放资源。

    推荐使用成本洞察功能检查是否有Pod占用了可调度资源,以及集群中Pod内存Request是否合理,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod的内存 Request,以分散Pod,使其调度到不同节点,维持各节点资源可使用量保持平衡。更多信息,请参见资源画像

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

节点内存资源分配率高于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的可分配资源Request的总和 / 节点总可分配资源Allocatable

  • 该节点可再被调度的资源不足,超过可分配规格的Pod需要被调度到其他节点。

  • 检查该节点上的Pod资源是否存在浪费,导致日常实际资源使用Usage远小于分配资源Request。推荐使用成本洞察功能检查是否有Pod占用了可调度资源,以及集群中Pod内存Request是否合理,请参见启用成本洞察功能。推荐使用资源画像功能配置Pod的内存 Request,请参见资源画像

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

节点内存超卖率高于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的总和 / 节点总可分配资源Allocatable

300%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。

  • 节点上已调度的Pod的资源限制Limit的总和远大于节点总可分配资源。当出现业务波峰时,资源使用量飙升会造成内存达到节点限制,导致节点OOM,从而可能造成进程被OOMKilled,影响业务正常运行。

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

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

网络异常

详细描述

重要级别

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策略是否符合预期。

相关文档