使用Vmalert監控報警

roc_guo發表於2022-06-07

前面我們已經介紹了可以使用 vmagent 代替 prometheus 抓取監控指標資料,要想完全替換 prometheus 還有一個非常重要的部分就是報警模組,之前我們都是在 prometheus 中定義報警規則評估後傳送給 alertmanager 的,同樣對應到 vm 中也有一個專門來處理報警的模組:vmalert。

vmalert 特性
  1. 與 VictoriaMetrics TSDB 整合。
  1. VictoriaMetrics MetricsQL 支援和表示式驗證。
  1. Prometheus 告警規則定義格式支援。
  1. 與 Alertmanager 整合。
  1. 在重啟時可以保持報警狀態。
  1. Graphite 資料來源可用於警報和記錄規則。
  1. 支援記錄和報警規則重放。
  1. 非常輕量級,沒有額外的依賴。

要開始使用 vmalert,需要滿足以下條件:

  1. 報警規則列表:要執行的 PromQL/MetricsQL 表示式。
  1. 資料來源地址:可訪問的 VictoriaMetrics 例項,用於規則執行。
  1. 通知程式地址:可訪問的 Alertmanager 例項,用於處理,彙總警報和傳送通知。
vmalert 安裝

首先需要安裝一個 Alertmanager 用來接收報警資訊,前面章節中我們已經詳細講解過了,這裡不再贅述了,對應的資源清單如下所示:

# 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: 'xxxxxx@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.21.0
          imagePullPolicy: IfNotPresent
          args:
            - "--config.file=/etc/alertmanager/config.yml"
          ports:
            - containerPort: 9093
              name: http
          volumeMounts:
            - mountPath: "/etc/alertmanager"
              name: cfg

Alertmanager 這裡我們只配置了一個預設的路由規則,根據 severity、source 兩個標籤進行分組,然後將觸發的報警傳送到 email 接收器中去。

接下來需要新增用於報警的規則配置,配置方式和 Prometheus 一樣的:

# 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 }})"

這裡我們新增了一條記錄規則,兩條報警規則,更多報警規則配置可參考 。

然後就可以部署 vmalert 元件服務了:

# 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=
            - -notifier.url=
            - -remoteWrite.url=
            - -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 指定一個遠端寫入的地址。

直接建立上面的資源清單即可完成部署。

☸ ➜ kubectl apply -f 
☸ ➜ kubectl apply -f 
☸ ➜ kubectl apply -f 
☸ ➜ kubectl get pods -n kube-vm -l app=alertmanager
NAME                           READY   STATUS    RESTARTS   AGE
alertmanager-d88d95b4f-z2j8g   1/1     Running   0          30m
☸ ➜ kubectl get svc -n kube-vm -l app=alertmanager
NAME           TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
alertmanager   NodePort   10.100.230.2           9093:31282/TCP   31m
☸ ➜ kubectl get pods -n kube-vm -l app=vmalert
NAME                       READY   STATUS    RESTARTS   AGE
vmalert-866674b966-675nb   1/1     Running   0          7m17s
☸ ➜ kubectl get svc -n kube-vm -l app=vmalert
NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
vmalert   NodePort   10.104.193.183           8080:30376/TCP   22m

部署成功後,如果有報警規則達到了閾值就會觸發報警,我們可以透過 Alertmanager 頁面檢視觸發的報警規則:

使用Vmalert監控報警使用Vmalert監控報警

同樣 vmalert 也提供了一個簡單的頁面,可以檢視所有的 Groups:

使用Vmalert監控報警使用Vmalert監控報警

也可以檢視到報警規則列表的狀態:

使用Vmalert監控報警使用Vmalert監控報警

還可以檢視到具體的一條報警規則的詳細資訊,如下所示:

使用Vmalert監控報警使用Vmalert監控報警

報警規則觸發後怎麼傳送,傳送到哪個接收器就是 Alertmanager 決定的了。

同樣的上面我們新增的記錄規則會透過 remote write 傳遞給 vminsert 保留下來,所以我們也可以透過 vmselect 查詢到。

使用Vmalert監控報警使用Vmalert監控報警

到這裡基本上我們就完成了使用 vm 代替 prometheus 來進行監控報警了,vmagent 採集監控指標,vmalert 用於報警監控,vmstorage 儲存指標資料,vminsert 接收指標資料,vmselect 查詢指標資料,已經完全可以不使用 prometheus 了,而且效能非常高,所需資源也比 prometheus 低很多。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2899066/,如需轉載,請註明出處,否則將追究法律責任。

相關文章