侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

prometheus监控k8s集群

路小飞
2025-11-05 / 0 评论 / 0 点赞 / 9 阅读 / 9960 字

在 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 日志,或应用输出的日志文件。

内容:应用运行日志、错误堆栈、业务日志等。

用途:结合指标进行问题根因分析(例如通过错误日志关联指标中的“请求失败率突增”)。

0

评论区