1. 项目背景与核心价值
在云原生技术栈中,监控系统的搭建就像给数据中心装上"神经系统"。Grafana和Prometheus这对黄金组合,已经成为Kubernetes环境下的监控标配方案。前者负责数据可视化,后者专注指标采集,两者配合能实时反映集群健康状态、资源使用情况和应用性能指标。
我最近在三个不同规模的K8s集群上部署了这套监控系统,发现即便是相同的安装流程,在不同网络环境和资源配比下也会遇到各种"坑"。本文将分享经过实战验证的部署方案,包含Helm Chart调优技巧、持久化存储配置以及访问控制的最佳实践。
2. 环境准备与工具选型
2.1 基础环境要求
- Kubernetes集群版本 ≥1.16(建议1.20+)
- Helm 3.x已安装并配置好repo
- 默认StorageClass可用(如需持久化存储)
- 集群节点至少2核4GB内存(生产环境建议翻倍)
注意:minikube等本地测试环境需提前调整资源配额,Prometheus默认配置会占用较多内存
2.2 组件版本选择
| 组件 | 推荐版本 | 关键特性 |
|---|---|---|
| Prometheus | 2.37.x | 支持K8s服务发现优化 |
| Grafana | 9.3.x | 新版告警引擎 |
| kube-state-metrics | 2.6.x | 更完整的集群状态指标 |
选择这些版本主要基于:
- 与当前主流K8s版本的兼容性
- 关键漏洞修复情况
- 新功能稳定性验证
3. Helm部署实战流程
3.1 添加官方Chart仓库
bash复制helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
3.2 Prometheus定制化安装
创建values-custom.yaml配置文件:
yaml复制alertmanager:
enabled: false # 初次部署可先关闭告警组件
prometheus:
prometheusSpec:
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: "standard"
resources:
requests:
storage: 20Gi
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
memory: 4Gi
nodeExporter:
hostRootFsMount: false # 避免安全策略冲突
执行安装命令:
bash复制helm install prometheus prometheus-community/prometheus \
-n monitoring --create-namespace \
-f values-custom.yaml
3.3 Grafana配置优化
grafana-values.yaml关键配置:
yaml复制adminUser: "admin"
adminPassword: "StrongPassword@123"
persistence:
enabled: true
storageClassName: "standard"
size: 5Gi
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server.monitoring.svc.cluster.local
access: proxy
isDefault: true
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboards/default
dashboards:
default:
k8s-cluster:
gnetId: 315
revision: 1
datasource: Prometheus
安装命令:
bash复制helm install grafana grafana/grafana \
-n monitoring \
-f grafana-values.yaml
4. 关键配置解析
4.1 存储持久化方案
生产环境必须配置的持久化参数:
yaml复制prometheus:
prometheusSpec:
retention: 15d # 数据保留周期
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi # 根据指标量调整
4.2 资源限制调优
典型内存问题排查经验:
- Prometheus Pod频繁OOM时:
- 增加
--storage.tsdb.retention.size限制TSDB大小 - 调整
scrape_interval减少采集频率
- 增加
- Grafana加载仪表板超时:
- 增加JVM堆内存:
GF_DATABASE_MAX_IDLE_CONN=50
- 增加JVM堆内存:
4.3 网络访问控制
Ingress配置示例(Nginx为例):
yaml复制ingress:
enabled: true
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: grafana-basic-auth
hosts:
- grafana.example.com
tls:
- secretName: grafana-tls
hosts:
- grafana.example.com
5. 运维监控实战技巧
5.1 必备仪表板导入
通过ConfigMap预置常用仪表板:
bash复制kubectl create configmap grafana-dashboards \
--from-file=dashboards/ \
-n monitoring
推荐安装的仪表板:
- Kubernetes Cluster (ID: 315)
- Node Exporter Full (ID: 1860)
- Prometheus 2.0 Stats (ID: 3662)
5.2 自定义指标采集
监控自定义应用的配置示例:
yaml复制extraScrapeConfigs: |
- job_name: 'custom-app'
metrics_path: '/metrics'
static_configs:
- targets: ['custom-app:8080']
relabel_configs:
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod
5.3 告警规则配置
alertmanager-values.yaml示例:
yaml复制config:
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
receiver: 'email-notice'
receivers:
- name: 'email-notice'
email_configs:
- to: 'team@example.com'
from: 'alert@grafana.local'
smarthost: 'smtp.example.com:587'
auth_username: 'user'
auth_password: 'pass'
6. 故障排查手册
6.1 常见问题速查表
| 现象 | 排查命令 | 解决方案 |
|---|---|---|
| Prometheus靶向丢失 | kubectl get ep -n monitoring |
检查ServiceSelector匹配 |
| Grafana无法加载数据源 | kubectl logs -f <grafana-pod> |
验证网络策略是否放行流量 |
| 仪表板显示"No Data" | curl http://prometheus:9090/targets |
检查采集目标状态 |
| 内存持续增长 | kubectl top pod -n monitoring |
调整资源限制和保留策略 |
6.2 性能优化参数
在values.yaml中增加这些参数可提升性能:
yaml复制prometheus:
prometheusSpec:
args:
- --storage.tsdb.retention.time=7d
- --storage.tsdb.wal-compression
- --web.enable-lifecycle
enableAdminAPI: false # 生产环境建议关闭
6.3 日志分析技巧
关键日志线索:
level=warn ts=... msg="Storage needs throttling"→ 增加存储IOPScontext deadline exceeded"→ 调整scrape_timeoutout of order sample→ 检查应用指标时间戳
7. 升级与维护策略
7.1 版本升级路径
安全升级步骤:
- 备份Grafana数据库和Prometheus数据卷
- 分阶段升级:先Prometheus后Grafana
- 验证各组件API兼容性:
bash复制
curl -s http://prometheus:9090/api/v1/status/buildinfo | jq
7.2 数据迁移方案
当需要更换存储时:
bash复制# 1. 将现有PVC挂载到临时Pod
# 2. 使用rsync迁移数据
kubectl cp monitoring/prometheus-server:/data /backup/prometheus
# 3. 在新PVC创建后反向操作
7.3 监控数据备份
推荐备份策略:
- Prometheus: 每日快照 + 每周全量S3备份
- Grafana: 定期导出JSON格式仪表板
- 使用krew插件grafana-backup简化流程
这套监控系统在多个生产集群的实践表明,合理的资源配置加上持续的优化调整,可以稳定支撑日均百万级指标的采集和展示需求。建议每季度进行一次配置审计,及时清理过期指标和无效告警规则。