一、为什么选择 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、限制标签基数 |