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状态异常Criticalmin_over_time(sum by (namespace, pod, phase) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[5m:1m]) > 0最近5分钟Pod的状态异常触发报警。

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

关于Pod状态异常的处理方法,请参见Pod异常问题排查
Pod启动失败Criticalsum_over_time(increase(kube_pod_container_status_restarts_total{}[1m])[5m:1m]) > 3最近5分钟Pod启动异常累计3次以上触发报警。

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

关于Pod启动失败的处理方法,请参见Pod异常问题排查
超1000个Pod调度失败异常Criticalsum(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限流频繁Warningrate(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可用副本状态异常Criticalkube_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{})) > 0Daemonset可用副本数未达到预期触发报警。

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

确定是否有Deployment的Pod启动失败。
  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查
  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。
Daemonset副本调度异常Criticalkube_daemonset_status_number_misscheduled{job} > 0Daemonset副本调度异常报警。

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

确定是否有Deployment的Pod启动失败。
  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查
  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。
Job运行失败Criticalkube_job_status_failed{} > 0Job执行失败异常触发报警。

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

在对应Job下的Pod的日志中查看详细失败信息。
  • 若有Pod启动或者状态异常,您需要排查Pod异常问题。具体操作,请参见Pod异常问题排查
  • 若没有Pod启动或者状态异常,您需要提交工单,向技术支持人员描述情况并提供集群ID。
存储异常PersistentVolume状态异常Criticalkube_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%Warningnode_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 20节点内存水位高于80%触发报警。

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

  • 释放资源。

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

  • 规划容量,扩容节点。具体操作,请参见扩容ACK集群的节点
节点内存水位高于90%Criticalnode_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10节点内存水位高于90%。
  • 释放资源。

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

  • 规划容量,扩容节点。具体操作,请参见扩容ACK集群的节点
容器节点水位异常节点CPU水位高于80%Warning100 - (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%Critical100 - (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异常Criticalsum(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当前副本数已达最大副本设置数Warningmax(kube_horizontalpodautoscaler_spec_max_replicas) by (namespace, horizontalpodautoscaler) - max(kube_horizontalpodautoscaler_status_current_replicas) by (namespace, horizontalpodautoscaler) <= 0您需要在ARMS-Prometheus启用horizontalpodautoscaler相关指标(默认关闭)。此指标为免费指标。弹性伸缩请检查HPA策略是否符合预期。

相关文档