云原生里的资源监控系统 Prometheus
Zhongjun Qiu 元婴开发者

讲解了K8S集群中资源监控系统Prometheus的原理和部署方法。

Prometheus资源监控

节点资源监控

节点资源主要包括 CPU 使用率、CPU 核心数、内存使用量和总量、磁盘使用量和 I/O、网络流量以及节点状态(Ready/NotReady)。 Prometheus 主要通过 node_exporter 采集操作系统层面的指标,通过 Kubelet 的 /metrics/cadvisor/metrics/resource 提供节点级别的 CPU、内存、Pod 等信息。

常用 Prometheus 查询示例:

  • node_cpu_seconds_total{mode="idle"}查询 CPU 空闲时间
  • node_memory_MemAvailable_bytes查询可用内存
  • node_filesystem_avail_bytes查询磁盘可用空间

Pod / 容器资源监控

Pod 和容器资源包括 CPU/内存使用率、容器重启次数、容器状态(Running/CrashLoopBackOff)以及容器内磁盘和网络 I/O。 采集来源主要是 Kubelet 内置的 cAdvisor,以及 kube-state-metrics 提供 Pod 和容器的状态信息(不提供实时使用率)。

常用 Prometheus 查询示例:

  • container_cpu_usage_seconds_total{pod="nginx"}查询容器 CPU 使用
  • container_memory_usage_bytes{pod="nginx"}查询容器内存使用
  • kube_pod_container_status_restarts_total查询容器重启次数

Kubernetes 资源对象状态

关注 Pod、Deployment、DaemonSet、StatefulSet 的数量及状态,以及 ReplicaSet 副本数和 Service/Ingress 状态。 Prometheus 通过 kube-state-metrics 获取 Kubernetes API 对象状态,非常适合用于告警和指标统计。

常用 Prometheus 查询示例:

  • kube_deployment_status_replicas_available{deployment="nginx"}
  • kube_pod_status_phase{phase="Running"}

集群资源和调度

监控集群层面的资源包括节点负载、Pod 分布、调度失败事件和 PVC/Storage 使用情况。 数据来源主要是 kube-state-metrics、Kubelet 以及 cAdvisor。

常用 Prometheus 查询示例:

  • kube_node_status_capacity_cpu
  • kube_node_status_allocatable_memory_bytes
  • kube_persistentvolumeclaim_status_phase

应用层指标

应用层指标可选,用于监控具体业务性能,如数据库或 Web 服务性能。 常用方式是通过各类 Exporter 或自定义 metrics 提供指标,例如 MySQL exporter、NGINX exporter 等。

常用 Prometheus 查询示例:

  • mysql_global_status_threads_connected
  • nginx_http_requests_total

安装Prometheus

1
2
3
4
5
6
7
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

kubectl create namespace prometheus
helm install kube-prometheus \
prometheus-community/kube-prometheus-stack \
-n prometheus

安装成功后会有以下资源

image

alertmanager-operated

  • 类型:ClusterIP(Headless)
  • 作用:提供 Alertmanager 内部通信(例如集群模式下的节点发现),Prometheus 可以通过它发送告警。

kube-prometheus-grafana

  • 类型:NodePort
  • 作用:外部访问 Grafana 的入口,映射了集群外端口(如 32117)到 Pod 内部端口 80。

kube-prometheus-kube-prome-alertmanager

  • 类型:ClusterIP
  • 作用:Prometheus 用来发送告警的服务入口。

kube-prometheus-kube-prome-operator

  • 类型:ClusterIP
  • 作用:Prometheus Operator 对外提供的 API 接口,用于管理 Prometheus、Alertmanager、ServiceMonitor 等资源。

kube-prometheus-kube-prome-prometheus

  • 类型:ClusterIP
  • 作用:Prometheus 对外的访问入口,抓取指标时可以用它的 IP/Service Name。

kube-prometheus-kube-state-metrics

  • 类型:ClusterIP
  • 作用:暴露 kube-state-metrics 采集的 Kubernetes 状态指标给 Prometheus 抓取。

kube-prometheus-prometheus-node-exporter

  • 类型:ClusterIP
  • 作用:暴露 node-exporter 指标给 Prometheus 抓取。

prometheus-operated

  • 类型:ClusterIP(Headless)
  • 作用:Prometheus StatefulSet 内部访问和服务发现用,不对外提供单独访问。

image

alertmanager-kube-prometheus-kube-prome-alertmanager-0

  • 作用:运行 Alertmanager,负责接收 Prometheus 的告警(alerts),并按规则发送通知(邮件、Slack、Webhook 等)。
  • 特点:通常 StatefulSet 部署,有持久化存储,保证告警状态不会丢失。

kube-prometheus-grafana-ccf7c8676-hq2ln

  • 作用:运行 Grafana,用于可视化展示 Prometheus 收集的数据。
  • 特点:提供 Dashboard,可自定义图表和告警,可通过 NodePort 暴露访问。

kube-prometheus-kube-prome-operator-5d598c7448-7zp4f

  • 作用:Prometheus Operator,负责在 Kubernetes 上管理 Prometheus、Alertmanager 和相关 CRD(Custom Resource)对象。
  • 特点:通过 Operator,创建 Prometheus 实例、规则、告警等,都可以 declarative(声明式)管理。

kube-prometheus-kube-state-metrics-56c6895446-dfvr5

  • 作用:kube-state-metrics,从 Kubernetes API Server 获取集群状态信息(Pod、Deployment、Node、Namespace 等),并以 Prometheus 指标形式暴露。
  • 特点:它不采集系统指标,只采集 Kubernetes 对象状态。

kube-prometheus-prometheus-node-exporter-5g94w / 7hpfr / w7qkj

  • 作用:node-exporter,运行在每个节点上,采集节点级别的系统指标(CPU、内存、磁盘、网络等)。
  • 特点:DaemonSet 部署,确保每个节点都有一个 Pod。

prometheus-kube-prometheus-kube-prome-prometheus-0

  • 作用:运行 Prometheus 实例,负责抓取各种指标数据(node-exporter、kube-state-metrics、应用指标等)并存储。
  • 特点:StatefulSet 部署,支持持久化存储,保证指标数据不会丢失。

同样要在外部浏览器访问kube-prometheus-grafana这个svc,需要将其类型改为NodePort或者给它加一个ingress暴露服务

获取密码:将对应字段用base64解码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# kl get secret -n prometheus kube-prometheus-grafana -o yaml                                         
apiVersion: v1
data:
admin-password: cHJvbS1vcGVyYXRvcg==
admin-user: YWRtaW4=
ldap-toml: ""
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: kube-prometheus
meta.helm.sh/release-namespace: prometheus
creationTimestamp: "2025-08-28T08:02:41Z"
labels:
app.kubernetes.io/instance: kube-prometheus
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: grafana
app.kubernetes.io/version: 12.1.0
helm.sh/chart: grafana-9.3.6
name: kube-prometheus-grafana
namespace: prometheus
resourceVersion: "607110"
uid: bb8fef01-120f-4671-9811-9d8b34b13d3a
type: Opaque

最终,在浏览器访问可以查看资源使用,Explorer里已经内置很多资源模版。

image

 REWARD AUTHOR
 Comments
Comment plugin failed to load
Loading comment plugin