ACK集群默认兼容阿里云Prometheus监控和开源Prometheus监控。当Prometheus预设指标无法满足您的业务需求时,您可以使用自定义PromQL来创建告警规则,监控集群节点、宿主机、容器副本、工作负载等资源的健康状况。报警规则可以在给定的数据指标达到关注阈值或条件满足时触发报警,并给您发送通知。
前提条件
已在ACK集群中启用Prometheus监控。具体操作,请参见阿里云Prometheus监控(推荐)、开源Prometheus监控。
通过自定义PromQL配置Prometheus报警规则
ACK集群默认兼容阿里云Prometheus监控和开源Prometheus监控。您可以基于Prometheus监控自定义PromQL配置报警规则,当告警规则设置的条件满足后,系统会产生对应的告警事件发送通知。
阿里云Prometheus监控
在阿里云Prometheus监控自定义PromQL配置报警规则的具体操作,请参见Prometheus告警规则。
开源Prometheus监控
配置告警通知策略。
开源Prometheus监控支持Webhook地址、钉钉机器人、Email等告警通知方式。您可以通过配置ack-prometheus-operator应用中
receiver
参数来设置Prometheus报警通知方式。具体操作,请参见告警配置。创建报警规则。
在集群中部署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
查看报警规则是否生效。
执行以下命令,将集群中的Prometheus映射到本地9090端口。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
在浏览器输入localhost:9090,查看Prometheus Server控制台。
在开源Prometheus页面顶部,选择
。在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的CPU资源水位较高时,会造成CPU资源限流,导致CPU时间片分配不足,最终影响Pod中进程的执行。 针对这种情况,请评估Pod的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的内存资源水位较高时,会造成Pod被OOMKilled,继而导致Pod重启。 针对这种情况,您需要确定Pod的内存 |
工作负载异常
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
Deployment可用副本状态异常 | Critical | kube_deployment_spec_replicas{} != kube_deployment_status_replicas_available{} | Deployment可用副本数未达到预期时,触发报警。 在操作入口,单击集群应用工作负载报警规则集,设置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可用副本状态异常报警规则。更多信息,请参见容器服务报警管理。 | 确定是否有Deployment的Pod启动失败。 |
DaemonSet副本调度异常 | Critical | kube_daemonset_status_number_misscheduled{job} > 0 | DaemonSet的副本调度异常时,触发报警。 在操作入口,单击集群应用工作负载报警规则集,设置Daemonset副本调度异常报警规则。更多信息,请参见容器服务报警管理。 | 确定是否有Deployment的Pod启动失败。 |
Job运行失败 | Critical | kube_job_status_failed{} > 0 | Job执行失败时,触发报警。 在操作入口,单击集群应用工作负载报警规则集,设置Job运行失败报警规则。更多信息,请参见容器服务报警管理。 | 在对应Job下的Pod的日志中查看详细失败信息。 |
存储异常
详细描述 | 重要级别 | 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分钟时,触发报警。 在操作入口,单击集群节点异常报警规则集,设置集群节点下线报警规则。更多信息,请参见容器服务报警管理。 |
|
宿主机水位异常
宿主机资源指标和节点资源指标的区别如下:
此指标为宿主机资源的指标,是对节点所在的物理机或虚拟机等宿主机资源的统计。
水位计算公式中,分子为宿主机上所有进程使用的资源(Usage),分母为宿主机的最大规格(Capacity)。
详细描述 | 重要级别 | PromQL配置 | 规则说明 | 常见处理SOP流程 |
宿主机内存水位高于85% | Warning | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 85 | 该集群的宿主机内存水位高于85%时,触发报警。 在操作入口,单击集群资源异常报警规则集,设置集群节点 - 内存使用率 >= 85%报警规则。更多信息,请参见容器服务报警管理。 说明 ACK报警配置中规则由云监控提供,与此Prometheus规则的指标含义一致。 85%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。 |
|
宿主机内存水位高于90% | Critical | (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) >= 90 | 该集群的宿主机内存水位高于90%。 |
|
宿主机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%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。 更多信息,请参见容器服务报警管理。 |
|
宿主机CPU水位高于90% | Critical | 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) >= 90 | 该集群的宿主机CPU水位高于90%时,触发报警。 |
|
节点资源异常
节点资源指标和宿主机资源指标的区别如下:
此指标为节点资源的指标,是对节点内的容器引擎层消耗和可分配资源的统计,即节点上容器已经消耗的资源(分子)与未被消耗的资源(分母)的比例。
以内存为例进行说明:
已消耗资源:一个节点使用的内存总资源,即该节点上所有运行容器的工作内存。工作内存包括容器已分配和已使用的内存、容器分配的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%时,触发报警。 计算公式为
|
|
节点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%时,触发报警。 计算公式为 |
|
节点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%时,触发报警。 计算公式为 300%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。 |
|
节点内存使用水位高于85% | Warning | sum(container_memory_working_set_bytes{pod!=""}) by (node) / sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 >= 85 | 该集群节点的内存水位高于85%时,触发报警。 计算公式为
|
|
节点内存资源分配率高于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%时,触发报警。 计算公式为 |
|
节点内存超卖率高于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%时,触发报警。 计算公式为 300%的默认阈值为推荐的参考值,实际取值可以以您的业务情况为准。 |
|
网络异常
详细描述 | 重要级别 | 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启用 | 请检查HPA策略是否符合预期。 |
相关文档
关于如何通过控制台或API获取Prometheus监控数据,请参见通过PromQL查询Prometheus监控数据。
您可以通过ACK Net Exporter快速发现和定位容器网络问题,请参见使用ACK Net Exporter定位网络问题。
关于使用阿里云Prometheus可能遇到的问题及对应解决方案,请参见可观测性FAQ。