Prometheus 监控 Kubernetes Cluster 最新极简教程大家好我是你们的技术博主。今天我们来聊聊一个运维和开发同学都绕不开的话题——如何用 Prometheus 监控 Kubernetes 集群。Kubernetes 的 Pod 像“打地鼠”一样动态伸缩传统监控工具如 Zabbix很难跟踪。而 Prometheus 天生适合云原生环境因为它是基于拉取Pull模型能自动发现目标配上 Grafana 还能画美美的仪表盘。本教程的目标让你从零搭建一个能监控 K8s 集群的 Prometheus 系统并理解核心原理。## 什么是 Prometheus 和 K8s 监控原理Prometheus 是一个开源的系统监控和告警工具包。它的核心思想是-数据采集通过 HTTP 端点/metrics周期性地拉取指标数据。-数据存储本地时序数据库支持多维数据模型指标名 标签。-查询语言PromQL用于聚合和分析数据。在 Kubernetes 中Prometheus 通过服务发现自动找到所有 Pod、Node、Service然后用 kube-state-metrics 和 node-exporter 等组件暴露指标。简单说就是让 K8s 里的每个组件都“开一个窗口”Prometheus 定期去“窗口”取数据。## 准备工作环境与工具你需要- 一个运行的 Kubernetes 集群Minikube 或云服务均可- kubectl 已配置- Helm可选但推荐用于快速部署先检查环境bashkubectl get nodes看到 Ready 状态就 OK。## 第一步部署 Prometheus StackHelm 一键安装最省事的方式是用kube-prometheus-stack它包含了 Prometheus、Alertmanager、Grafana 和一堆导出器。添加 Helm 仓库并安装bashhelm repo add prometheus-community https://prometheus-community.github.io/helm-chartshelm repo updatekubectl create namespace monitoringhelm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring等待 Pod 启动bashkubectl get pods -n monitoring看到类似prometheus-prometheus-0、alertmanager-prometheus-alertmanager-0、grafana-xxxx都处于 Running 状态说明部署成功。## 第二步访问 Prometheus UI将 Prometheus Server 端口转发到本地bashkubectl port-forward -n monitoring svc/prometheus-operated 9090:9090浏览器打开 http://localhost:9090 你会看到 Prometheus 的查询界面。## 第三步验证监控数据——用 PromQL 查一个指标在 Prometheus UI 的查询框中输入以下 PromQL点击 Executeup你会看到一堆up{job...}的结果值为 1 表示该目标正常运行。这是最常见的健康检查指标。再试试查询 CPU 使用率rate(container_cpu_usage_seconds_total{container!}[5m])这个查询会返回每个容器的 CPU 使用率5 分钟平均。## 代码示例 1自定义应用暴露 /metrics部署一个带 Prometheus 客户端库的 Python 应用。创建文件app.pypython# app.py - 一个简单的 Python HTTP 服务暴露 Prometheus 指标from prometheus_client import start_http_server, Counter, Gaugeimport timeimport random# 定义指标REQUEST_COUNT Counter(app_requests_total, Total number of requests, [method])RANDOM_GAUGE Gauge(app_random_value, A random gauge value)def process_request(): 模拟处理请求 REQUEST_COUNT.labels(methodGET).inc() # 增加计数器 RANDOM_GAUGE.set(random.uniform(0, 100)) # 设置随机值if __name__ __main__: # 启动 HTTP 服务器在 8000 端口暴露指标 start_http_server(8000) print(Metrics server started on :8000) while True: process_request() time.sleep(5)打包成 Docker 镜像Dockerfile 略然后部署到 K8syaml# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app annotations: prometheus.io/scrape: true # 告诉 Prometheus 自动抓取 prometheus.io/port: 8000 spec: containers: - name: app image: your-image:latest ports: - containerPort: 8000部署后Prometheus 会自动发现这个 Pod因为 annotation 配置并在/metrics端点采集app_requests_total和app_random_value指标。去 Prometheus UI 查询app_requests_total就能看到数据了。## 第四步配置 Grafana 仪表盘Grafana 默认已随 Stack 部署。端口转发bashkubectl port-forward -n monitoring svc/grafana 3000:80访问 http://localhost:3000 默认用户名admin密码从 Secret 获取bashkubectl get secret -n monitoring prometheus-grafana -o jsonpath{.data.admin-password} | base64 --decode登录后点击左侧“” → “Import”输入仪表盘 ID例如 315 是 Kubernetes 集群监控模板导入后就能看到集群节点、Pod 的 CPU/内存图表。## 代码示例 2编写 Prometheus 告警规则告警是监控的灵魂。我们写一个简单的规则当某个 Pod 持续 5 分钟 CPU 使用率超过 80% 时触发告警。创建一个 ConfigMap 来定义告警规则yaml# alert-rules.yamlapiVersion: v1kind: ConfigMapmetadata: name: prometheus-alert-rules namespace: monitoringdata: custom-rules.yaml: | groups: - name: custom.rules rules: - alert: HighCPUUsage expr: | rate(container_cpu_usage_seconds_total{container!}[5m]) 0.8 for: 5m labels: severity: warning annotations: summary: Pod {{ $labels.pod }} CPU usage high description: Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has been using 80% CPU for 5 minutes.然后挂载到 Prometheus 的配置中。由于我们用的是 Helm 部署最好通过 Helm 升级来添加规则这里简化演示手动修改 Prometheus CRD。在 kube-prometheus-stack 中可以用 PrometheusRule 资源yaml# prometheus-rule.yamlapiVersion: monitoring.coreos.com/v1kind: PrometheusRulemetadata: name: custom-rules namespace: monitoringspec: groups: - name: custom.rules rules: - alert: HighCPUUsage expr: | rate(container_cpu_usage_seconds_total{container!}[5m]) 0.8 for: 5m labels: severity: warning annotations: summary: Pod {{ $labels.pod }} CPU usage high应用bashkubectl apply -f prometheus-rule.yaml这样当 CPU 持续飙高时Alertmanager 会收到告警你可以配置它发送邮件或钉钉通知。## 常见问题与排查技巧1.指标抓取不到检查 Pod 的 annotation 是否正确或者用kubectl describe pod pod-name看是否有端口映射。2.Prometheus 重启数据可能丢失建议配置持久化存储PersistentVolume。3.Grafana 图表为空确认数据源是否指向正确的 Prometheus默认已经配置好。## 总结现在你已经掌握了用 Prometheus 监控 Kubernetes 集群的核心步骤1. 用 Helm 部署 kube-prometheus-stack快速获得完整监控栈。2. 理解 Prometheus 通过服务发现自动采集指标。3. 通过 PromQL 查询数据用 Grafana 可视化。4. 自定义应用暴露指标并编写告警规则。这套方案生产可用但实际生产环境还需要考虑高可用Prometheus 联邦集群、长期存储Thanos、权限控制RBAC等。不过对于学习和中小规模集群今天的教程足够你起飞了。最后监控不是目的问题发现和快速定位才是。希望本文能帮你构建起集群的“眼睛”让运维变得更轻松。如果遇到问题欢迎留言讨论。