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 集群中的核心组件与数据流向:
- 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 工作原理
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。
- 确认 Prometheus Targets 页面所有目标为 UP。
- 在 Grafana Explore 中执行
up{job="node-exporter"},返回节点数量。 - 执行
count by (namespace) (kube_pod_info),确认所有命名空间的 Pod 数量正确。 - 执行
container_memory_usage_bytes{namespace="production"},确认业务 Pod 的内存数据非空。
3.5 本章小结
通过 Helm 安装 Prometheus Stack,我们快速搭建了完整的监控基础设施。ServiceMonitor 的配置实现了对业务 Pod 指标的自动发现,为后续成本分摊模型提供了节点级和容器级的资源用量数据。数据采集验证环节确保了 Prometheus 能够正确拉取 CPU、内存等关键指标,为第 4 章的“资源画像生成”奠定了可靠的数据基础。