1. 项目概述:K8s监控体系一键部署方案
在容器化运维领域,Kubernetes集群的监控一直是保障业务稳定性的关键环节。今天分享的这套Prometheus监控全家桶部署方案,经过我在生产环境多次验证,真正实现了"复制粘贴完成部署"的目标。整套方案包含Prometheus主服务、Alertmanager告警组件、Grafana可视化平台以及Node-Exporter主机监控代理,全部通过原生Kubernetes资源定义文件部署,无需额外依赖。
这个方案特别适合以下场景:
- 刚完成K8s集群搭建需要快速建立监控体系
- 现有监控方案性能不足需要迁移到Prometheus栈
- 开发测试环境需要轻量级监控解决方案
重要提示:所有YAML文件均经过资源限制优化,默认配置即可支持20节点以下集群监控,生产环境请根据实际负载调整resource配置
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件与架构设计
2.1 监控栈技术选型
整套方案采用云原生监控的标准技术栈:
- Prometheus 2.45:时序数据库与采集核心
- Alertmanager 0.26:告警路由与去重
- Grafana 10.2:可视化仪表盘
- kube-state-metrics 2.9:K8s对象状态采集
- node-exporter 1.6:主机层指标采集
选择这些版本组合主要基于:
- 版本间兼容性已验证
- 资源消耗与功能平衡
- 长期支持版本稳定性
2.2 网络拓扑设计
mermaid复制graph TD
A[Prometheus Server] -->|pull metrics| B(Node-Exporter)
A --> C(kube-state-metrics)
A --> D(cAdvisor)
E[Grafana] -->|datasource| A
F[Alertmanager] -->|接收告警| A
F -->|发送通知| G(Email/Slack)
实际部署时需要特别注意的端口配置:
- Prometheus: 9090
- Alertmanager: 9093
- Grafana: 3000
- Node-Exporter: 9100
3. 完整部署实操步骤
3.1 命名空间与权限准备
首先创建监控专用命名空间:
bash复制kubectl create ns monitoring
应用RBAC授权配置(保存为prometheus-rbac.yaml):
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups: ["extensions", "networking.k8s.io"]
resources:
- ingresses
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitoring
应用配置:
bash复制kubectl apply -f prometheus-rbac.yaml
3.2 Prometheus主服务部署
配置prometheus-config.yaml:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
部署prometheus-deployment.yaml:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.45.0
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
ports:
- containerPort: 9090
volumeMounts:
- mountPath: /etc/prometheus
name: config-volume
- mountPath: /prometheus
name: storage-volume
volumes:
- name: config-volume
configMap:
name: prometheus-config
- name: storage-volume
emptyDir: {}
创建Service(prometheus-svc.yaml):
yaml复制apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: monitoring
spec:
type: NodePort
ports:
- port: 9090
targetPort: 9090
nodePort: 30090
selector:
app: prometheus
3.3 周边组件部署
Node-Exporter部署(node-exporter.yaml):
yaml复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:v1.6.1
ports:
- containerPort: 9100
Grafana部署(grafana.yaml):
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:10.2.0
ports:
- containerPort: 3000
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
volumes:
- name: grafana-storage
emptyDir: {}
4. 配置优化与使用技巧
4.1 数据持久化配置
默认使用emptyDir会导致数据丢失,生产环境建议修改为PVC:
yaml复制apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-data
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
然后在Deployment中替换:
yaml复制volumes:
- name: storage-volume
persistentVolumeClaim:
claimName: prometheus-data
4.2 告警规则配置示例
在prometheus-config.yaml中添加:
yaml复制rule_files:
- /etc/prometheus/rules/*.yml
创建告警规则configmap(prometheus-rules.yaml):
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-rules
namespace: monitoring
data:
node-rules.yml: |
groups:
- name: node-alerts
rules:
- alert: HighNodeCPU
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is {{ $value }}%"
4.3 资源限制建议
生产环境推荐配置:
yaml复制resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
5. 常见问题排查
5.1 指标采集失败
现象:Prometheus targets页面显示DOWN
排查步骤:
- 检查Service Discovery是否正常
bash复制
kubectl -n monitoring get endpoints - 验证网络连通性
bash复制kubectl -n monitoring exec -it prometheus-pod -- curl node-exporter:9100/metrics - 检查RBAC权限
bash复制
kubectl -n monitoring describe clusterrolebinding prometheus
5.2 Grafana无法连接数据源
解决方案:
- 检查服务发现
bash复制
kubectl -n monitoring get svc prometheus - 验证网络策略
- 检查Grafana配置中的URL应为:
code复制http://prometheus:9090
5.3 存储空间不足
处理方法:
- 调整Prometheus保留时间
yaml复制args: - "--storage.tsdb.retention.time=15d" - 启用数据压缩
yaml复制- "--storage.tsdb.max-block-duration=2h" - "--storage.tsdb.min-block-duration=2h"
6. 部署验证与效果展示
6.1 服务状态检查
bash复制kubectl -n monitoring get pods -o wide
预期输出应包含:
- prometheus-xxxx Running
- grafana-xxxx Running
- node-exporter-xxxx Running (每个节点一个)
6.2 访问各服务
-
Prometheus UI:
bash复制
kubectl -n monitoring port-forward svc/prometheus 9090:9090浏览器访问 http://localhost:9090
-
Grafana:
bash复制
kubectl -n monitoring port-forward svc/grafana 3000:3000默认账号admin/admin
6.3 导入仪表盘
在Grafana中导入以下官方仪表盘:
- Kubernetes Cluster Monitoring (ID: 315)
- Node Exporter Full (ID: 11074)
导入方法:
- 左侧菜单选择"Create" → "Import"
- 输入仪表盘ID
- 选择Prometheus数据源
7. 生产环境进阶建议
7.1 高可用部署方案
对于生产环境,建议采用以下高可用架构:
- Prometheus:2副本+Thanos边车
- Alertmanager:3副本集群
- Grafana:无状态多副本
示例Thanos配置:
yaml复制- name: thanos-sidecar
image: thanosio/thanos:v0.32.0
args:
- sidecar
- --prometheus.url=http://localhost:9090
- --grpc-address=0.0.0.0:10901
ports:
- containerPort: 10901
7.2 监控项扩展建议
建议增加的监控维度:
- Ingress控制器监控
- 自定义业务指标
- 分布式追踪数据
示例业务指标采集:
yaml复制- job_name: 'custom-metrics'
static_configs:
- targets: ['app-service:8080']
metrics_path: '/metrics'
7.3 性能调优参数
大型集群推荐配置:
yaml复制args:
- --storage.tsdb.retention.time=30d
- --storage.tsdb.max-block-duration=4h
- --storage.tsdb.min-block-duration=4h
- --query.max-concurrency=20
- --query.timeout=2m
