通过helm 安装部署 官方文档 测试安装还是很简单的,官方文档更加详细,本文主要做Prometheus Operator 配置报警规则和添加钉钉报警
自定义报警规则
我们安装好 Prometheus Operator 之后,打开 Prometheus Dashboard 页面Alerts
页面能看到好多报警规则。
这些告警规则来自于Prometheus 的配置文件之中指定 AlertManager 实例和 报警的 rules 文件,我们可以在Prometheus Dashboard 的Config 页面下面查看关于 AlertManager 的配置:
上面 alertmanagers 实例的配置我们可以看到是通过角色为 endpoints 的 kubernetes 的服务发现机制获取的,匹配的是在monitor 名称空间下service_nam为 prometheus-kube-prometheus-alertmanager,endpoint_port_name为 web 的 Service 服务,我们查看下 prometheus-kube-prometheus-alertmanager 这个 Service:
可以看到服务名正是 prometheus-kube-prometheus-alertmanager,Port 定义的名称也是 web,符合上面的规则,所以 Prometheus 和 AlertManager 组件就正确关联上了。
而对应的报警规则文件位于:/etc/prometheus/rules/prometheus-prometheus-kube-prometheus-prometheus-rulefiles-0/*.yaml
目录下面所有的 YAML 文件。我们可以进入 Prometheus 的 Pod 中验证下该目录下面是否有 YAML 文件:
这些文件就是根据 PrometheusRule K8s自定义资源文件创建的Prometheus报警规则。所以我们需要修改或者自定义添加一个报警规则的话,只需要创建一个PrometheusRule 资源对象即可。Prometheus会根据创建的PrometheusRule 资源自动在这个目录下生成 .yaml 文件。
为什么 Prometheus 能够识别这个 PrometheusRule 资源对象呢?是因为我们的Prometheus 配置文件里面有非常重要的一个属性 ruleSelector,是用来匹配 rule 规则的过滤器,只要PrometheusRule 资源 带有app: kube-prometheus-stack 和 release: prometheus 这两个标签,Prometheus 就能够匹配到了。
Prometheus 的配置文件来源于 prometheus-prometheus-kube-prometheus-prometheus Secret资源对象。不明白的可以查看Prometheus Operator组件简介配置解析
添加一个自定义报警规则,集群节点磁盘使用率操过 80% 就报警。注意必须带有app: kube-prometheus-stack 和 release: prometheus 这两个标签。
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: kube-prometheus-stack
release: prometheus
name: disk-free-rules
namespace: monitor
spec:
groups:
- name: disk
rules:
- alert: diskFree
annotations:
summary: "{{ $labels.job }} 项目实例 {{ $labels.instance }} 磁盘使用率大于 80%"
description: "{{ $labels.instance }} {{ $labels.mountpoint }} 磁盘使用率大于80% (当前的值: {{ $value }}%),请及时处理"
expr: |
(1-(node_filesystem_free_bytes{fstype=~"ext4|xfs",mountpoint!="/boot"} / node_filesystem_size_bytes{fstype=~"ext4|xfs",mountpoint!="/boot"}) )*100 > 80
for: 1m
labels:
level: disaster
severity: warning
创建好后就可以在 Prometheus Dashboard 的 Alert 页面下面看到新建的报警规则了;同时也可以在Prometheus pod 里的/etc/prometheus/rules/prometheus-prometheus-kube-prometheus-prometheus-rulefiles-0/
目录看到新建的YAML 文件。
配置钉钉报警
我们可以通过修改Alermanager 的配置文件来配置各种报警接收器。
Alermanager 的配置文件来源于 alertmanager-prometheus-kube-prometheus-alertmanager Secret资源对象。不明白的可以查看Prometheus Operator组件简介配置解析
我们可以先在Alertmanager Dashboard 查看下默认的Config 配置。
Alermanager 的配置文件来源于 alertmanager-prometheus-kube-prometheus-alertmanager Secret资源对象
我们对alertmanager.yaml 内容解析,查看下内容。k9s 这个工具可以直接对secret内容进行解析,没有这个工具的也可以使用 base64 -d 对内容进行解析。
可以看看内容和 Alertmanager Dashboard 看到的Config配置是一样的,我们直接修改这个Secret 就可以了。
global:
resolve_timeout: 5m
receivers:
- name: dingtalk-webhook
webhook_configs:
- send_resolved: true
url: "http://alertmanager-webhook-dingtalk.monitor/dingtalk/webhook1/send"
route:
group_by:
- job
group_interval: 5m
group_wait: 30s
receiver: dingtalk-webhook
repeat_interval: 12h
routes:
- receiver: dingtalk-webhook
group_wait: 10s
templates:
- '/etc/alertmanager/config/*.tmpl'
将上面文件保存为 alertmanager-prometheus-kube-prometheus-alertmanager.yaml,然后使用这个文件创建一个 Secret 对象:
#先删除之前的secret 对象
$ kubectl delete alertmanager-prometheus-kube-prometheus-alertmanager -n monitor
# 创建新的secret对象
$ kubectl create secret genericalertmanager-prometheus-kube-prometheus-alertmanager --from-file=alertmanager-prometheus-kube-prometheus-alertmanager -n monitoring
还有一种方式,就是我是通过helm 部署的,所以我直接修改的helm values.yaml 文件,然后更新,helm 自动渲染新的配置。
修改后更新;
$ helm upgrade prometheus -n monitor .
创建钉钉告警模板和配置文件;
## vim dingTalk-webhook-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitor
name: dingtalk-webhook-config
data:
config.yaml: |
## Request timeout
timeout: 5s
## Customizable templates path
templates:
- /config/template.tmpl
## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
# default_message:
# title: '{{ template "legacy.title" . }}'
# text: '{{ template "legacy.content" . }}'
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# secret for signature
# secret: SEC000000000000000000000
message:
title: '{{ template "ding.link.title" . }}'
text: '{{ template "ding.link.content" . }}'
mention:
all: true
mention:
mobiles: ['150xxxxxxxx']
template.tmpl: |
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}
{{ define "__text_alert_list" }}{{ range . }}
**Labels**
{{ range .Labels.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Annotations**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Source:** [{{ .GeneratorURL }}]({{ .GeneratorURL }})
{{ end }}{{ end }}
{{ define "default.__text_alert_list" }}{{ range . }}
---
**告警级别:** {{ .Labels.severity | upper }}
**运营团队:** {{ .Labels.team | upper }}
**触发时间:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
**事件信息:**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**事件标签:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") (ne (.Name) "team") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}
{{ end }}
{{ define "default.__text_alertresovle_list" }}{{ range . }}
---
**告警级别:** {{ .Labels.severity | upper }}
**运营团队:** {{ .Labels.team | upper }}
**触发时间:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
**结束时间:** {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}
**事件信息:**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**事件标签:**
{{ range .Labels.SortedPairs }}{{ if and (ne (.Name) "severity") (ne (.Name) "summary") (ne (.Name) "team") }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}{{ end }}
{{ end }}
{{ end }}
{{/* Default */}}
{{ define "default.title" }}{{ template "__subject" . }}{{ end }}
{{ define "default.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ if gt (len .Alerts.Firing) 0 -}}
![警报 图标](https://www.wangfeng.live/wp-content/uploads/2021/04/4e69b9298eccf7966aebb996708a7f12.jpg)
**====侦测到故障====**
{{ template "default.__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
{{ template "default.__text_alertresovle_list" .Alerts.Resolved }}
{{- end }}
{{- end }}
{{/* Legacy */}}
{{ define "legacy.title" }}{{ template "__subject" . }}{{ end }}
{{ define "legacy.content" }}#### \[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}\] **[{{ index .GroupLabels "alertname" }}]({{ template "__alertmanagerURL" . }})**
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}
{{/* Following names for compatibility */}}
{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
创建钉钉告警资源清单;
## vim alertmanager-webhook-dingtalk.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: monitor
name: alertmanager-webhook-dingtalk
labels:
app: alertmanager-webhook-dingtalk
spec:
selector:
matchLabels:
app: alertmanager-webhook-dingtalk
replicas: 1
template:
metadata:
labels:
app: alertmanager-webhook-dingtalk
spec:
volumes:
- name: dingtalk-webhook-confing
configMap:
name: dingtalk-webhook-config
containers:
- name: alertmanager-webhook-dingtalk
image: timonwong/prometheus-webhook-dingtalk
args:
- --web.listen-address=:8060
- --config.file=/config/config.yaml
volumeMounts:
- name: dingtalk-webhook-confing
mountPath: /config
resources:
limits:
cpu: 100m
memory: 100Mi
ports:
- name: http
containerPort: 8060
---
apiVersion: v1
kind: Service
metadata:
namespace: monitor
name: alertmanager-webhook-dingtalk
labels:
app: alertmanager-webhook-dingtalk
spec:
selector:
app: alertmanager-webhook-dingtalk
ports:
- name: http
port: 80
targetPort: http
然后创建资源;
$ kubectl apply -f dingTalk-webhook-configmap.yaml
$ kubectl apply -f alertmanager-webhook-dingtalk.yaml
然后测试,我们把刚自定义创建的报警规则改下,该为磁盘使用率大于 10% 就告警。
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: kube-prometheus-stack
release: prometheus
name: disk-free-rules
namespace: monitor
spec:
groups:
- name: disk
rules:
- alert: diskFree
annotations:
summary: "{{ $labels.job }} 项目实例 {{ $labels.instance }} 磁盘使用率大于 80%"
description: "{{ $labels.instance }} {{ $labels.mountpoint }} 磁盘使用率大于80% (当前的值: {{ $value }}%),请及时处理"
expr: |
(1-(node_filesystem_free_bytes{fstype=~"ext4|xfs",mountpoint!="/boot"} / node_filesystem_size_bytes{fstype=~"ext4|xfs",mountpoint!="/boot"}) )*100 > 10
for: 1m
labels:
level: disaster
severity: warning
#更新下
$ kubectl apply -f disk-free-rules.yaml
查看Prometheus Dashboard Alerts 页面已经出发报警了。
查看钉钉已经收到告警信息了。描述信息没改所以显示80%,就这样吧实验已经成功了。
参考:
prometheus-operator 报警规则
这是原文,但是我是用的最新版的kube-prometheus-stack 部署的监控集群,在一些名称和prometheus-webhook-dingtalk上会有一些差别。