通过helm 安装部署 官方文档 测试安装还是很简单的,官方文档更加详细,本文主要做Prometheus Operator 配置报警规则和添加钉钉报警

自定义报警规则

我们安装好 Prometheus Operator 之后,打开 Prometheus Dashboard 页面Alerts页面能看到好多报警规则。

image-20210425111544790

这些告警规则来自于Prometheus 的配置文件之中指定 AlertManager 实例和 报警的 rules 文件,我们可以在Prometheus Dashboard 的Config 页面下面查看关于 AlertManager 的配置:

image-20210425135457038

上面 alertmanagers 实例的配置我们可以看到是通过角色为 endpoints 的 kubernetes 的服务发现机制获取的,匹配的是在monitor 名称空间下service_nam为 prometheus-kube-prometheus-alertmanager,endpoint_port_name为 web 的 Service 服务,我们查看下 prometheus-kube-prometheus-alertmanager 这个 Service:

image-20210425135938653

可以看到服务名正是 prometheus-kube-prometheus-alertmanager,Port 定义的名称也是 web,符合上面的规则,所以 Prometheus 和 AlertManager 组件就正确关联上了。而对应的报警规则文件位于:/etc/prometheus/rules/prometheus-prometheus-kube-prometheus-prometheus-rulefiles-0/*.yaml目录下面所有的 YAML 文件。我们可以进入 Prometheus 的 Pod 中验证下该目录下面是否有 YAML 文件:

image-20210425140209431

这些文件就是根据 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组件简介配置解析

image-20210425142249745

添加一个自定义报警规则,集群节点磁盘使用率操过 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 文件。

image-20210425143159083

image-20210425143250128

配置钉钉报警

我们可以通过修改Alermanager 的配置文件来配置各种报警接收器。

Alermanager 的配置文件来源于 alertmanager-prometheus-kube-prometheus-alertmanager Secret资源对象。不明白的可以查看Prometheus Operator组件简介配置解析

我们可以先在Alertmanager Dashboard 查看下默认的Config 配置。

image-20210425144902088

Alermanager 的配置文件来源于 alertmanager-prometheus-kube-prometheus-alertmanager Secret资源对象

image-20210425145019881

我们对alertmanager.yaml 内容解析,查看下内容。k9s 这个工具可以直接对secret内容进行解析,没有这个工具的也可以使用 base64 -d 对内容进行解析。

image-20210425145914402

可以看看内容和 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 自动渲染新的配置。

image-20210425151401666

修改后更新;

$  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 页面已经出发报警了。

image-20210425152919960

查看钉钉已经收到告警信息了。描述信息没改所以显示80%,就这样吧实验已经成功了。

image-20210425153001515

参考:

Helm kube-prometheus-stack

prometheus operator 组件简介

prometheus-webhook-dingtalk

prometheus-operator 报警规则这是原文,但是我是用的最新版的kube-prometheus-stack 部署的监控集群,在一些名称和prometheus-webhook-dingtalk上会有一些差别。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

open