简介:本文详细讲解如何使用Prometheus与Alertmanager搭建云原生环境下的CPU和内存监控告警系统,涵盖安装部署、配置规则、告警策略及实战案例,帮助开发者快速掌握云原生监控核心技能。
在容器化与微服务架构普及的今天,传统监控方式已难以满足动态扩展的云原生环境需求。云原生监控的核心价值体现在三个方面:
以Kubernetes环境为例,单个节点的Pod数量可能达到数十个,且存在频繁的滚动更新。传统Zabbix等监控工具需要手动维护主机列表,而Prometheus通过ServiceMonitor等CRD资源可实现监控目标的自动发现与配置。
Prometheus采用独特的拉取式监控模型,主要包含:
Prometheus使用多维度数据模型,每个时间序列由<metric_name>{<label_name>=<label_value>, ...}唯一标识。例如:
node_cpu_seconds_total{cpu="0",mode="system",instance="192.168.1.100:9100"} 12345.67
这种标签化设计使得指标查询具有极强的灵活性,可通过{instance=~"192.*"}进行正则匹配查询特定节点数据。
通过Helm Chart可快速完成部署:
# 添加Prometheus社区仓库helm repo add prometheus-community https://prometheus-community.github.io/helm-charts# 部署Node Exporter(采集主机指标)helm install node-exporter prometheus-community/prometheus-node-exporter \--namespace monitoring --create-namespace# 部署Prometheus核心组件helm install prometheus prometheus-community/prometheus \--namespace monitoring \--set server.retentionTime="30d" \--set server.persistentVolume.size="50Gi"
Node Exporter默认暴露的CPU相关指标:
node_cpu_seconds_total:按模式(user/system/idle等)分类的CPU时间node_cpu_frequency_hz:CPU频率node_load1:1分钟平均负载内存相关指标:
node_memory_MemTotal_bytes:总内存node_memory_MemAvailable_bytes:可用内存node_memory_Buffers_bytes:缓冲区内存在Prometheus的prometheus.yml中配置recording rules提升查询效率:
rule_files:- 'rules/*.rules.yml'# rules/cpu_memory.rules.yml示例groups:- name: cpu_memory_rulesrules:- record: job:node_cpu_utilization:rate5mexpr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)labels:severity: warning- record: job:node_memory_utilization:ratioexpr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)
创建alerts/cpu_memory.alerts.yml:
groups:- name: cpu_memory_alertsrules:- alert: HighCPUUsageexpr: job:node_cpu_utilization:rate5m > 85for: 10mlabels:severity: criticalannotations:summary: "High CPU usage on {{ $labels.instance }}"description: "CPU usage is {{ $value }}% on instance {{ $labels.instance }}"- alert: LowMemoryAvailableexpr: job:node_memory_utilization:ratio > 90for: 5mlabels:severity: warningannotations:summary: "Low available memory on {{ $labels.instance }}"description: "Only {{ $value }}% memory available on {{ $labels.instance }}"
alertmanager.yml核心配置示例:
route:receiver: default-receivergroup_by: ['alertname', 'instance']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceivers:- name: default-receiveremail_configs:- to: 'ops@example.com'send_resolved: truewebhook_configs:- url: 'http://alert-webhook:8080/'send_resolved: trueinhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['instance']
某电商网站在促销期间,某节点Pod的CPU使用率持续超过90%。Prometheus监控流程如下:
rate(node_cpu_seconds_total[5m])计算5分钟平均使用率top -H和perf top定位到具体进程predict_linear函数提前15分钟预警配置Prometheus的远程存储(如Thanos、Cortex):
storage:tsdb:retention: 30dremote_write:- url: "http://thanos-receiver:19291/api/v1/receive"
使用Golang模板语法自定义告警内容:
annotations:runbook_url: "https://wiki.example.com/runbook/{{ .GroupLabels.alertname }}"dashboard_url: "http://grafana:3000/d/node-exporter-full/node-exporter-full?var-instance={{ .Labels.instance }}"
通过Prometheus Operator的联邦集群功能实现:
# 在Hub集群配置- job_name: 'spoke-cluster'scrape_interval: 1mstatic_configs:- targets: ['spoke-prometheus:9090']labels:cluster: 'spoke1'
--collector.disable-defaults参数是否排除了必要采集器evaluation_interval(默认1分钟)和for持续时间--storage.tsdb.retention.time和--web.enable-admin-api进行诊断/api/v1/endpoints本文系统阐述了云原生环境下基于Prometheus+Alertmanager的监控告警体系实现,覆盖了从指标采集到告警通知的全流程。实际生产环境中,建议结合Grafana进行可视化展示,并通过Thanos实现全球视图监控。随着eBPF技术的成熟,未来监控系统将向更细粒度的内核态指标采集方向发展,建议持续关注CNCF生态的最新工具链。
对于初学者,建议从单节点监控开始实践,逐步掌握PromQL查询语法和Alertmanager路由规则。在实际部署时,务必考虑高可用架构,至少部署两个Prometheus实例并配置数据同步。