2025,每天10分钟,跟我学K8S(四十八)- Prometheus(五)发送钉钉报警

        前面我们学习了K8S中Prometheus 的各种监控配置,但是有了这些告警,怎么让监控人员及时发现并处理,总不能让监控人员一直盯着prometheus的页面吧,如何将告警内容发布出来,这就是接下来要学习的。        

        前面的课程中我们知道我们可以通过 AlertManager 的配置文件去配置各种报警接收器,那应该怎样去修改配置呢?

        查看 AlertManager  Dashboard 的 status页面下的config,发现这里的值和kube-prometheus/manifests/alertmanager-secret.yaml 下面的内容一样,我们这边采用钉钉报警,钉钉在2020年7月进行升级了。需要配置sign才可以发送消息

一、部署核心组件​

​1. 创建钉钉机器人​

        自动2020年钉钉机器人改版后,现在​的机器人只选择「加签」或「自定义关键词」安全验证方式。

1.1、在钉钉群中创建自定义机器人,选择「加签」或「自定义关键词」安全验证方式。

选择加签模式,并且记录好这里的加签内容

SEC8b2e7abdb0f5243d04f527d2a3a66d7e53e1a66462936ef84c1aeb3978e96df5

1.2、记录生成的 Webhook URL(如 https://oapi.dingtalk.com/robot/send?access_token=xxx)和加签密钥(如有)。

https://oapi.dingtalk.com/robot/send?access_token=3037cf6879c4749684e2a99b916a749fcfeb6fde835151bd84758636f5fbb04b

​2. 部署钉钉 Webhook 插件​

使用 Kubernetes YAML 部署 prometheus-webhook-dingtalk(推荐官方镜像 timonwong/prometheus-webhook-dingtalk:v2.1.0):

# cat dingtalk-webhook-deploy.yaml 

apiVersion: v1
kind: Service
metadata:
  name: dingtalk
  namespace: monitoring
  labels:
    app: dingtalk
spec:
  selector:
    app: dingtalk
  ports:
  - name: dingtalk
    port: 8060
    protocol: TCP
    targetPort: 8060
  
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dingtalk
  namespace: monitoring
spec:
  replicas: 2
  selector:
    matchLabels:
      app: dingtalk
  template:
    metadata:
      name: dingtalk
      labels:
        app: dingtalk
    spec:
      containers:
      - name: dingtalk
        image: docker.1ms.run/timonwong/prometheus-webhook-dingtalk:v2.1.0
        imagePullPolicy: IfNotPresent
        args:
        - --web.listen-address=:8060
        - --config.file=/etc/prometheus-webhook-dingtalk/config.yml
        ports:
        - containerPort: 8060
        volumeMounts:
        - name: config
          mountPath: /etc/prometheus-webhook-dingtalk
      volumes:
      - name: config
        configMap:
          name: prometheus-webhook-dingtalk-config

​3. 配置钉钉插件​

创建 dingtalk-configmap.yaml 和 自定义告警模板 

记得替换这里的access_token和secret

# cat dingtalk-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-webhook-dingtalk-config
  namespace: monitoring
data:
  config.yml: |-
    templates:
      - /etc/prometheus-webhook-dingtalk/default.tmpl
    targets:
      webhook1:
        url: https://oapi.dingtalk.com/robot/send?access_token=3037cf6879c4749684e2a99b916a749fcfeb6fde835151bd84758636f5fbb04b       #修改为钉钉机器人的webhook
        secret: SEC8b2e7abdb0f5243d04f527d2a3a66d7e53e1a66462936ef84c1aeb3978e96df5  #修改钉钉机器人的加签
        mention:
          all: true
        message:
          text: '{{ template "default.tmpl" . }}'
 
  default.tmpl: |
    {{ define "default.tmpl" }}
 
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{- range $index, $alert := .Alerts -}}
 
    ============ = **<font color='#FF0000'>告警</font>** = =============  #红色字体
  
    **告警名称:**    {{ $alert.Labels.alertname }}   
    **告警级别:**    {{ $alert.Labels.severity }} 级   
    **告警状态:**    {{ .Status }}   
    **告警实例:**    {{ $alert.Labels.instance }} {{ $alert.Labels.device }}   
    **告警概要:**    {{ .Annotations.summary }}   
    **告警详情:**    {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}   
    **故障时间:**    {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
    ============ = end = =============  
    {{- end }}
    {{- end }}
 
    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{- range $index, $alert := .Alerts -}}
 
    ============ = <font color='#00FF00'>恢复</font> = =============   #绿色字体
 
    **告警实例:**    {{ .Labels.instance }}   
    **告警名称:**    {{ .Labels.alertname }}  
    **告警级别:**    {{ $alert.Labels.severity }} 级   
    **告警状态:**    {{   .Status }} 
    **告警概要:**    {{ $alert.Annotations.summary }}  
    **告警详情:**    {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}  
    **故障时间:**    {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
    **恢复时间:**    {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
 
    ============ = **end** = =============
    {{- end }}
    {{- end }}
    {{- end }}

​二、配置 Alertmanager​

​1. 修改 Alertmanager 配置​

# cat alertmanager.yaml 

global:
  resolve_timeout: 15s  
inhibit_rules:                ##静默规则:当同一个job内,出现多个告警时,只将高级别告警发送出来
- source_match:               ##发送的告警标签
    severity: 'critical'
  target_match:               ##被抑制的告警标签
    severity: 'warning'
  equal: ['alertname','namespace']              ##匹配的标签,即当同一个job出现多个告警的时候,会优先发出级别为critical的告警

route:   ##顶级路由,可以通过制定不同的路由,将不同的告警信息发送给不同的人,这里顶级路由需要匹配所有的告警
  group_by: ['alertname','namespace'] ##分组,需要匹配所有的告警,所以这里可以用监控namespace分组
  group_wait: 30s    ## 分组等待的时间
  group_interval: 5m  ## 上下两组发送告警的间隔时间
  repeat_interval: 1h ## 重复发送告警时间。默认1h
  receiver: webhook    ## 默认的发送人 这里选择webhook,即钉钉
  routes:              ## 子路由
  - match:
      alertname: warning       ## 将warning的告警发送给webhook工作组
    receiver: webhook
receivers:  #定义谁来通知报警
- name: 'webhook'   ##钉钉样式
  webhook_configs:
  #- url: 'http://webhook-dingtalk:8060/dingtalk/webhook1/send'
  - url: 'http://dingtalk.monitoring.svc.cluster.local:8060/dingtalk/webhook1/send'
    send_resolved: true

​2. 应用配置​

  • 更新 Alertmanager 配置后重启服务:
# 删除旧secret 
kubectl delete secret alertmanager-main -n monitoring

# 创建新secret 
kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring

​三、配置 Prometheus 告警规则​

​1. 定义告警规则​

在manifests/alertmanager-prometheusRule.yaml 中新增一下自定义规则

规则内容为当pod重启3次后报警

# vim alertmanager-prometheusRule.yaml

  - name: pod-alerts
    rules:
    - alert: PodCrashLooping
      expr: kube_pod_container_status_restarts_total > 3
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "Pod {{ $labels.pod }} 进入崩溃循环"
        description: "命名空间 {{ $labels.namespace }} 的 Pod {{ $labels.pod }} 已重启 {{ $value }} 次"

2. 触发测试加载规则

curl -X POST http://<SVC下prometheus-k8s的IP>:9090/-/reload  # 热加载配置

四、验证

默认告警

自定义告警

由于我们自定义的警告是一个pod重启3次即告警,那创建一个不停重启的pod就可以了.

记得修改镜像地址,不然去默认地址拉取的话会一直卡在初始化拉取镜像

# vim crash_pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: crash-test-pod
spec:
  containers:
  - name: crash-container
    image: m.daocloud.io/docker.io/library/busybox:latest
    command: ["sh", "-c", "exit 1"]  # 容器启动后立即退出
  restartPolicy: OnFailure          # 退出后自动重启


# kubectl apply -f crash_pod.yaml

通过Prometheus的web页面去查询重启次数大于3次的

再去钉钉查看报警

五、他人写好的告警规则

很多其他的自定义规则报警,可以参考之前提到的github中的内容

https://github.com/samber/awesome-prometheus-alerts

posted @ 2025-04-21 16:12  Devopser06  阅读(93)  评论(0)    收藏  举报  来源