云原生环境 Prometheus 企业级监控实战指南

一、为什么选择 Prometheus?

在传统架构中,Zabbix、Nagios 等监控工具是主流,但在 Kubernetes 环境中,这些工具难以应对动态、短生命周期、大规模容器的监控需求。Prometheus 应运而生,成为 CNCF 毕业项目之一,专为云原生设计。

核心优势:

  • 多维数据模型:支持标签(labels)实现灵活的数据查询与聚合。

  • PromQL:强大的查询语言,支持实时分析和告警。

  • 无需依赖外部存储:内置时序数据库。

  • 服务发现机制:自动发现 K8s 中的 Pod、Service、Node。

  • Pull 模型:主动拉取 Metrics,便于控制数据采集节奏。


二、Prometheus 在 K8s 中的架构流程

text

复制代码
Node Exporter (节点级) + cAdvisor (容器级) → Prometheus (采集+存储) → Grafana (可视化) → AlertManager (告警)

组件说明:

组件 功能
Node Exporter 采集节点 CPU、内存、磁盘、网络等指标
cAdvisor 集成在 Kubelet 中,采集容器资源使用情况
Prometheus 拉取 Metrics,存储时序数据,支持 PromQL
Grafana 可视化仪表盘
AlertManager 告警路由、分组、静默、抑制

三、环境准备:克隆 Prometheus Operator 项目

bash

复制代码
git clone -b release-0.10 https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus

四、安装 Prometheus Operator(核心)

bash

复制代码
kubectl apply --server-side -f manifests/setup

--server-side 避免 kubectl 的冲突问题,直接由 API Server 处理声明式配置。

删除 Operator:

bash

复制代码
kubectl delete --ignore-not-found=true -f manifests/setup

五、安装 Prometheus Stack(全家桶)

bash

复制代码
kubectl apply --server-side -f manifests/

包含:Prometheus、AlertManager、Grafana、ServiceMonitors、告警规则等。

删除 Stack:

bash

复制代码
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

六、查看组件状态

bash

复制代码
kubectl get pod -n monitoring

七、暴露 Grafana 服务(NodePort)

编辑 Service:

bash

复制代码
kubectl edit svc grafana -n monitoring

修改 type: NodePort,并指定 nodePort: 32082

yaml

复制代码
ports:
  - name: http
    nodePort: 32082
    port: 3000
    protocol: TCP
    targetPort: http
type: NodePort

访问地址:http://<任意节点IP>:32082

默认账号密码:admin/admin


八、暴露 Prometheus 服务(NodePort)

bash

复制代码
kubectl edit svc prometheus-k8s -n monitoring

修改 type: NodePortnodePort: 32370

访问地址:http://<任意节点IP>:32370


九、配置 Grafana 数据源

若未自动添加,手动配置:

  • URL:http://prometheus-k8s:9090

  • 保存并测试


十、导入监控 Dashboard

推荐模板:

模板 ID 说明
13105 Kubernetes 中文版集群监控
7249 Kubernetes Cluster
893 Docker 和系统监控
14731 Node Exporter 主机监控

导入方式:Grafana → + → Import → 输入 ID → Load → Import


十一、监控 MySQL:Exporter 实战

1. 部署 MySQL

bash

复制代码
kubectl create deploy mysql --image=mysql:5.7.23
kubectl set env deploy/mysql MYSQL_ROOT_PASSWORD=pwd123

2. 暴露 Service

bash

复制代码
kubectl expose deployment mysql --type NodePort --port=3306

3. 创建 MySQL Exporter

yaml

复制代码
# mysql-exporter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  template:
    metadata:
      labels:
        k8s-app: mysql-exporter
    spec:
      containers:
      - name: mysql-exporter
        image: registry.cn-beijing.aliyuncs.com/dotbalo/mysql-exporter
        env:
        - name: DATA_SOURCE_NAME
          value: "exporter:exporter@(mysql.default:3306)/"
        ports:
        - containerPort: 9104
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
spec:
  selector:
    k8s-app: mysql-exporter
  ports:
  - name: api
    port: 9104

bash

复制代码
kubectl apply -f mysql-exporter.yaml

4. 创建 ServiceMonitor

yaml

复制代码
# mysql-sm.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
spec:
  jobLabel: k8s-app
  endpoints:
  - port: api
    interval: 30s
  selector:
    matchLabels:
      k8s-app: mysql-exporter

bash

复制代码
kubectl apply -f mysql-sm.yaml

5. 导入 MySQL Dashboard

模板 ID:6239


十二、钉钉告警集成(企业级必备)

1. 添加钉钉机器人

  • 群设置 → 智能群助手 → 添加机器人 → 自定义

  • 关键词:FIRING

2. 部署 webhook-dingtalk

bash

复制代码
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.0.0/prometheus-webhook-dingtalk-2.0.0.linux-amd64.tar.gz
tar xf prometheus-webhook-dingtalk-2.0.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-2.0.0.linux-amd64 /usr/local/dingtalk

3. 配置 config.yml

yaml

复制代码
targets:
  webhook2:
    url: https://oapi.dingtalk.com/robot/send?access_token=你的token
    secret: 你的secret

4. 启动服务

bash

复制代码
cat > /etc/systemd/system/prometheus-webhook-dingtalk.service <<EOF
[Unit]
Description=Prometheus Webhook DingTalk
After=network.target

[Service]
ExecStart=/usr/local/dingtalk/prometheus-webhook-dingtalk
WorkingDirectory=/usr/local/dingtalk
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl start prometheus-webhook-dingtalk

5. 修改 AlertManager 配置

编辑 alertmanager-secret.yaml,添加:

yaml

复制代码
receivers:
- name: webhook
  webhook_configs:
  - url: http://<dingtalk节点IP>:8060/dingtalk/webhook2/send
    send_resolved: true

bash

复制代码
kubectl replace -f alertmanager-secret.yaml

6. 暴露 AlertManager

bash

复制代码
kubectl edit svc alertmanager-main -n monitoring

修改 type: NodePort,查看端口:

bash

复制代码
kubectl get svc -n monitoring alertmanager-main

访问:http://<任意节点IP>:30586


十三、补充知识点(博客亮点)

✅ 1. Prometheus 告警状态机

状态 说明
Inactive 未触发
Pending 已触发,等待 for 时间
Firing 触发并发送到 AlertManager

✅ 2. Prometheus vs Prometheus Operator

方式 优点 缺点
手动部署 灵活可控 配置复杂,需手动维护
Operator 自动化管理,K8s 原生 黑盒化,调试困难

✅ 3. ServiceMonitor 核心字段

  • selector.matchLabels:匹配 Exporter Service 的标签

  • endpoints.port:Exporter 的端口名称

  • interval:采集间隔

✅ 4. Exporter 设计模式

适用于无法直接暴露 Metrics 的应用(MySQL、Redis、Kafka、Nginx 等),通过 Sidecar 或独立 Pod 采集并暴露。

✅ 5. Prometheus 高可用方案

  • 双实例 + 数据分片

  • Thanos 或 VictoriaMetrics 实现长期存储与全局视图

  • AlertManager 集群化避免告警重复


十四、常见问题排查

问题 解决方法
Target 状态为 DOWN 检查 Service 端口、Endpoint、网络策略
Grafana 无数据 确认 Prometheus 数据源 URL 是否正确
钉钉未收到告警 检查 AlertManager 配置、机器人关键词、网络连通性
Prometheus 内存高 减少采集频率、优化 PromQL、限制标签基数
相关推荐
Demon_Hao5 分钟前
Spring Boot 4、JDK 25 与 GraalVM:Java 云原生进化,能否撼动 Go 的地位?
java·spring boot·云原生
江畔柳前堤9 小时前
GO01-Go 语言与主流编程语言深度对比
开发语言·人工智能·后端·微服务·云原生·golang·go
探索云原生14 小时前
终于搞懂 Kueue:5 个核心对象一次讲透
linux·docker·ai·云原生·kubernetes
月落星还在16 小时前
Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
spring boot·spring·云原生·mvc
Database_Cool_19 小时前
数据库性能不够用,升级到什么方案好?阿里云 PolarDB(云原生数据库领导者,兼容 MySQL/PostgreSQL/Oracle)平滑升级与百倍弹性
数据库·阿里云·云原生
霸道流氓气质19 小时前
微服务架构核心概念业务示例
微服务·云原生·架构
ai_coder_ai20 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行数据库相关操作
数据库·云原生·自动化
AOwhisky20 小时前
Python 学习笔记(第六期)——函数:定义、参数传递与作用域
笔记·python·学习·云原生·运维开发·函数·参数传递
小小龙学IT20 小时前
Tigris:下一代无服务器数据库
数据库·云原生·serverless
ai_coder_ai1 天前
论模型驱动分析方法及应用
微服务·云原生·架构