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 Stack(Helm 一键安装)最省事的方式是用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,点击 Execute:up你会看到一堆up{job="..."}的结果,值为 1 表示该目标正常运行。这是最常见的健康检查指标。再试试查询 CPU 使用率:rate(container_cpu_usage_seconds_total{container!=""}[5m])这个查询会返回每个容器的 CPU 使用率(5 分钟平均)。## 代码示例 1:自定义应用暴露 /metrics部署一个带 Prometheus 客户端库的 Python 应用。创建文件app.py:python# 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(method='GET').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 略),然后部署到 K8s:yaml# 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)等。不过对于学习和中小规模集群,今天的教程足够你起飞了。最后,监控不是目的,问题发现和快速定位才是。希望本文能帮你构建起集群的“眼睛”,让运维变得更轻松。如果遇到问题,欢迎留言讨论。