云原生环境 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、限制标签基数
相关推荐
L0208247 小时前
Kubernetes Ingress|CNI 网络模型|Calico 网络策略|Pod 调度器完整实战教程
运维·网络·云原生·容器·kubernetes
闲云野鹤在人间9 小时前
Kubernetes Pod Scheduler 详解
云原生·容器·kubernetes
xianyuCcCcCCCcc13 小时前
Kubernetes :健康检查、认证授权与可视化面板
运维·云原生·kubernetes·dashboard
fb_1234514 小时前
K8s调度实战全景-Pod调度与资源管控
云原生·容器·kubernetes
江华森15 小时前
Kubernetes集群部署实战:使用kubeadm在4台ECS服务器上搭建K8s v1.31集群
云原生·容器·kubernetes
SelectDB技术团队16 小时前
ClickHouse 支持存算分离吗?Doris 社区版原生存算分离怎么落地
数据库·clickhouse·云原生·开源·apache doris·技术选型·存算分层
暖核16 小时前
K8s 深度拆解:健康检查、认证授权与可视化面板全梳理
云原生·容器·kubernetes
分布式存储与RustFS17 小时前
十分钟在自己机器上跑通一个 S3 兼容对象存储(RustFS + Docker)
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
知已难寻17 小时前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
2301_7807896617 小时前
SSL 卸载 + WAF + 抗 D:高防 CDN 一站式解决 HTTPS 性能与安全
网络·云原生·ddos