Prometheus结合VictoriaMetrics:更高效、稳定的多集群监控方案
Prometheus集群管理的痛点
建设方案
方案简介
为了实现将Prometheus和VictoriaMetrics结合的方案,并且尽量减少对集群资源的占用,我们将架构做如下优化:
集群中仅部署Promethues及Exporters,并且尽量减少需要在集群中部署的组件。 通过Promethues的remote_write功能,将监控数据统一写入到VictoriaMetrics。 使用vmalert配置告警,并且发送到alertmanager进行告警推送。
建设内容
系统环境配置:确保系统满足Prometheus和VictoriaMetrics的运行要求。
网络规划:合理规划网络拓扑,确保各组件间通信顺畅。
资源分配:根据监控规模和数据量,合理分配CPU、内存和存储资源。
remote_write配置:在Prometheus配置文件中添加remote_write配置,指定VictoriaMetrics集群的地址和认证信息,使Prometheus能够将数据远程写入VictoriaMetrics集群。
服务发现:使用Prometheus的服务发现机制自动发现监控目标。
组件部署:按照官方文档或最佳实践,部署vmstorage、vminsert、vmselect等组件,并配置相应的副本数和资源限制。
配置优化:根据业务需求和数据量,调整组件的配置参数,如复制因子、数据块大小等,以优化存储效率和查询性能。
Prometheus部署
# 添加Helm仓库helm repo add prometheus-community https://prometheus-community.github.io/helm-charts# 获取values文件helm show values prometheus-community/kube-prometheus-stack > kube-prometheus-stack-values.yaml
# 关闭service Monitor选择器serviceMonitorSelectorNilUsesHelmValues: false# 关闭pod Monitor选择器podMonitorSelectorNilUsesHelmValues: false# 添加remotewrite配置# 这里domain为VictoriaMetrics的地址remoteWrite:- url: http://domain.com/api/v1/write# 为集群采集到的数据添加标识externalLabels:datacluster: clustername
service monitor选择器和pod monitor选择器可以不关闭,关闭后Prometheus会识别集群内所有的servermonitor和podmonitor。如果不关闭则servermonitor和podmonitor需要带有特定标签才会被识别。
externalLabels是为了在数据采集到VictoriaMetrics后区分监控数据是从那个集群发送的,具体的key: values可自行选择。配置externalLabels所有的监控数据都会带上配置的label。
VictoriaMetrics部署
# 添加Helm仓库
helm repo add vm https://victoriametrics.github.io/helm-charts/
# 获取values文件
helm show values vm/victoria-metrics-single > victoria-metrics-single-values.yaml
# 配置存储storageClass:"local-path"size: 50Gi# ingress配置ingress:enabled: trueannotations: {}hosts:- name: vmselect.cefso.onlinepath: /port: http
查看监控数据相关的label即可发现,数据上包含设置的externalLabels。
VictoriaMetricsAlert部署
# 获取values文件helm show values vm/victoria-metrics-alert > victoria-metrics-alert-values.yaml
# victoria metrics地址
datasource:
url:"http://vmselect.cefso.online"
# alertmanger地址
notifier:
alertmanager:
url:"http://alertmanager.cefso.online"
#配置ingress
ingress:
enabled: true
hosts:
- name: vmalert.cefso.online
path: /
port: http
#配置告警规则
configMap:""
config:
alerts:
groups:
- name: k3s节点状态
rules:
- alert: k3s节点状态
expr: up{datacluster="k3s",job="node-exporter"}<= 0
for: 1m
labels:
status: warning
annotations:
summary:"k3s节点状态异常"
description:"异常节点{{$labels.instance }}"
知识拓展
优化建议
# 修改victoria-metrics-single-values.yaml文件中相关字段# -- Data retention period in monthretentionPeriod: 1
- name: k3s节点状态rules:- alert: k3s节点状态expr: up{datacluster="k3s",job="node-exporter"}<= 0for: 1mlabels:status: warningannotations:summary:"k3s节点状态异常"description:"异常节点{{$labels.instance }}"
多集群监控实战
明确需要监控的多集群环境,包括Kubernetes集群、Docker容器、物理机等。 根据监控目标选择合适的Exporters进行数据采集。
Prometheus通过配置的Exporters采集监控目标的指标数据。 数据采集完成后,Prometheus将数据通过remote_write接口远程写入VictoriaMetrics集群。
VictoriaMetrics集群接收Prometheus写入的数据,并将其存储在vmstorage节点中(上面示例中采用单节点部署,所以没有vmstorage节点,生产环境和大规模集群可以使用多节点部署,提高可靠性)。 用户通过vmselect节点使用PromQL或MetricsQL查询语言查询监控数据,实现数据的实时分析和可视化展示。
使用vmalert组件配置告警规则,基于PromQL/MetricsQL表达式监控指标状态。 当指标状态触发告警规则时,vmalert将告警信息发送给Alertmanager进行处理和通知。 Alertmanager根据配置的通知渠道(如邮件、Slack等)发送告警通知给相关人员。
性能优化与故障排查
资源分配:根据监控数据量和查询负载动态调整组件的资源分配,确保系统稳定运行。 数据压缩与合并:利用VictoriaMetrics的数据压缩和后台合并机制减少存储空间占用和提高查询效率。 查询优化:通过合理使用PromQL/MetricsQL查询语言的特性和技巧优化查询性能。
监控自身健康:通过VictoriaMetrics的内置监控功能监控集群的健康状态及时发现潜在问题。 日志与诊断:利用组件的日志文件进行问题诊断快速定位并解决故障。 数据一致性检查:定期检查数据一致性确保监控数据的准确性和可靠性。