通过 Prometheus 报警触发诊断

通过 Prometheus 报警创建 Diagnosis 来触发诊断。

本文介绍了如何通过 Prometheus 报警创建 Diagnosis 来触发诊断。

开始之前

在教程开始前,您需要确定 Kubernetes 集群中已经正确安装 KubeDiag。

将 KubeDiag Master 注册到 Prometheus 的 Alertmanager 列表

通过配置 Prometheus 可以将 KubeDiag Master 注册到 Prometheus 的 Alertmanager 列表。KubeDiag Master 在接收到报警后会匹配报警消息和 Trigger 中定义的模板,如果匹配成功则根据报警消息中的数据创建 Diagnosis 对象并触发诊断工作流。Prometheus 配置项详情可参考官方文档

Prometheus Operator 为用户提供了在 Kubernetes 集群中对 Prometheus 以及其相关监控组件的管理能力。通过配置 Prometheus 自定义资源中的 .spec.alerting 字段可以将 KubeDiag Master 注册到 Prometheus 的 Alertmanager 列表,部分配置如下所示:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
# ......
spec:
  # ......
  alerting:
    alertmanagers:
    # ......
    - name: kubediag-master
      namespace: kubediag
      port: http

如果您没有使用 Prometheus Operator 来管理 Prometheus,还可以通过直接修改配置文件的方式注册 KubeDiag Master,部分配置如下所示:

alerting:
  # ......
  alertmanagers:
  # ......
  - kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
        - kubediag
    scheme: http
    path_prefix: /
    timeout: 10s
    api_version: v1
    relabel_configs:
    - source_labels: [__meta_kubernetes_service_name]
      separator: ;
      regex: kubediag-master
      replacement: $1
      action: keep
    - source_labels: [__meta_kubernetes_endpoint_port_name]
      separator: ;
      regex: http
      replacement: $1
      action: keep

为 Prometheus 报警项创建 Trigger 对象

您可以通过 Trigger 对象来定义 KubeDiag 根据接收到的报警信息自动创建 Diagnosis 的方式。下列 Trigger 在 NodeClockNotSynchronising 报警触发时创建 Diagnosis 来触发诊断流程:

apiVersion: diagnosis.kubediag.org/v1
kind: Trigger
metadata:
  name: node-clock-not-synchronising
spec:
  operationSet: node-clock-debugger
  sourceTemplate:
    prometheusAlertTemplate:
      regexp:
        alertName: NodeClockNotSynchronising
      nodeNameReferenceLabel: instance
      podNameReferenceLabel: pod
      podNamespaceReferenceLabel: namespace
      containerReferenceLabel: container
      parameterInjectionLabels:
      - endpoint
      - service
      - severity

NodeClockNotSynchronising 报警消息包含下列标签:

alertname="NodeClockNotSynchronising"
container="kube-rbac-proxy"
endpoint="https"
instance="my-node"
job="node-exporter"
namespace="monitoring"
pod="node-exporter-2vqfp"
service="node-exporter"
severity="warning"

KubeDiag 接收到 NodeClockNotSynchronising 报警消息时会创建下列 Diagnosis:

apiVersion: diagnosis.kubediag.org/v1
kind: Diagnosis
metadata:
  labels:
    adjacency-list-hash: 57db4479b7
  name: prometheus-alert.nodeclocknotsynchronising.94df165
  namespace: kubediag
spec:
  nodeName: my-node
  operationSet: node-clock-debugger
  parameters:
    endpoint: https
    service: node-exporter
    severity: warning
  podReference:
    container: kube-rbac-proxy
    name: node-exporter-2vqfp
    namespace: monitoring

在该示例中,Trigger 与创建出的 Diagnosis 中各字段对应关系如下:

  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.regexp.alertName 用于匹配 Prometheus 报警名,该字段是一个 RE2 正则表达式,如果匹配成功则基于该报警消息创建 Diagnosis。
  • Trigger 的 .spec.operationSet 与 Diagnosis 的 .spec.operationSet 相同。
  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.nodeNameReferenceLabelinstance,而 NodeClockNotSynchronising 报警消息中包含 instance="my-node" 标签,该标签的值 my-node 与 Diagnosis 的 .spec.nodeName 一致。
  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.podNameReferenceLabelpod,而 NodeClockNotSynchronising 报警消息中包含 pod="node-exporter-2vqfp" 标签,该标签的值 node-exporter-2vqfp 与 Diagnosis 的 .spec.podReference.name 一致。
  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.podNamespaceReferenceLabelnamespace,而 NodeClockNotSynchronising 报警消息中包含 namespace="monitoring" 标签,该标签的值 monitoring 与 Diagnosis 的 .spec.podReference.namespace 一致。
  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.containerReferenceLabelcontainer,而 NodeClockNotSynchronising 报警消息中包含 pod="node-exporter-2vqfp" 标签,该标签的值 node-exporter-2vqfp 与 Diagnosis 的 .spec.podReference.container 一致。
  • Trigger 的 .spec.sourceTemplate.prometheusAlertTemplate.parameterInjectionLabels 是一个列表,该列表包含了需要注入 Diagnosis 中报警标签的键并且与 Diagnosis 的 .spec.parameters 一致。
最后修改 July 7, 2021 : First commit (f2fe7c7)