云原生环境 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、限制标签基数
相关推荐
探索云原生2 小时前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
Java之美4 小时前
从edge-trigger到level-trigger,谈谈 Kubernetes controller 的开发范式
云原生
阿里云云原生19 小时前
深度解构:当 Append-only 的 SLS 遇上 Update/Delete,是如何实现设计权衡的?
云原生
Java之美1 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
秋播1 天前
nerdctl推送rancher本地镜像到harbor
云原生
阿里云云原生2 天前
告别冗长链路!Kafka × Table Bucket 实现开放表格式零 ETL 实时入湖
云原生·kafka
SelectDB3 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
秋播5 天前
国内本地WSL2编译rancher源码
云原生
小猿姐7 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
虚无境7 天前
如何编写一个SpringBoot项目告警推送的Starter
java·prometheus·webhook