通过 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 列表,部分配置如下所示:

  1. apiVersion: monitoring.coreos.com/v1
  2. kind: Prometheus
  3. # ......
  4. spec:
  5. # ......
  6. alerting:
  7. alertmanagers:
  8. # ......
  9. - name: kubediag-master
  10. namespace: kubediag
  11. port: http

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

  1. alerting:
  2. # ......
  3. alertmanagers:
  4. # ......
  5. - kubernetes_sd_configs:
  6. - role: endpoints
  7. namespaces:
  8. names:
  9. - kubediag
  10. scheme: http
  11. path_prefix: /
  12. timeout: 10s
  13. api_version: v1
  14. relabel_configs:
  15. - source_labels: [__meta_kubernetes_service_name]
  16. separator: ;
  17. regex: kubediag-master
  18. replacement: $1
  19. action: keep
  20. - source_labels: [__meta_kubernetes_endpoint_port_name]
  21. separator: ;
  22. regex: http
  23. replacement: $1
  24. action: keep

为 Prometheus 报警项创建 Trigger 对象

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

  1. apiVersion: diagnosis.kubediag.org/v1
  2. kind: Trigger
  3. metadata:
  4. name: node-clock-not-synchronising
  5. spec:
  6. operationSet: node-clock-debugger
  7. sourceTemplate:
  8. prometheusAlertTemplate:
  9. regexp:
  10. alertName: NodeClockNotSynchronising
  11. nodeNameReferenceLabel: instance
  12. podNameReferenceLabel: pod
  13. podNamespaceReferenceLabel: namespace
  14. containerReferenceLabel: container
  15. parameterInjectionLabels:
  16. - endpoint
  17. - service
  18. - severity

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

  1. alertname="NodeClockNotSynchronising"
  2. container="kube-rbac-proxy"
  3. endpoint="https"
  4. instance="my-node"
  5. job="node-exporter"
  6. namespace="monitoring"
  7. pod="node-exporter-2vqfp"
  8. service="node-exporter"
  9. severity="warning"

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

  1. apiVersion: diagnosis.kubediag.org/v1
  2. kind: Diagnosis
  3. metadata:
  4. labels:
  5. adjacency-list-hash: 57db4479b7
  6. name: prometheus-alert.nodeclocknotsynchronising.94df165
  7. namespace: kubediag
  8. spec:
  9. nodeName: my-node
  10. operationSet: node-clock-debugger
  11. parameters:
  12. endpoint: https
  13. service: node-exporter
  14. severity: warning
  15. podReference:
  16. container: kube-rbac-proxy
  17. name: node-exporter-2vqfp
  18. 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)