Kubernetes Dashboard VMAlert Record 规则部署指南

Kubernetes Dashboard VMAlert Record 规则部署指南

本文档说明如何使用VMAlert Recording Rules将Kubernetes dashboard中的所有查询语句按天、周、月维度进行聚合。

概述

通过VMAlert Recording Rules,我们可以将原始的Prometheus指标转换为预聚合的指标,提供以下优势:

  1. 性能提升:预聚合指标查询速度更快
  2. 存储优化:减少重复计算,优化存储空间
  3. 多维度聚合:支持天、周、月等不同时间维度的聚合
  4. 业务指标:提供增长率、趋势等业务相关指标

规则结构

1. CPU使用率聚合指标 (k8s.cpu.aggregation)

实时指标

  • k8s:cpu:usage:rate5m - 5分钟CPU使用率
  • k8s:cpu:usage:rate1h - 1小时CPU使用率
  • k8s:cpu:usage:windows:rate5m - Windows节点5分钟CPU使用率

日级聚合

  • k8s:cpu:usage:daily_avg - 24小时平均CPU使用率
  • k8s:cpu:usage:daily_max - 24小时最大CPU使用率
  • k8s:cpu:usage:daily_min - 24小时最小CPU使用率
  • k8s:cpu:usage:daily_p95 - 24小时P95 CPU使用率

周级聚合

  • k8s:cpu:usage:weekly_avg - 7天平均CPU使用率
  • k8s:cpu:usage:weekly_max - 7天最大CPU使用率
  • k8s:cpu:usage:weekly_min - 7天最小CPU使用率
  • k8s:cpu:usage:weekly_p95 - 7天P95 CPU使用率

月级聚合

  • k8s:cpu:usage:monthly_avg - 30天平均CPU使用率
  • k8s:cpu:usage:monthly_max - 30天最大CPU使用率
  • k8s:cpu:usage:monthly_min - 30天最小CPU使用率
  • k8s:cpu:usage:monthly_p95 - 30天P95 CPU使用率

2. 内存使用率聚合指标 (k8s.memory.aggregation)

实时指标

  • k8s:memory:usage:rate5m - 5分钟内存使用率
  • k8s:memory:usage:rate1h - 1小时内存使用率
  • k8s:memory:usage:windows:rate5m - Windows节点5分钟内存使用率

聚合指标:与CPU类似,提供日、周、月三个维度的聚合

3. Kubernetes资源计数聚合指标 (k8s.resources.aggregation)

实时计数

  • k8s:resources:namespaces:count - 命名空间数量
  • k8s:resources:running_containers:count - 运行中容器数量
  • k8s:resources:running_pods:count - 运行中Pod数量
  • k8s:resources:services:count - 服务数量
  • k8s:resources:deployments:count - 部署数量
  • k8s:resources:statefulsets:count - StatefulSet数量
  • k8s:resources:daemonsets:count - DaemonSet数量
  • k8s:resources:pvcs:count - PVC数量
  • k8s:resources:hpas:count - HPA数量
  • k8s:resources:configmaps:count - ConfigMap数量
  • k8s:resources:secrets:count - Secret数量
  • k8s:resources:networkpolicies:count - 网络策略数量
  • k8s:resources:nodes:count - 节点数量

聚合指标:提供运行中Pod数量的日、周、月聚合

4. Pod QoS和状态聚合指标 (k8s.pods.aggregation)

QoS分类计数

  • k8s:pods:qos:guaranteed:count - Guaranteed QoS Pod数量
  • k8s:pods:qos:burstable:count - Burstable QoS Pod数量
  • k8s:pods:qos:best_effort:count - BestEffort QoS Pod数量
  • k8s:pods:total:count - 总Pod数量

状态原因计数

  • k8s:pods:status_reason:evicted:count - 被驱逐的Pod数量
  • k8s:pods:status_reason:preempted:count - 被抢占的Pod数量
  • k8s:pods:status_reason:node_lost:count - 节点丢失的Pod数量

聚合指标:提供各QoS分类的日、周、月聚合

5. 容器重启和OOM事件聚合指标 (k8s.events.aggregation)

实时事件计数

  • k8s:events:oom:rate5m - 5分钟OOM事件速率
  • k8s:events:restarts:rate5m - 5分钟重启事件速率
  • k8s:events:oom:rate1h - 1小时OOM事件速率
  • k8s:events:restarts:rate1h - 1小时重启事件速率

聚合指标

  • 日级:daily_total, daily_avg
  • 周级:weekly_total, weekly_avg
  • 月级:monthly_total, monthly_avg

6. 网络使用率聚合指标 (k8s.network.aggregation)

实时网络使用率

  • k8s:network:receive:rate5m - 5分钟接收速率
  • k8s:network:transmit:rate5m - 5分钟发送速率
  • k8s:network:receive:rate1h - 1小时接收速率
  • k8s:network:transmit:rate1h - 1小时发送速率

网络丢包率

  • k8s:network:dropped:receive:rate5m - 5分钟接收丢包率
  • k8s:network:dropped:transmit:rate5m - 5分钟发送丢包率

聚合指标:提供日、周、月三个维度的聚合

7. 按命名空间的网络使用率聚合指标 (k8s.network.namespace.aggregation)

实时按命名空间网络使用率

  • k8s:network:namespace:receive:rate5m - 5分钟按命名空间接收速率
  • k8s:network:namespace:transmit:rate5m - 5分钟按命名空间发送速率

聚合指标:提供日、周、月三个维度的聚合

8. 按实例的网络使用率聚合指标 (k8s.network.instance.aggregation)

实时按实例网络使用率

  • k8s:network:instance:receive:rate5m - 5分钟按实例接收速率
  • k8s:network:instance:transmit:rate5m - 5分钟按实例发送速率

聚合指标:提供日、周、月三个维度的聚合

9. 业务指标聚合 (k8s.business.aggregation)

日增长率指标

  • k8s:business:cpu:usage:daily_growth_rate - CPU使用率日增长率
  • k8s:business:memory:usage:daily_growth_rate - 内存使用率日增长率
  • k8s:business:running_pods:daily_growth_rate - 运行中Pod数量日增长率

周环比增长率

  • k8s:business:cpu:usage:week_over_week - CPU使用率周环比增长率
  • k8s:business:memory:usage:week_over_week - 内存使用率周环比增长率
  • k8s:business:running_pods:week_over_week - 运行中Pod数量周环比增长率

月环比增长率

  • k8s:business:cpu:usage:month_over_month - CPU使用率月环比增长率
  • k8s:business:memory:usage:month_over_month - 内存使用率月环比增长率
  • k8s:business:running_pods:month_over_month - 运行中Pod数量月环比增长率

趋势指标

  • k8s:business:cpu:usage:trend - CPU使用率趋势
  • k8s:business:memory:usage:trend - 内存使用率趋势
  • k8s:business:running_pods:trend - 运行中Pod数量趋势

10. 性能指标聚合 (k8s.performance.aggregation)

资源利用率指标

  • k8s:performance:cpu:efficiency - CPU资源利用效率
  • k8s:performance:memory:efficiency - 内存资源利用效率

聚合指标:提供日、周、月三个维度的聚合

部署步骤

步骤1:创建ConfigMap

1
2
3
4
# 创建包含vmalert规则的ConfigMap
kubectl create configmap k8s-dashboard-vmalert-rules \
  --from-file=k8s-dashboard-vmalert-rules.yaml \
  --namespace=monitoring

步骤2:部署VMAlert

 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
# vmalert-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vmalert
  namespace: monitoring
  labels:
    app: vmalert
spec:
  replicas: 2
  selector:
    matchLabels:
      app: vmalert
  template:
    metadata:
      labels:
        app: vmalert
    spec:
      serviceAccountName: vmalert
      containers:
      - name: vmalert
        image: victoriametrics/vmalert:v1.95.1
        args:
        - "-datasource.url=http://vmselect.victoriametrics.svc.cluster.local:8481/select/0/prometheus"
        - "-remoteWrite.url=http://vminsert.victoriametrics.svc.cluster.local:8480/insert/0/prometheus/api/v1/write"
        - "-remoteRead.url=http://vmselect.victoriametrics.svc.cluster.local:8481/select/0/prometheus"
        - "-rule=/etc/vmalert/rules/*.yaml"
        - "-evaluationInterval=30s"
        - "-httpListenAddr=0.0.0.0:8880"
        - "-external.url=http://vmalert.vm-monitoring.svc.cluster.local:8880"
        - "-external.alert.source=vmalert/{{.GroupID}}/{{.AlertID}}"
        - "-loggerLevel=INFO"
        ports:
        - containerPort: 8880
          name: http
        volumeMounts:
        - name: k8s-dashboard-rules
          mountPath: /etc/vmalert/rules/k8s-dashboard-vmalert-rules.yaml
          subPath: k8s-dashboard-vmalert-rules.yaml
        resources:
          requests:
            cpu: 100m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /health
            port: 8880
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 8880
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: k8s-dashboard-rules
        configMap:
          name: k8s-dashboard-vmalert-rules
---
apiVersion: v1
kind: Service
metadata:
  name: vmalert
  namespace: monitoring
  labels:
    app: vmalert
spec:
  ports:
  - port: 8880
    targetPort: 8880
  selector:
    app: vmalert

步骤3:应用部署

1
2
3
4
5
6
# 部署VMAlert
kubectl apply -f vmalert-deployment.yaml

# 验证部署状态
kubectl get pods -n monitoring
kubectl get svc -n monitoring

步骤4:验证规则执行

1
2
3
4
5
6
7
8
# 检查VMAlert状态
kubectl logs -n monitoring deployment/vmalert

# 验证规则加载
curl -s "http://vmalert.monitoring.svc.cluster.local:8880/api/v1/rules" | jq

# 检查规则执行状态
curl -s "http://vmalert.monitoring.svc.cluster.local:8880/api/v1/alerts" | jq

步骤5:验证指标生成

1
2
3
4
5
6
7
8
# 验证CPU聚合指标
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=k8s:cpu:usage:daily_avg" | jq

# 验证内存聚合指标
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=k8s:memory:usage:weekly_avg" | jq

# 验证业务指标
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=k8s:business:cpu:usage:daily_growth_rate" | jq

使用示例

1. 创建基于聚合指标的Dashboard

在Grafana中,可以使用这些预聚合指标创建更高效的dashboard:

CPU使用率趋势图

1
2
3
4
# 使用预聚合指标,查询更快
k8s:cpu:usage:daily_avg
k8s:cpu:usage:weekly_avg
k8s:cpu:usage:monthly_avg

内存使用率对比图

1
2
3
4
# 对比不同时间维度的使用率
k8s:memory:usage:daily_max
k8s:memory:usage:weekly_max
k8s:memory:usage:monthly_max

业务增长趋势图

1
2
3
4
# 显示增长率趋势
k8s:business:cpu:usage:daily_growth_rate
k8s:business:memory:usage:daily_growth_rate
k8s:business:running_pods:daily_growth_rate

2. 创建告警规则

基于聚合指标创建告警规则:

 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
# alert-rules.yaml
groups:
- name: k8s.business.alerts
  rules:
  - alert: HighCPUUsageTrend
    expr: k8s:business:cpu:usage:daily_growth_rate > 20
    for: 5m
    labels:
      severity: warning
      team: platform
    annotations:
      summary: "CPU使用率增长趋势过高"
      description: "CPU使用率日增长率达到 {{ $value }}%"
  
  - alert: HighMemoryUsageTrend
    expr: k8s:business:memory:usage:daily_growth_rate > 20
    for: 5m
    labels:
      severity: warning
      team: platform
    annotations:
      summary: "内存使用率增长趋势过高"
      description: "内存使用率日增长率达到 {{ $value }}%"
  
  - alert: PodCountDecline
    expr: k8s:business:running_pods:daily_growth_rate < -10
    for: 10m
    labels:
      severity: warning
      team: platform
    annotations:
      summary: "运行中Pod数量下降"
      description: "运行中Pod数量日增长率下降 {{ $value }}%"

性能优化建议

1. 规则评估间隔

  • 实时指标:30秒评估间隔,适合需要实时监控的指标
  • 聚合指标:可以根据需要调整评估间隔,减少计算压力

2. 存储优化

  • 使用VictoriaMetrics的压缩功能
  • 根据业务需求设置合适的数据保留期
  • 考虑使用降采样策略

3. 查询优化

  • 优先使用预聚合指标进行查询
  • 避免在dashboard中使用复杂的原始指标查询
  • 利用聚合指标的标签进行分组查询

监控和维护

1. VMAlert状态监控

1
2
3
4
5
# 检查规则执行状态
curl -s "http://vmalert:8880/api/v1/rules" | jq '.data.groups[] | {name: .name, rules: (.rules | length)}'

# 检查规则执行时间
curl -s "http://vmalert:8880/api/v1/rules" | jq '.data.groups[].rules[] | {name: .name, lastEvaluation: .lastEvaluation}'

2. 指标生成监控

1
2
3
4
5
# 检查聚合指标是否正常生成
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=count(k8s:cpu:usage:daily_avg)" | jq

# 检查指标标签
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=k8s:cpu:usage:daily_avg" | jq '.data.result[0].metric'

3. 性能监控

1
2
3
4
5
# 检查VMAlert资源使用情况
kubectl top pods -n monitoring | grep vmalert

# 检查VictoriaMetrics性能
curl -s "http://vmselect:8481/select/0/prometheus/api/v1/query?query=rate(vm_http_requests_total[5m])" | jq

故障排除

1. 规则不执行

  • 检查VMAlert日志
  • 验证规则文件语法
  • 检查数据源连接

2. 指标不生成

  • 验证原始指标是否存在
  • 检查规则表达式语法
  • 确认时间范围设置

3. 性能问题

  • 调整规则评估间隔
  • 优化规则表达式
  • 增加VMAlert资源限制

总结

通过VMAlert Recording Rules,我们可以将Kubernetes dashboard中的复杂查询转换为高效的预聚合指标,提供多维度的时间聚合和业务指标。这不仅提升了查询性能,还为业务监控和趋势分析提供了强有力的支持。

建议根据实际业务需求调整规则配置,并持续监控规则执行状态和指标生成情况。

0%