• VictoriaMetrics之vmalert


    image-20220815160712241前面我们已经介绍了可以使用 vmagent 代替 prometheus 抓取监控指标数据,要想完全替换 prometheus 还有一个非常重要的部分就是报警模块,之前我们都是在 prometheus 中定义报警规则评估后发送给 alertmanager 的,同样对应到 vm 中也有一个专门来处理报警的模块:vmalert。

    vmalert 会针对 -datasource.url 地址执行配置的报警或记录规则,然后可以将报警发送给 -notifier.url 配置的 Alertmanager,记录规则结果会通过远程写入的协议进行保存,所以需要配置 -remoteWrite.url

    目录

    1、特性

    • 与 VictoriaMetrics TSDB 集成

    • VictoriaMetrics MetricsQL 支持和表达式验证

    • Prometheus 告警规则定义格式支持

    • 与 Alertmanager 集成

    • 在重启时可以保持报警状态

    • Graphite 数据源可用于警报和记录规则

    • 支持记录和报警规则重放

    • 非常轻量级,没有额外的依赖

    要开始使用 vmalert,需要满足以下条件:

    • 报警规则列表:要执行的 PromQL/MetricsQL 表达式
    • 数据源地址:可访问的 VictoriaMetrics 实例,用于规则执行
    • 通知程序地址:可访问的 Alertmanager 实例,用于处理,汇总警报和发送通知

    2、安装

    💘 实战:vmalert安装(测试成功)-2022.8.15

    实验环境

    实验环境:
    1、win10,vmwrokstation虚机;
    2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
       k8s version:v1.22.2
       containerd://1.5.5
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实验软件

    1.安装Alertmanager

    首先需要安装一个 Alertmanager 用来接收报警信息,前面章节中我们已经详细讲解过了,这里不再赘述了,对应的资源清单如下所示:

    vim alertmanager.yaml

    # alertmanager.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: alert-config
      namespace: kube-vm
    data:
      config.yml: |-
        global:
          resolve_timeout: 5m
          smtp_smarthost: 'smtp.163.com:465'
          smtp_from: 'xxx@163.com'
          smtp_auth_username: 'xxx@163.com'
          smtp_auth_password: ''  # 使用网易邮箱的授权码
          smtp_hello: '163.com'
          smtp_require_tls: false
        route:
          group_by: ['severity', 'source']
          group_wait: 30s
          group_interval: 5m
          repeat_interval: 24h
          receiver: email
        receivers:
        - name: 'email'
          email_configs:
          - to: '517554016@qq.com'
            send_resolved: true
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alertmanager
      namespace: kube-vm
      labels:
        app: alertmanager
    spec:
      selector:
        app: alertmanager
      type: NodePort
      ports:
        - name: web
          port: 9093
          targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alertmanager
      namespace: kube-vm
      labels:
        app: alertmanager
    spec:
      selector:
        matchLabels:
          app: alertmanager
      template:
        metadata:
          labels:
            app: alertmanager
        spec:
          volumes:
            - name: cfg
              configMap:
                name: alert-config
          containers:
            - name: alertmanager
              image: prom/alertmanager:v0.24.0
              imagePullPolicy: IfNotPresent
              args:
                - "--config.file=/etc/alertmanager/config.yml"
              ports:
                - containerPort: 9093
                  name: http
              volumeMounts:
                - mountPath: "/etc/alertmanager"
                  name: cfg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    Alertmanager 这里我们只配置了一个默认的路由规则,根据 severitysource 两个标签进行分组,然后将触发的报警发送到 email 接收器中去。

    部署:

    [root@master1 vmalert]#kubectl apply -f alertmanager.yaml 
    configmap/alert-config created
    service/alertmanager created
    deployment.apps/alertmanager created
    
    • 1
    • 2
    • 3
    • 4

    2.添加用于报警的规则配置

    接下来需要添加用于报警的规则配置,配置方式和 Prometheus 一样的:

    vim vmalert-config.yaml

    # vmalert-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: vmalert-config
      namespace: kube-vm
    data:
      record.yaml: |
        groups:
        - name: record
          rules:
          - record: job:node_memory_MemFree_bytes:percent  # 记录规则名称
            expr: 100 - (100 * node_memory_MemFree_bytes / node_memory_MemTotal_bytes)
      pod.yaml: |
        groups:
        - name: pod
          rules:
          - alert: PodMemoryUsage
            expr: sum(container_memory_working_set_bytes{pod!=""}) BY (instance, pod)  / sum(container_spec_memory_limit_bytes{pod!=""} > 0) BY (instance, pod) * 100 > 60
            for: 2m
            labels:
              severity: warning
              source: pod
            annotations:
              summary: "Pod {{ $labels.pod }} High Memory usage detected"
              description: "{{$labels.instance}}: Pod {{ $labels.pod }} Memory usage is above 60% (current value is: {{ $value }})"
      node.yaml: |
        groups:
        - name: node
          rules:  # 具体的报警规则
          - alert: NodeMemoryUsage  # 报警规则的名称
            expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 30
            for: 1m
            labels:
              source: node
              severity: critical
            annotations:
              summary: "Node {{$labels.instance}} High Memory usage detected"
              description: "{{$labels.instance}}: Memory usage is above 30% (current value is: {{ $value }})"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    这里我们添加了一条记录规则,两条报警规则,更多报警规则配置可参考 https://awesome-prometheus-alerts.grep.to/。

    部署:

    [root@master1 vmalert]#kubectl apply -f vmalert-config.yaml 
    configmap/vmalert-config created
    
    • 1
    • 2

    3.部署 vmalert 组件

    然后就可以部署 vmalert 组件服务了:

    vim vmalert.yaml

    # vmalert.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: vmalert
      namespace: kube-vm
      labels:
        app: vmalert
    spec:
      ports:
        - name: vmalert
          port: 8080
          targetPort: 8080
      type: NodePort
      selector:
        app: vmalert
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vmalert
      namespace: kube-vm
      labels:
        app: vmalert
    spec:
      selector:
        matchLabels:
          app: vmalert
      template:
        metadata:
          labels:
            app: vmalert
        spec:
          containers:
            - name: vmalert
              image: victoriametrics/vmalert:v1.77.0
              imagePullPolicy: IfNotPresent
              args:
                - -rule=/etc/ruler/*.yaml
                - -datasource.url=http://vmselect.kube-vm.svc.cluster.local:8481/select/0/prometheus
                - -notifier.url=http://alertmanager.kube-vm.svc.cluster.local:9093
                - -remoteWrite.url=http://vminsert.kube-vm.svc.cluster.local:8480/insert/0/prometheus
                - -evaluationInterval=15s
                - -httpListenAddr=0.0.0.0:8080
              volumeMounts:
                - mountPath: /etc/ruler/
                  name: ruler
                  readOnly: true
          volumes:
            - configMap:
                name: vmalert-config
              name: ruler
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    上面的资源清单中将报警规则以 volumes 的形式挂载到了容器中,通过 -rule 指定了规则文件路径,-datasource.url 指定了 vmselect 的路径,-notifier.url 指定了 Alertmanager 的地址,其中 -evaluationInterval 参数用来指定评估的频率的,由于我们这里添加了记录规则,所以还需要通过 -remoteWrite.url 指定一个远程写入的地址。

    部署:

    [root@master1 vmalert]#kubectl apply -f vmalert.yaml 
    service/vmalert created
    deployment.apps/vmalert created
    
    • 1
    • 2
    • 3

    4.部署

    直接创建上面的资源清单即可完成部署。

    [root@master1 vmalert]#kubectl get pods -n kube-vm -l app=alertmanager
    NAME                           READY   STATUS    RESTARTS   AGE
    alertmanager-dd8fb4858-zv672   1/1     Running   0          5m19s
    [root@master1 vmalert]#kubectl get svc -n kube-vm -l app=alertmanager
    NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    alertmanager   NodePort   10.103.164.31   <none>        9093:30978/TCP   5m34s
    [root@master1 vmalert]#kubectl get pods -n kube-vm -l app=vmalert
    NAME                       READY   STATUS    RESTARTS   AGE
    vmalert-866674b966-8vtqb   1/1     Running   0          72s
    [root@master1 vmalert]#kubectl get svc -n kube-vm -l app=vmalert
    NAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    vmalert   NodePort   10.109.65.27   <none>        8080:32733/TCP   79s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.验证

    部署成功后,如果有报警规则达到了阈值就会触发报警,我们可以通过 Alertmanager 页面查看触发的报警规则:

    http://172.29.9.51:30978/

    alertmanager

    哈哈,我这里可能有点小问题……这里没出现现象……

    image-20220815155844054

    image-20220815155826169

    同样 vmalert 也提供了一个简单的页面,可以查看所有的 Groups:

    http://172.29.9.51:32733/groups

    image-20220815155933885

    也可以查看到报警规则列表的状态:

    alerts

    我的现象:

    image-20220815160042551

    还可以查看到具体的一条报警规则的详细信息,如下所示:

    alert detail

    报警规则触发后怎么发送,发送到哪个接收器就是 Alertmanager 决定的了。

    同样的上面我们添加的记录规则会通过 remote write 传递给 vminsert 保留下来,所以我们也可以通过 vmselect 查询到。

    http://172.29.9.51:30032/select/0/

    记录规则

    到这里基本上我们就完成了使用 vm 代替 prometheus 来进行监控报警了,vmagent 采集监控指标,vmalert 用于报警监控,vmstorage 存储指标数据,vminsert 接收指标数据,vmselect 查询指标数据,已经完全可以不使用 prometheus 了,而且性能非常高,所需资源也比 prometheus 低很多。

    测试结束。😘

    关于我

    我的博客主旨:

    • 排版美观,语言精炼;
    • 文档即手册,步骤明细,拒绝埋坑,提供源码;
    • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

    🍀 微信二维码
    x2675263825 (舍得), qq:2675263825。

    image-20211002091450217

    🍀 微信公众号
    《云原生架构师实战》

    image-20211002141739664

    🍀 csdn
    https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

    image-20211002092344616

    🍀 博客
    www.onlyyou520.com

    image-20220513150311181

    🍀 知乎

    https://www.zhihu.com/people/foryouone

    🍀 语雀

    https://www.yuque.com/books/share/34a34d43-b80d-47f7-972e-24a888a8fc5e?# 《云笔记最佳实践》

    image-20220802075321528

    image-20220709075340096

    最后

    好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

    image-20220815160814770

  • 相关阅读:
    L1W2作业1 Numpy基础
    PyCharm玩转ESP32
    【C++项目】高并发内存池第七讲性能分析
    基本分段存储管理方式(分段,段表,地址转换以及与分页管理对比)
    IDEA创建Springboot多模块项目
    实用的窗口管理软件:Display Maid for Mac
    长春理工大学漏洞报送证书
    让你彻底学会HBase
    概率论中的几个重要悖论问题
    GPU版本的Pytorch安装
  • 原文地址:https://blog.csdn.net/weixin_39246554/article/details/126349184