一、监控数据库

在实现告警之前,我们需要先实现监控。下面通过Exporter实现对数据库的监控:

具体如何实现对数据库的监控,可参考:Prometheus实战---监控非云原生应用Mysql

二、数据库连接失败告警

假设需要对mysql_up进行监控,不等于1 进行告警

1.创建一个 PrometheusRule

[root@k8s-master01 ~]# vim  mysql-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: mysql-exporter
    prometheus: k8s
    role: alert-rules
  name: mysql
  namespace: monitoring
spec:
  groups:
  - name: mysql-exporter
    rules:
    - alert: mysqlDown
      annotations:
        description: MySQL实例:{{ $labels.instance }} 挂了
        summary: MySQL无法连接
      expr: mysql_up != 1
      for: 1m
      labels:
        level: high
        severity: critical
        type: database

上面参数说明:

  • apiVersion: 这个字段指定了使用的 Kubernetes API 版本,monitoring.coreos.com/v1 表示使用了 Prometheus Operator 中的自定义资源版本
  • kind: 这里指定了自定义资源的类型,即 PrometheusRule
  • metadata: 这里是一些元数据,比如标签(labels)、名称(name)、命名空间(namespace)等,用于对该资源进行标识和分类
  • spec: 这里定义了实际的规则配置
  • groups: 这个字段是一个规则组(RuleGroup),它可以包含一个或多个相关的规则。
  • name: 这里定义了规则组的名称为 "mysql-exporter"。
  • rules: 这里是规则组包含的规则列表。
  • alert: 这是规则的名称,即 "mysqlDown",用于标识规则。
  • annotations: 这里定义了一些注释,包括告警的描述和摘要信息。
  • expr: 这是一个 PromQL 表达式,用于定义告警的触发条件。在这个示例中,它检查mysql_up不等于1。
  • for: 这是规则的持续时间,即在满足触发条件持续 1 分钟后才触发告警。
  • labels: 这里定义了一些标签,用于对告警进行分类和标识。

2.创建并查看该 PrometheusRule

[root@k8s-master01 manifests]# kubectl create -f mysql-rules.yaml
prometheusrule.monitoring.coreos.com/mysql created

[root@k8s-master01 manifests]# kubectl get -f  mysql-rules.yaml
NAME    AGE
mysql   2m11s

3.打开浏览器输入节点IP:30186后,依次点击【Status】-【Rules】

数据库连接失败告警-1

搜索mysql后看到创建的规则

数据库连接失败告警-2

4.接下来可以根据实际业务情况将告警发送给指定的人,此时可以更改路由,将告警发送给邮箱,配置如下

在此前的基础上添加如下配置:

      - match:
          type: database
        receiver: "Default"
        repeat_interval: 5m

添加完配置后,内容如下:

[root@k8s-master01 manifests]# vim alertmanager-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  labels:
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/instance: main
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 0.24.0
  name: alertmanager-main
  namespace: monitoring
stringData:
  email.tmpl: |-
    {{ define "email.default.message" }}
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ==========异常告警==========
    告警类型: {{ $alert.Labels.alertname }}
    告警级别: {{ $alert.Labels.severity }}
    告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    {{- if gt (len $alert.Labels.instance) 0 }}
    实例信息: {{ $alert.Labels.instance }}
    {{- end }}
    {{- if gt (len $alert.Labels.namespace) 0 }}
    命名空间: {{ $alert.Labels.namespace }}
    {{- end }}
    {{- if gt (len $alert.Labels.node) 0 }}
    节点信息: {{ $alert.Labels.node }}
    {{- end }}
    {{- if gt (len $alert.Labels.pod) 0 }}
    实例名称: {{ $alert.Labels.pod }}
    {{- end }}
    ============END============
    {{- end }}
    {{- end }}
    {{- end }}
    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ==========异常恢复==========
    告警类型: {{ $alert.Labels.alertname }}
    告警级别: {{ $alert.Labels.severity }}
    告警详情:
    {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    {{- if gt (len $alert.Labels.instance) 0 }}
    实例信息: {{ $alert.Labels.instance }}
    {{- end }}
    {{- if gt (len $alert.Labels.namespace) 0 }}
    命名空间: {{ $alert.Labels.namespace }}
    {{- end }}
    {{- if gt (len $alert.Labels.node) 0 }}
    节点信息: {{ $alert.Labels.node }}
    {{- end }}
    {{- if gt (len $alert.Labels.pod) 0 }}
    实例名称: {{ $alert.Labels.pod }}
    {{- end }}
    ============END============
    {{- end }}
    {{- end }}
    {{- end }}
    {{- end }}
  alertmanager.yaml: |-
    "global":
      "resolve_timeout": "5m"
      smtp_from: "your-alert@163.com"
      smtp_smarthost: "smtp.163.com:465"
      smtp_hello: "163.com"
      smtp_auth_username: "your-alert@163.com"
      smtp_auth_password: "YOUR_SMTP_AUTH_CODE"
      smtp_require_tls: false
    templates:
    - '/etc/alertmanager/config/*.tmpl'
    "inhibit_rules":
    - "equal":
      - "namespace"
      - "alertname"
      "source_matchers":
      - "severity = critical"
      "target_matchers":
      - "severity =~ warning|info"
    - "equal":
      - "namespace"
      - "alertname"
      "source_matchers":
      - "severity = warning"
      "target_matchers":
      - "severity = info"
    - "equal":
      - "namespace"
      "source_matchers":
      - "alertname = InfoInhibitor"
      "target_matchers":
      - "severity = info"
    "receivers":
    - "name": "Default"
      email_configs:
      - to: "your-alert@163.com"
        send_resolved: true
        html: '{{ template "email.default.message" . }}'
    - "name": "Watchdog"
    - "name": "Critical"
    - "name": "null"
    "route":
      "group_by":
      - "namespace"
      - job
      - alertname
      "group_interval": "5m"
      "group_wait": "30s"
      "receiver": "Default"
      "repeat_interval": "5m"
      "routes":
      - match:
          type: blackbox
        receiver: "Default"
        repeat_interval: 5m
      - match:
          type: database
        receiver: "Default"
        repeat_interval: 5m
      - "matchers":
        - "alertname = Watchdog"
        "receiver": "Watchdog"
      - "matchers":
        - "alertname = InfoInhibitor"
        "receiver": "null"
      - "matchers":
        - "severity = critical"
        "receiver": "Critical"
type: Opaque

5.重新替代文件alertmanager-secret.yaml

[root@k8s-master01 manifests]# kubectl replace -f alertmanager-secret.yaml
secret/alertmanager-main replaced

6.登录163邮箱进行查看即可,这里因为mysql_up=1,所以不会产生告警

数据库连接失败告警-3