VictoriaMetrics之vmalert

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

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

目录

文章目录

    • 目录
    • 1、特性
    • 2、安装
      • 实战:vmalert安装(测试成功)-2022.8.15
        • 实验环境
        • 实验软件
        • 1.安装Alertmanager
        • 2.添加用于报警的规则配置
        • 3.部署 vmalert 组件
        • 4.部署
        • 5.验证
    • 关于我
    • 最后

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.安装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: '[email protected]'
      smtp_auth_username: '[email protected]'
      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: '[email protected]'
        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

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

部署:

[root@master1 vmalert]#kubectl apply -f alertmanager.yaml 
configmap/alert-config created
service/alertmanager created
deployment.apps/alertmanager created
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 }})"

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

部署:

[root@master1 vmalert]#kubectl apply -f vmalert-config.yaml 
configmap/vmalert-config created
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

上面的资源清单中将报警规则以 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
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
5.验证

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

http://172.29.9.51:30978/

VictoriaMetrics之vmalert_第2张图片

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

VictoriaMetrics之vmalert_第3张图片

VictoriaMetrics之vmalert_第4张图片

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

http://172.29.9.51:32733/groups

VictoriaMetrics之vmalert_第5张图片

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

VictoriaMetrics之vmalert_第6张图片

我的现象:

VictoriaMetrics之vmalert_第7张图片

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

VictoriaMetrics之vmalert_第8张图片

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

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

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

VictoriaMetrics之vmalert_第9张图片

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

测试结束。

关于我

我的博客主旨:

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

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

VictoriaMetrics之vmalert_第10张图片

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

VictoriaMetrics之vmalert_第11张图片

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

VictoriaMetrics之vmalert_第12张图片

博客
www.onlyyou520.com

知乎

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

VictoriaMetrics之vmalert_第13张图片

语雀

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

VictoriaMetrics之vmalert_第14张图片

最后

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

你可能感兴趣的:(k8s,kubernetes)