3. Prometheus 与 Grafana 监控栈部署:Helm 安装 Prometheus Stack、配置 ServiceMonitor、数据采集验证

在云原生成本分摊模型中,资源用量数据是成本分摊的核心依据。Prometheus 作为云原生生态的标准监控工具,负责采集节点、Pod、容器的 CPU/内存/网络等指标;Grafana 则提供可视化面板,用于验证数据准确性与完整性。本章将使用 Helm 一键部署 Prometheus Stack(含 AlertManager、Node Exporter、kube-state-metrics),并配置 ServiceMonitor 实现自动发现与采集,最终通过 Grafana 验证数据链路。

3.1 部署架构概览

下图展示了 Prometheus Stack 在 Kubernetes 集群中的核心组件与数据流向:

Prometheus Stack 部署架构与数据采集流向 Prometheus Stack 部署架构与数据采集流向 Kubernetes Cluster Node Exporter DaemonSet 节点 CPU / 内存 / 网络 每节点 1 个 Pod kube-state-metrics Deployment Pod / Deployment / Service 资源请求与限制 Prometheus Server StatefulSet 指标存储 + 查询 ServiceMonitor 发现 /metrics /metrics Grafana 数据源 → Prometheus PromQL 查询 核心采集链路:Node Exporter / kube-state-metrics 暴露 /metrics → Prometheus 拉取 → Grafana 可视化
关键组件说明:
  • Node Exporter:以 DaemonSet 方式部署,每节点一个 Pod,采集节点级 CPU、内存、磁盘、网络指标。
  • kube-state-metrics:监听 Kubernetes API,生成 Pod、Deployment、Namespace 等资源对象的元数据指标(如 kube_pod_container_resource_requests)。
  • Prometheus Server:通过 ServiceMonitor 自动发现目标,拉取指标并存储,提供 PromQL 查询接口。
  • Grafana:对接 Prometheus 数据源,用于成本分摊数据的可视化验证。

3.2 使用 Helm 安装 Prometheus Stack

Prometheus Stack 由 prometheus-community/kube-prometheus-stack Chart 提供,包含 Prometheus、AlertManager、Grafana、Node Exporter、kube-state-metrics 等组件。推荐使用 Helm 3 进行安装。

3.2.1 添加 Helm 仓库并更新

# 添加 prometheus-community 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 更新本地仓库索引
helm repo update

3.2.2 创建命名空间与配置文件

# 创建专用命名空间
kubectl create namespace monitoring

# 创建自定义 values 文件(prometheus-stack-values.yaml)
cat << 'EOF' > prometheus-stack-values.yaml
# 全局配置
global:
  scrapeInterval: 30s
  evaluationInterval: 30s

# Prometheus 配置
prometheus:
  prometheusSpec:
    serviceMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelector: {}
    resources:
      requests:
        memory: 2Gi
        cpu: 500m
      limits:
        memory: 4Gi
        cpu: 1000m
    retention: 7d
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 50Gi

# Grafana 配置
grafana:
  adminPassword: "admin123"
  service:
    type: NodePort
    nodePort: 30300
  persistence:
    enabled: true
    size: 10Gi
  datasources:
    datasources.yaml:
      apiVersion: 1
      datasources:
      - name: Prometheus
        type: prometheus
        url: http://prometheus-operated:9090
        access: proxy
        isDefault: true

# Node Exporter 配置
nodeExporter:
  enabled: true
  serviceMonitor:
    enabled: true

# kube-state-metrics 配置
kubeStateMetrics:
  enabled: true
  serviceMonitor:
    enabled: true
EOF
配置要点:
  • serviceMonitorSelectorNilUsesHelmValues: false 允许 Prometheus 发现所有命名空间下的 ServiceMonitor,而非仅限 Helm 标签。
  • retention: 7d 设置指标保留 7 天,成本分摊场景建议至少保留 7 天用于月度聚合。
  • Grafana 使用 NodePort 30300 暴露,便于浏览器直接访问验证。

3.2.3 执行 Helm 安装

# 安装 kube-prometheus-stack
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --values prometheus-stack-values.yaml \
  --timeout 10m

# 验证安装状态
helm list -n monitoring
kubectl get pods -n monitoring -w

安装完成后,应看到如下 Pod 状态:

Pod 名称 组件 预期副本数 状态
prometheus-stack-prometheus-0 Prometheus Server 1 Running
prometheus-stack-grafana-xxxxx Grafana 1 Running
prometheus-stack-kube-state-metrics-xxxxx kube-state-metrics 1 Running
prometheus-stack-prometheus-node-exporter-xxxxx Node Exporter 集群节点数 Running
prometheus-stack-alertmanager-0 AlertManager 1 Running

3.3 配置 ServiceMonitor 实现自动发现

ServiceMonitor 是 Prometheus Operator 的自定义资源,用于声明式定义 Prometheus 的抓取目标。在成本分摊场景中,我们需要为业务命名空间下的 Pod 创建 ServiceMonitor,以便采集容器级资源指标。

3.3.1 ServiceMonitor 工作原理

ServiceMonitor 自动发现与指标采集流程 ServiceMonitor 自动发现与指标采集流程 业务 Pod 容器: app=nginx 端口: 80 /metrics Service selector: app=nginx port: 80 → 80 ServiceMonitor namespaceSelector: any endpoints: port: 80 Prometheus Server 自动发现目标 ServiceMonitor 通过 label selector 匹配 Service,Prometheus 自动拉取匹配到的 Pod 的 /metrics 端点

3.3.2 创建业务命名空间下的 ServiceMonitor

假设业务 Pod 部署在 production 命名空间,且已暴露 /metrics 端点。创建 ServiceMonitor 示例:

# service-monitor-cost.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: cost-app-monitor
  namespace: production
  labels:
    release: prometheus-stack   # 必须与 Helm release 名称匹配
spec:
  selector:
    matchLabels:
      app: cost-app             # 匹配业务 Service 的 label
  endpoints:
  - port: metrics               # Service 中定义的端口名称
    interval: 30s
    path: /metrics
  namespaceSelector:
    any: true                   # 允许跨命名空间发现
# 应用 ServiceMonitor
kubectl apply -f service-monitor-cost.yaml

# 验证 ServiceMonitor 是否被 Prometheus 发现
kubectl get servicemonitor -n production
常见问题:
  • ServiceMonitor 的 labels 必须包含 release: prometheus-stack,否则 Prometheus 无法自动发现(取决于 values 中 serviceMonitorSelector 配置)。
  • 确保业务 Service 的 spec.ports.name 与 ServiceMonitor 中 endpoints.port 一致。
  • 如果业务 Pod 未暴露 /metrics 端点,需要先注入 Prometheus 客户端库(如 prometheus-client)或使用 kubelet 的 cAdvisor 指标。

3.4 数据采集验证

部署完成后,通过 Grafana 和 Prometheus 原生 UI 验证数据采集是否正常。

3.4.1 访问 Grafana 验证

# 获取 Grafana NodePort 地址
kubectl get svc -n monitoring prometheus-stack-grafana -o jsonpath='{.spec.ports[0].nodePort}'
# 输出示例:30300

# 浏览器访问:http://<任意节点IP>:30300
# 默认账号:admin / admin123(由 values 配置)

登录后,进入 Explore 页面,执行以下 PromQL 查询验证数据:

验证目标 PromQL 查询 预期结果
节点 CPU 使用率 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) 返回每个节点的 CPU 使用百分比
Pod 内存使用量 container_memory_usage_bytes{namespace="production"} 返回 production 命名空间下各 Pod 的内存使用字节数
Pod CPU 使用量 rate(container_cpu_usage_seconds_total{namespace="production"}[5m]) 返回 CPU 使用率(核秒/秒)
资源请求量 kube_pod_container_resource_requests{resource="cpu", namespace="production"} 返回 Pod 声明的 CPU 请求量(核)

3.4.2 使用 Prometheus 原生 UI 验证

# 端口转发 Prometheus
kubectl port-forward -n monitoring prometheus-stack-prometheus-0 9090:9090

# 浏览器访问:http://localhost:9090

在 Prometheus UI 的 Status → Targets 页面,检查所有目标是否为 UP 状态:

  • node-exporter:每个节点一个目标,状态应为 UP。
  • kube-state-metrics:1 个目标,状态应为 UP。
  • 自定义 ServiceMonitor:业务 Pod 对应的目标,状态应为 UP。
数据采集验证清单:
  1. 确认 Prometheus Targets 页面所有目标为 UP。
  2. 在 Grafana Explore 中执行 up{job="node-exporter"},返回节点数量。
  3. 执行 count by (namespace) (kube_pod_info),确认所有命名空间的 Pod 数量正确。
  4. 执行 container_memory_usage_bytes{namespace="production"},确认业务 Pod 的内存数据非空。

3.5 本章小结

通过 Helm 安装 Prometheus Stack,我们快速搭建了完整的监控基础设施。ServiceMonitor 的配置实现了对业务 Pod 指标的自动发现,为后续成本分摊模型提供了节点级和容器级的资源用量数据。数据采集验证环节确保了 Prometheus 能够正确拉取 CPU、内存等关键指标,为第 4 章的“资源画像生成”奠定了可靠的数据基础。