通过Kubernetes Label分发告警

本文以容器CPU使用率告警为例演示当Pod出现告警后,如何通过Pod上的标签进行告警分发。

背景信息

Kubernetes提供了非常轻巧灵活的标签机制实现多维度的资源分组管理功能,在实际的使用中我们通常会给应用打上各种标签,例如env:prod代表应用是生产环境,service:iam代表应用提供IAM服务。通过这些标签我们可以从各个维度来进行管理,如查看生产环境的应用列表,查看IAM服务的资源使用量。

ARMS告警管理可以通过Prometheus数据源对告警添加标签,当Pod出现告警后可以将Pod上的Labels作为标签添加到告警中,再通过通知策略实现按照任意标签分发告警。

原理

  1. Prometheus中的kube-state-metrics提供了各个基础资源的标签指标,如kube_pod_labels、kube_node_labels等,记录了每个资源的标签。

  2. 在告警规则上配置特定的注释(_aliyun_arms_enrich_desc),注释内容是一个可执行的PromQL,在告警发生后告警引擎会通过查询这个PromQL,将查询出的标签添加到告警中。

  3. 配置注释内容为kube-state-metrics提供的标签指标对应的查询语句,对告警添加标签。

操作步骤

  1. Kubernetes集群接入阿里云Prometheus监控。具体操作,请参见Prometheus实例 for 容器服务

  2. ACK中部署应用。

    1. 容器服务管理控制台左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理

    2. 无状态页面的目标应用右侧选择更多 > 编辑YAML

    3. 编辑YAML对话框添加自定义Labelapp:arms-prom-ack-arms-prometheus

      添加label

    4. 单击更新

  3. 创建Prometheus告警规则。

    1. ARMS控制台左侧导航栏,选择Prometheus监控 > Prometheus告警规则

    2. Prometheus告警规则页面的右上角单击创建Prometheus告警规则

    3. 创建Prometheus告警规则页面,设置告警名称EnrichDemo告警条件当容器CPU使用率大于2%时,满足告警条件。

      创建Prometheus告警规则1

    4. 参见Prometheus告警规则,设置其他告警参数,然后单击保存

  4. 为告警添加标签。

    创建Prometheus告警规则页面单击高级设置右侧箭头,添加注释。Prometheus告警注释

    注释说明:

    • 键:_aliyun_arms_enrich_desc。

    • 值: 可执行的PromQL,支持通过${xxx}引用告警中的标签,此处示例为kube_pod_labels{pod_name=${pod_name}},示例中使用了${pod_name}来引用Pod名称。

    重要
    • 注释值的内容必须是可以执行的PromQL。

    • 执行PromQL查询出的内容只能包含一条时间序列(timeseries)。

    • PromQL执行结果中查询出来的所有标签会被添加到告警中。

    • kube_pod_labels会对所有标签的Key添加label_前缀,因此在最终使用时需要手动添加这个前缀。

    • 当查询出来的结果超过10条时间线时,只能对前10条时间线富化标签。

  5. 配置通知策略。

    通知策略页面通过设置匹配告警事件规则为label_app等于arms-prom-ack-arms-prometheus订阅告警。具体操作,请参见通知策略通知策略

  6. 告警发送历史页面查看告警信息。更多信息,请参见查看告警发送历史

    告警发送历史