基于 Prometheus 生态的 Kubernetes 全栈监控实战指南
在容器化时代,Kubernetes 已成为云原生应用的事实标准。然而,随着集群规模的扩大和微服务架构的普及,如何有效监控集群健康状态、快速定位问题,成为每个运维工程师必须面对的挑战。本文将详细介绍一套完整的 Kubernetes 监控解决方案,基于 Prometheus 生态构建,涵盖从架构设计到生产部署的全流程实践。
一、为什么需要专门的 K8s 监控方案
1.1 传统监控的局限性
传统的服务器监控工具(如 Zabbix、Nagios)主要针对物理机或虚拟机设计,在容器化环境下面临诸多挑战:
- 动态性:Pod 生命周期短暂,IP 地址频繁变化
- 多维度:需要同时监控节点、容器、应用三层指标
- 复杂性:服务间调用关系复杂,故障定位困难
1.2 Prometheus 的优势
Prometheus 作为云原生监控的事实标准,具备以下核心优势:
| 特性 | 说明 |
|---|---|
| 多维数据模型 | 支持标签(Label)体系,灵活的数据查询 |
| 服务发现 | 自动发现 Kubernetes 中的目标 |
| 拉取模式 | 更适合微服务架构,目标端无状态 |
| 强大的查询语言 | PromQL 支持复杂的数据聚合和分析 |
| 生态丰富 | Grafana、Alertmanager 等工具链完善 |
二、系统架构设计
2.1 整体架构概览
┌─────────────────────────────────────────────────────────────────┐
│ 监控架构概览 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Prometheus │◄───│ Alertmanager│◄───│ Grafana │ │
│ │ (主存储) │ │ (告警管理) │ │ (可视化) │ │
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ┌────┴────┬─────────────┬─────────────┐ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ │
│ │Node │ │Kube-State│ │ cAdvisor │ │Pushgateway│ │
│ │Exporter│ │Metrics │ │ │ │ │ │
│ └────────┘ └────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ NFS 存储后端 │ │
│ │ (Prometheus/Alertmanager/Grafana 持久化数据) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
2.2 核心组件详解
Prometheus(时序数据库)
- 功能:指标采集、存储和查询
- 部署方式:StatefulSet,保证数据持久化
- 存储配置:20Gi NFS 持久化存储
- 端口:9090
Grafana(可视化平台)
- 功能:仪表盘展示、数据可视化
- 部署方式:StatefulSet
- 存储配置:5Gi NFS 持久化存储
- 访问方式:NodePort 31064
Alertmanager(告警管理)
- 功能:告警分组、抑制、路由和通知
- 部署方式:StatefulSet
- 存储配置:2Gi NFS 持久化存储
- 端口:9093
Node Exporter(节点指标采集)
- 功能:采集节点硬件和操作系统指标
- 部署方式:DaemonSet,每个节点运行一个实例
- 采集指标:CPU、内存、磁盘、网络、文件系统等
Kube State Metrics(K8s 状态指标)
- 功能:采集 Kubernetes 对象状态指标
- 部署方式:Deployment
- 采集对象:Pod、Deployment、Service、Node、PVC 等资源状态
cAdvisor(容器指标采集)
- 功能:容器资源使用和性能分析
- 部署方式:DaemonSet
- 采集指标:容器 CPU、内存、网络、文件系统 I/O
Pushgateway(短期任务指标推送)
- 功能:接收无法被 Prometheus 直接拉取指标的短期任务数据
- 部署方式:Deployment
- 存储配置:1Gi NFS 持久化存储
2.3 数据流转路径
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Exporters │────►│ Prometheus │────►│ Grafana │
│ (采集端) │ │ (存储分析) │ │ (可视化) │
└─────────────┘ └──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ Alertmanager│
│ (告警通知) │
└─────────────┘
三、部署实践
3.1 环境准备
前置条件
- Kubernetes 集群 v1.20+
- kubectl 客户端配置正确
- NFS 服务器(用于持久化存储)
- 至少 30Gi 可用存储空间
资源需求规划
| 组件 | CPU 请求 | 内存请求 | 存储 |
|---|---|---|---|
| Prometheus | 500m | 2Gi | 20Gi |
| Alertmanager | 100m | 256Mi | 2Gi |
| Grafana | 250m | 512Mi | 5Gi |
| Node Exporter | 100m | 128Mi | - |
| Kube State Metrics | 100m | 256Mi | - |
| cAdvisor | 150m | 200Mi | - |
| Pushgateway | 100m | 128Mi | 1Gi |
3.2 快速部署
步骤一:配置 NFS 存储
编辑 base/storage/nfs/nfs-config.yaml,配置 NFS 服务器地址:
yaml
nfs:
server: "10.100.100.129" # 替换为你的 NFS 服务器 IP
path: "/data/nfs" # NFS 共享路径
步骤二:一键部署
bash
# 克隆仓库
git clone https://github.com/your-org/k8s-monitoring.git
cd k8s-monitoring
# 执行部署脚本
./scripts/deploy-monitoring.sh deploy
部署脚本会自动完成以下操作:
- 创建 monitoring 命名空间
- 部署 NFS Provisioner
- 创建 StorageClass
- 部署所有监控组件
- 验证部署状态
步骤三:验证部署
bash
./scripts/deploy-monitoring.sh status
3.3 分步部署(可选)
如需更细粒度的控制,可以分步部署:
bash
# 1. 基础配置
kubectl apply -f base/namespace.yaml
kubectl apply -f base/rbac/
kubectl apply -f base/storage/nfs/
# 2. 部署采集器
kubectl apply -f components/node-exporter/
kubectl apply -f components/kube-state-metrics/
kubectl apply -f components/cadvisor/
# 3. 部署核心组件
kubectl apply -f components/prometheus/
kubectl apply -f components/alertmanager/
kubectl apply -f components/grafana/
kubectl apply -f components/pushgateway/
四、配置详解
4.1 Prometheus 核心配置
抓取配置(prometheus-configmap.yaml)
yaml
global:
scrape_interval: 15s # 默认抓取间隔
evaluation_interval: 15s # 规则评估间隔
scrape_configs:
# Prometheus 自身监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Kubernetes API Server
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
# Kubernetes 节点
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
# Kubernetes Pod 自动发现
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
存储配置
yaml
volumeClaimTemplates:
- metadata:
name: prometheus-storage
spec:
storageClassName: "nfs-client"
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
4.2 Grafana 数据源配置
yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
access: proxy
isDefault: true
4.3 告警规则配置示例
yaml
groups:
- name: kubernetes-alerts
rules:
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is above 85% (current value: {{ $value }}%)"
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Pod is crash looping"
description: "Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} is restarting frequently"
五、访问与使用
5.1 访问 Grafana
bash
# 方式一:通过 NodePort 访问
# 访问地址: http://<节点IP>:31064
# 默认账号: admin/admin
# 方式二:端口转发
kubectl port-forward -n monitoring svc/grafana 3000:3000
# 访问地址: http://localhost:3000
5.2 访问 Prometheus
bash
kubectl port-forward -n monitoring svc/prometheus 9090:9090
# 访问地址: http://localhost:9090
5.3 导入预置仪表盘
项目预置了两个常用仪表盘:
bash
# 自动导入
./scripts/grafana-dashboard-import.sh
| 仪表盘 | 用途 | 文件 |
|---|---|---|
| Node Exporter Full | 节点监控 | 1860_rev42.json |
| Kubernetes 集群监控 | 集群整体监控 | 15661_rev2.json |
六、故障排查指南
6.1 Pod 无法启动
排查步骤:
bash
# 查看 Pod 状态
kubectl get pods -n monitoring
# 查看 Pod 事件
kubectl describe pod -n monitoring <pod-name>
# 查看容器日志
kubectl logs -n monitoring <pod-name>
# 查看之前的容器日志(适用于重启的 Pod)
kubectl logs -n monitoring <pod-name> --previous
常见原因:
- 镜像拉取失败:检查镜像地址和仓库访问
- 资源不足:检查节点资源使用情况
- 配置错误:检查 ConfigMap 和 Secret
- 权限问题:检查 RBAC 配置
6.2 PVC 无法绑定
排查步骤:
bash
# 查看 PVC 状态
kubectl get pvc -n monitoring
# 查看 PV 状态
kubectl get pv
# 查看 StorageClass
kubectl get storageclass
# 查看 NFS Provisioner 日志
kubectl logs -n monitoring -l app=nfs-client-provisioner
解决方案:
bash
# 重新部署 NFS Provisioner
./scripts/nfs-storage-manager.sh rebuild
# 手动创建 PV
kubectl apply -f base/storage/clean-pv.yaml
6.3 指标数据为空
排查步骤:
bash
# 端口转发到 Prometheus
kubectl port-forward -n monitoring svc/prometheus 9090:9090
# 访问 Status -> Targets 页面
# http://localhost:9090/targets
# 检查特定 target 的日志
kubectl logs -n monitoring <exporter-pod>
# 测试指标端点
curl http://<pod-ip>:<port>/metrics
6.4 常用调试命令速查
bash
# 查看所有资源
kubectl get all -n monitoring
# 查看事件
kubectl get events -n monitoring --sort-by='.lastTimestamp'
# 进入 Pod 调试
kubectl exec -it -n monitoring <pod-name> -- /bin/sh
# 查看资源详情
kubectl describe <resource> -n monitoring <name>
# 查看日志
kubectl logs -n monitoring <pod-name> -f
七、生产环境建议
7.1 高可用扩展
当前架构为单实例部署,适合中小规模集群。如需高可用,可考虑以下扩展方案:
| 组件 | 扩展方案 |
|---|---|
| Prometheus | 通过 Thanos 或 Cortex 实现高可用和长期存储 |
| Grafana | 配置多副本 + 共享存储 |
| Alertmanager | 配置集群模式 |
7.2 性能优化
Prometheus 内存优化
bash
# 减少采集目标
# 编辑 prometheus-configmap.yaml,增加 metric_relabel_configs 过滤
# 缩短数据保留时间
# 修改 prometheus-statefulset.yaml,添加 --storage.tsdb.retention.time=7d
存储扩容
yaml
# 修改 volumeClaimTemplates 中的 storage 值
volumeClaimTemplates:
- metadata:
name: prometheus-storage
spec:
resources:
requests:
storage: 50Gi # 扩展存储大小
7.3 安全加固
启用网络策略
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: prometheus-network-policy
spec:
podSelector:
matchLabels:
app: prometheus
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 9090
八、总结
本文详细介绍了一套完整的 Kubernetes 监控解决方案,从架构设计、部署实践到故障排查,涵盖了生产环境中的核心场景。该方案具有以下特点:
- 组件完整:涵盖指标采集、存储、告警、可视化全流程
- 开箱即用:提供一键部署脚本和预置仪表盘
- 易于扩展:模块化设计,支持按需扩展
- 文档完善:包含详细的配置说明和故障排查指南
通过这套方案,你可以快速搭建起企业级的 Kubernetes 监控体系,实现对集群资源、应用性能的全面掌控。
参考资源
- 项目源码 :https://gitee.com/ceagle/k8s-monitoring
- Prometheus 官方文档 :https://prometheus.io/docs/
- Grafana 官方文档 :https://grafana.com/docs/
- Kubernetes 监控最佳实践 :https://kubernetes.io/docs/concepts/cluster-administration/monitoring/
标签:Kubernetes, Prometheus, Grafana, 云原生, 监控, DevOps, 容器化