云原生环境 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: NodePort,nodePort: 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、限制标签基数
相关推荐
JWASX16 分钟前
go 学习 - prometheus 指标协程池监控
学习·golang·prometheus
紫神21 小时前
DDS 通信技术说明
网络·云原生·容器·k8s·dds·弱网
weixin_435247061 天前
医疗科研“Agent化”:给研究型医院搭AI原生科研平台的3个架构取舍
云原生
爱琴孩2 天前
记一次Prometheus的WAL异常,导致服务器磁盘占用过高
prometheus·wal
sbjdhjd2 天前
云安全 | Docker 容器逃逸复盘(二):2375 未授权接口如何突破容器管理边界
网络安全·docker·云原生·数据挖掘·开源·云计算·云安全
MrSYJ2 天前
Docker端口映射咋做的,模拟下。
docker·云原生·kubernetes
张小凡vip2 天前
Kubernetes--k8s---了解和使用configmap挂载配置文件
云原生·容器·kubernetes
Cheney Pan3 天前
第12篇 Prometheus 高可用与长期存储
prometheus
寻林写彡3 天前
云安全 | Docker 容器逃逸复盘(一):从隔离边界到运行时链路,如何确认自己身处容器
安全·云原生
MrSYJ3 天前
别人再问你路由表是啥,这篇文章摔它脸上
docker·云原生·kubernetes