基于 Prometheus 生态的 Kubernetes 全栈监控实战指南

基于 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

部署脚本会自动完成以下操作:

  1. 创建 monitoring 命名空间
  2. 部署 NFS Provisioner
  3. 创建 StorageClass
  4. 部署所有监控组件
  5. 验证部署状态
步骤三:验证部署
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 监控解决方案,从架构设计、部署实践到故障排查,涵盖了生产环境中的核心场景。该方案具有以下特点:

  1. 组件完整:涵盖指标采集、存储、告警、可视化全流程
  2. 开箱即用:提供一键部署脚本和预置仪表盘
  3. 易于扩展:模块化设计,支持按需扩展
  4. 文档完善:包含详细的配置说明和故障排查指南

通过这套方案,你可以快速搭建起企业级的 Kubernetes 监控体系,实现对集群资源、应用性能的全面掌控。


参考资源


标签:Kubernetes, Prometheus, Grafana, 云原生, 监控, DevOps, 容器化

相关推荐
Mr.小海1 小时前
Docker 镜像分层机制:从原理到生产环境的深度实践
运维·docker·容器
Mr.小海2 小时前
Docker 数据卷挂载:从基础到生产的完整落地指南(含避坑实战)
运维·docker·容器
老实巴交的麻匪2 小时前
Exception异常架构设计:异常抛出(03)
运维·云原生·架构
蓝天星空2 小时前
软件架构风格-SOA与微服务的区别
微服务·云原生·架构
春日见3 小时前
如何查看我一共commit了多少个,是哪几个,如何回退到某一个版本
vscode·算法·docker·容器·自动驾驶
ubuntuMeta3 小时前
睡前讲一段docker编译镜像的故事
后端·docker·容器
无级程序员3 小时前
k8s 1.35 + containerd v2.2 配置http私库并配置登录信息
http·容器·kubernetes
灰子学技术3 小时前
istio从0到1:如何解决同一个应用不同功能的路由聚合问题
运维·服务器·网络·云原生·istio
懒鸟一枚3 小时前
k8s 之调度基础
云原生·容器·kubernetes