在 Kubernetes 集群监控体系中,节点与容器的监控是基础且关键的环节。本文将详细解析四类核心监控组件(node-exporter、cAdvisor、kube-state-metrics、metrics-server)的功能、暴露方式、采集逻辑及指标特点,帮助读者构建完整的集群监控认知。
1 node-exporter:节点级硬件与系统指标暴露工具
核心功能
node-exporter 是 Prometheus 官方提供的节点级监控代理,专注于收集节点底层硬件(CPU、内存、磁盘、网络适配器等)和操作系统(进程、文件系统、负载等)的指标,是监控节点健康状态的核心组件。
暴露方式
默认端口:9100(HTTP 协议,非加密,可通过 --web.listen-address 自定义)
部署方式
通常以 DaemonSet 形式在每个节点部署,确保所有节点均被覆盖。
采集方式
静态配置:适用于小规模集群,直接在 Prometheus 配置中指定节点 IP:9100(如 targets: ["node-1:9100", "node-2:9100"])。
动态发现(推荐):
通过 Kubernetes ServiceDiscovery(kubernetes_sd_configs)自动发现节点,结合 API Server 代理访问:
# 定义监控任务名称,这里针对生产环境的 shimo 节点
- job_name: k8s1-node-exporter
# 采集指标使用的协议(HTTPS)
scheme: https
# TLS 配置
tls_config:
# 跳过 TLS 证书验证(生产环境不建议,这里可能是临时配置)
insecure_skip_verify: true
# 用于访问 Kubernetes API 的 Bearer Token 文件路径
bearer_token_file: /k8s/k8s1-token
# Kubernetes 服务发现配置(自动发现集群内的资源)
kubernetes_sd_configs:
- role: node # 服务发现的角色为 "节点(Node)",即发现集群中的所有节点
api_server: "https://xx.xx.xx.xx:6443" # Kubernetes API Server 的地址和端口
tls_config: # 访问 API Server 的 TLS 配置
insecure_skip_verify: true # 跳过 API Server 的 TLS 证书验证
bearer_token_file: /k8s/k8s1-token # 访问 API Server 的 Token 文件(与上面一致,可复用)
# 标签重写配置(对自动发现的目标进行标签处理)
relabel_configs:
# 1. 从节点标签中提取操作系统信息,将其映射为 "cluster" 标签,值固定为 "shimo-prod"
- source_labels: [__meta_kubernetes_node_label_beta_kubernetes_io_os] # 源标签:节点的操作系统标签
regex: (.+) # 匹配任意值(捕获分组,用于替换)
target_label: cluster # 目标标签:自定义 "cluster" 标签
replacement: shimo-prod # 标签值固定为 "shimo-prod"(忽略源标签实际值)
# 2. 将节点的内部 IP 元标签重命名为更简洁的标签
- action: labelmap # 动作:标签映射(根据正则替换标签名)
regex: (__meta_kubernetes_node_name) # 匹配节点名称的元标签(原标签名)
replacement: node_name # 替换后的标签名(例如将 __meta_kubernetes_node_name 改为 node_name)
# 3. 将节点的所有标签(以 __meta_kubernetes_node_label_ 为前缀的元标签)映射为普通标签
- action: labelmap # 动作:标签映射
regex: __meta_kubernetes_node_label_(.+) # 匹配节点标签的元标签(捕获标签名后缀)
# 替换规则:默认将 __meta_kubernetes_node_label_xxx 转换为 xxx(例如节点标签 app=web 会转为 app=web)
# 4. 重写目标地址为 Kubernetes API Server 的地址(因为节点 metrics 需通过 API Server 代理访问)
- target_label: __address__ # 目标标签:Prometheus 用于连接的地址(内部标签)
replacement: xx.xx.xx.xx:6443 # 替换为 API Server 的地址,所有请求都发往这里
# 5. 构造访问节点 metrics 的路径(通过 API Server 代理)
- source_labels: [__meta_kubernetes_node_name] # 源标签:节点名称的元标签
regex: (.+) # 捕获节点名称(例如 node-1)
target_label: __metrics_path__ # 目标标签:Prometheus 采集指标的路径(内部标签)
replacement: /api/v1/nodes/${1}:9100/proxy/metrics # 替换为代理路径,${1} 引用节点名称(例如 /api/v1/nodes/node-1:9100/proxy/metrics)
核心指标示例
- node_cpu_seconds_total(CPU 时间分布)
- node_memory_MemTotal_bytes(总内存)
- node_disk_io_time_seconds_total(磁盘 I/O 时间)
- node_load1(1分钟负载)
- node_filesystem_free_bytes(文件系统空闲空间)
- node_network_transmit_bytes_total(网络发送字节数)
2 cAdvisor:容器级资源监控组件(Kubelet 内置)
核心功能
cAdvisor(Container Advisor)是 Google 开源的容器监控工具,内置于 Kubelet 组件中,负责实时收集节点上所有容器(包括 Docker、containerd 等运行时)的资源使用情况,是容器粒度监控的基础。
暴露方式
依赖端口:复用 Kubelet 的安全端口 10250(HTTPS 协议,默认启用 TLS 认证)
指标路径:/metrics/cadvisor(需通过 Kubelet 代理访问,例如 https://:10250/metrics/cadvisor)
特点
无需单独部署,随 Kubelet 启动自动运行,覆盖节点上所有容器。
采集方式
必须通过 Kubernetes API Server 代理访问(因 10250 端口通常限制直接外部访问),配置示例:
job_name: 'k8s1-pods-cadvisor'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /k8s/k8s1-token
kubernetes_sd_configs:
- role: node
api_server: "https://xx.xx.xx.xx"
tls_config:
insecure_skip_verify: true
bearer_token_file: /k8s/k8s1-token
relabel_configs:
- source_labels: [__meta_kubernetes_node_label_beta_kubernetes_io_os]
regex: (.+)
target_label: cluster
replacement: teable
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: xx.xx.xx.xx:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}:10250/proxy/metrics/cadvisor
核心指标示例
- container_cpu_usage_seconds_total(容器 CPU 累计使用时间)
- container_memory_usage_bytes(容器内存使用量)
- container_start_time_seconds(容器启动时间)
- container_restarts_total(容器重启次数)。
3 kube-state-metrics:Kubernetes 资源对象状态指标生成器
核心功能
kube-state-metrics 是一个独立部署的服务,通过监听 Kubernetes API Server,将集群中资源对象(Pod、Deployment、Service、Node 等)的状态信息转换为 Prometheus 可识别的指标,专注于“对象状态”而非“资源使用率”。
暴露方式
默认端口 8080(HTTP 协议,指标路径 /metrics)
部署方式
通常以 Deployment 形式部署,通过 Service 暴露(例如 kube-state-metrics:8080)。。
采集方式
直接配置 Prometheus 静态目标或通过 Service 自动发现:
job_name: kube-state-metrics
static_configs:
- targets: ["kube-state-metrics.kube-system:8080"] # 指向服务地址
核心指标示例
- kube_pod_status_phase(Pod 状态,如 Running/Pending/Failed)
- kube_pod_container_status_ready(容器就绪状态)。
- kube_deployment_status_replicas_ready(Deployment 就绪副本数)
- kube_statefulset_status_rplicas(StatefulSet 当前副本数)。
- Node 状态:kube_node_status_condition(Node 条件,如 Ready/DiskPressure)。
4 metrics-server:集群核心指标聚合器(HPA 依赖)
核心功能
metrics-server 是 Kubernetes 官方的核心指标聚合器,专注于收集节点和 Pod 的核心资源指标(CPU/内存使用率),并通过 Metrics API(metrics.k8s.io)提供给集群组件(如 HPA、kubectl top 等)使用。
特点
轻量级设计,不存储历史数据,仅提供实时指标查询,是 HPA(Horizontal Pod Autoscaler)实现自动扩缩容的核心依赖。
通过 Kubelet 的 10250 端口采集节点和 Pod 的核心指标(复用 cAdvisor 数据但仅保留 CPU/内存)。
部署与访问
-
部署:通过 Deployment 部署,需配置 RBAC 权限以访问 Kubelet 和 API Server。
-
访问:集群内通过 kubectl top node 或 kubectl top pod 查看,或通过 Metrics API 调用(如 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes")。
核心指标示例
-
node_cpu_usage(节点 CPU 使用率)
-
node_memory_usage(节点内存使用率)。
-
pod_cpu_usage(Pod 总 CPU 使用率)
-
container_memory_usage(容器内存使用率)。
说明
metrics-server 的本质是 “指标聚合器”:它只是从 cadvisor 抓取原始指标,计算出 “CPU / 内存使用率” 后,通过 metrics.k8s.io API 暴露给 kubectl top 和 HPA。
- 已通过 cadvisor(Kubelet 内置组件)抓取各集群 Node/Pod 的 CPU / 内存等原始指标,通过 kube-state-metrics 补充资源状态指标,可完全覆盖 metrics-server 的核心数据;
- 若需支持 kubectl top 或 HPA,部署 Prometheus Adapter 并配置指标映射规则,即可将 Prometheus 指标转换为 K8s 原生 metrics.k8s.io API,替代 metrics-server 功能。
5 其他数据来源
在 Kubernetes 监控体系中,除了 node-exporter、cAdvisor、kube-state-metrics、metrics-server 这四个核心组件,还有许多其他关键的数据来源,覆盖集群组件、应用程序、网络、存储等多个维度。以下是常见的补充数据来源及其作用:
5.1 Kubernetes 核心组件指标
API Server 指标
来源:Kubernetes API Server 自身暴露的指标(默认端口 6443,路径 /metrics)。
内容:API 请求量(apiserver_request_total)、请求延迟(apiserver_request_latencies_seconds)、etcd 交互状态、认证授权成功率等。
用途:监控 API Server 性能瓶颈、请求拥堵、高可用状态等。
etcd 指标
来源:etcd 数据库自身暴露的指标(默认端口 2379,路径 /metrics)。
内容:集群健康状态(etcd_server_health)、数据同步延迟(etcd_network_peer_round_trip_time_seconds)、磁盘写入性能(etcd_disk_wal_fsync_duration_seconds)等。
用途:确保 etcd 集群(集群数据的唯一存储)的稳定性,预防数据丢失或性能退化。
Controller Manager 与 Scheduler 指标
来源:Kubernetes 控制器管理器(默认端口 10257)和调度器(默认端口 10259)的 /metrics 路径。
内容:控制器(如 Deployment、StatefulSet 控制器)的同步成功率(controller_runtime_reconcile_total)、调度器绑定延迟(scheduler_scheduling_algorithm_duration_seconds)等。
用途:监控控制平面核心组件的运行状态,排查调度失败或控制器异常问题。
5.2 网络监控数据来源
kube-proxy 指标
来源:每个节点上的 kube-proxy 组件(默认端口 10249,路径 /metrics)。
内容:Service 转发规则数量(kube_proxy_sync_proxy_rules_endpoints_total)、IPVS/iptables 规则同步状态、连接跟踪统计等。
用途:排查 Service 访问异常、网络转发性能问题。
CNI 插件指标
如 Nginx-Ingress
5.3 存储监控数据来源
CSI 驱动指标
来源:容器存储接口(CSI)驱动(如 Rook、AWS EBS CSI、Azure Disk CSI 等)暴露的指标(通常通过 csi-metrics 端口)。
内容:卷挂载成功率(csi_volume_operation_total)、存储操作延迟(csi_operation_duration_seconds)、存储后端健康状态等。
用途:监控持久化存储(PVC/PV)的创建、挂载、扩容等操作的稳定性。
本地存储指标
来源:节点本地磁盘(通过 node-exporter 扩展采集)或存储监控工具(如 smartctl-exporter 监控磁盘 SMART 信息)。
内容:磁盘坏道计数、IOPS 使用率、文件系统 inode 使用率等。
用途:预防节点本地存储故障(如磁盘损坏导致 Pod 异常)。
5.4 应用程序自定义指标
应用内置 Prometheus 指标
来源:应用程序自身集成 Prometheus Client 库(如 Go 语言的 prometheus/client_golang),通过 HTTP 端口(如 8080)暴露 /metrics 路径。
内容:业务指标(如订单量、接口调用成功率)、应用内部状态(如缓存命中率、连接池大小)等。
用途:实现业务监控与技术监控的联动(例如根据“支付失败率”触发告警)。
5.5 日志与事件数据
Kubernetes Events
来源:集群事件(如 Pod 调度失败、节点资源不足),可通过 kube-state-metrics 或直接监听 API Server 的 events 资源获取。
内容:事件类型(Warning/Normal)、涉及资源(Pod/Node)、事件原因(如 FailedScheduling)等。
用途:实时捕捉集群异常事件(如调度失败、容器崩溃),辅助故障定位。
容器日志
来源:通过日志采集工具(如 Fluentd、Fluent Bit)收集容器 stdout/stderr 日志,或应用输出的日志文件。
内容:应用运行日志、错误堆栈、业务日志等。
用途:结合指标进行问题根因分析(例如通过错误日志关联指标中的“请求失败率突增”)。
评论区