一、监控数据库¶
在实现告警之前,我们需要先实现监控。下面通过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: 这里指定了自定义资源的类型,即PrometheusRulemetadata: 这里是一些元数据,比如标签(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】

搜索mysql后看到创建的规则

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,所以不会产生告警
