全部产品
Search
文档中心

容器计算服务 ACS:开启Virtual Node监控指标分片采集

更新时间:Aug 03, 2026

Virtual Node 管理大规模 Serverless Pod 时暴露的 cAdvisor 指标量较大,本文介绍开启监控指标分片采集,将指标分散到多个 Prometheus 采集 target,适配不同采集方案。

背景信息

容器计算服务ACS使用 Virtual Node 管理大量 Serverless Pod时(推荐千级 Pod 规模开启),Virtual Node 暴露的 kubelet cAdvisor Prometheus 指标规模较大。为适配不同 Prometheus 方案的采集能力,开启配置后 Virtual Node 支持以分片方式暴露监控指标,分散单个 Prometheus 采集 target 的指标量。

适用范围

  • 已部署 ack-virtual-node 组件,且组件版本不低于 v2.7.3。具体操作,请参见 acs-virtual-node组件说明。

修改组件配置

通过 kube-system 命名空间下的 acs-profile ConfigMap 修改ack-virtual-node组件配置。执行以下命令打开 ConfigMap:

kubectl edit cm -n kube-system acs-profile

在 data 字段中设置监控分片数 metricsShardSize,最大值为 48。

apiVersion: v1
kind: ConfigMap
metadata:
  name: acs-profile
  namespace: kube-system
data:
  # 监控分片数,最大值为 48
  metricsShardSize: "4"

分片数量建议根据集群同时在线的 Serverless Pod 规模设置:

集群同时在线 Serverless Pod 规模

推荐分片数

千级

4

5 万

24

10 万

48

修改后,监控请求地址变更为 /metrics/cadvisor/<index>。分片总数可通过 acs-profile 中的参数或监控数据中的 total_shard_num 指标获取;当前分片可通过 current_shard_pods_num 指标的 shard_index 标签获取。

验证分片接口返回数据

查询指定分片(以分片 0 为例)的监控数据:

export node=<NODE-NAME>
kubectl get --raw "/api/v1/nodes/$node/proxy/metrics/cadvisor/0" | tail

返回结果末尾包含分片相关指标,示例如下:

# HELP current_shard_pods_num Number of pods in current shard.
# TYPE current_shard_pods_num gauge
current_shard_pods_num{shard_index="0",node_name="virtual-kubelet"} 2
# HELP total_shard_num Number of shards.
# TYPE total_shard_num gauge
total_shard_num{node_name="virtual-kubelet"} 4
重要

开启分片模式后,为避免数据重复导致计算结果翻倍,原监控接口 /metrics/cadvisor 不再返回监控数据。

配置 Prometheus 采集

开启分片功能后,Virtual Node 暴露的 Prometheus 监控数据由原 kubelet cAdvisor 接口切换至分片 cAdvisor 接口,需相应修改 Prometheus 采集配置。根据采集方案选择对应配置方式:

  • 阿里云 Prometheus:已预置分片开启前后的采集规则,确认或升级探针版本即可。

  • 自建 Prometheus:需新增 ScrapeConfig 或 ServiceMonitor 采集配置。

阿里云 Prometheus

  1. 进入目标集群,左侧导航栏选择运维管理 > Prometheus 监控。

  2. 在Prometheus 监控页面单击右上角 采集配置 跳转至对应的阿里云 Prometheus 实例接入管理页面。

  3. 在接入管理页面选择探针页签,单击metric-agent项右侧操作列的Job 列表。

    1. 若存在 cs/virtual-kubelet-metrics-with-metrics-shard 采集 Job,且该 Job 各采集 Endpoint 的最近采集数据量(LastScrapeSeries)为有效值,则已成功采集 Virtual Node 分片后的监控数据。

    2. 若不存在 cs/virtual-kubelet-metrics-with-metrics-shard 采集 Job,请在阿里云 Prometheus 实例的探针页签右侧操作列的image > 升级,将探针采集版本升级至 v2.1.12 及以上。

自建 Prometheus

自建 Prometheus 可选择以下任一方式配置分片采集。

配置方式一:Prometheus Scrape Config

在 Prometheus 配置文件的 scrape_configs 中新增如下采集配置:

scrape_configs:
- job_name: virtual-kubelet-metrics-with-metrics-shard
  honor_labels: true
  honor_timestamps: true
  scrape_interval: 30s
  scrape_timeout: 10s
  metrics_path: /metrics/cadvisor
  scheme: https
  authorization:
    credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    insecure_skip_verify: true
  relabel_configs:
  - source_labels:
    - __meta_kubernetes_service_label_k8s_app
    separator: ;
    regex: virtual-kubelet-metrics
    replacement: $1
    action: keep
  - source_labels:
    - __meta_kubernetes_endpoint_port_name
    separator: ;
    regex: https-metrics
    replacement: $1
    action: keep
  - source_labels:
    - __meta_kubernetes_endpoint_address_target_kind
    - __meta_kubernetes_endpoint_address_target_name
    separator: ;
    regex: Node;(.*)
    target_label: node
    replacement: ${1}
    action: replace
  - source_labels:
    - __meta_kubernetes_endpoint_address_target_kind
    - __meta_kubernetes_endpoint_address_target_name
    separator: ;
    regex: Pod;(.*)
    target_label: pod
    replacement: ${1}
    action: replace
  - source_labels:
    - __meta_kubernetes_namespace
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace
  - source_labels:
    - __meta_kubernetes_service_name
    separator: ;
    regex: (.*)
    target_label: service
    replacement: $1
    action: replace
  - source_labels:
    - __meta_kubernetes_pod_name
    separator: ;
    regex: (.*)
    target_label: pod
    replacement: $1
    action: replace
  - source_labels:
    - __meta_kubernetes_pod_container_name
    separator: ;
    regex: (.*)
    target_label: container
    replacement: $1
    action: replace
  - source_labels:
    - __meta_kubernetes_service_name
    separator: ;
    regex: (.*)
    target_label: job
    replacement: ${1}
    action: replace
  - source_labels:
    - __meta_kubernetes_service_label_k8s_app
    separator: ;
    regex: (.+)
    target_label: job
    replacement: ${1}
    action: replace
  - separator: ;
    regex: (.*)
    target_label: endpoint
    replacement: https-metrics
    action: replace
  - source_labels:
    - __metrics_path__
    separator: ;
    regex: (.*)
    target_label: metrics_path
    replacement: $1
    action: replace
  - source_labels:
    - __meta_kubernetes_endpoints_name
    separator: ;
    regex: virtual-kubelet-metrics-(.+)-(.+)
    target_label: __metrics_path__
    replacement: /metrics/cadvisor/${1}
    action: replace
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - kube-system

配置方式二:Prometheus Operator ServiceMonitor

请根据实际 Prometheus Operator 对 ServiceMonitor 的 namespace、label 等要求调整后应用,参考配置如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: virtual-kubelet-metrics
    # 增加该 label 用于 operator 自动加入配置
    release: ack-prometheus-operator
  name: ack-prometheus-operator-virtual-kubelet
  namespace: monitoring
spec:
  endpoints:
    - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
      honorLabels: true
      # 请求方式
      scheme: https
      # 选择定义在 endpoint 中的端口名称
      port: https-metrics
      tlsConfig:
        caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecureSkipVerify: true
      # 增加的标签,用于和原生保持一致
      path: /metrics/cadvisor
      relabelings:
        - action: replace
          sourceLabels:
            - __metrics_path__
          targetLabel: metrics_path
        # 将 Service 中的 annotation 修改为最终生效的 Metrics Path
        - sourceLabels:
            - __meta_kubernetes_endpoints_name
          action: replace
          targetLabel: __metrics_path__
          regex: "virtual-kubelet-metrics-(.+)-(.+)"
          replacement: "/metrics/cadvisor/${1}"
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
      - kube-system
  selector:
    matchLabels:
      k8s-app: virtual-kubelet-metrics

验证分片采集效果

阿里云 Prometheus

  1. 应用对应的 Prometheus 采集规则后,进入Prometheus控制台-接入管理页面,然后选择进入目标环境。

  2. 在目标环境页切换到自监控页签。

    若对应的 Target(形如 cs/virtual-kubelet-metrics-with-metrics-shard 或 ack-prometheus-operator-virtual-kubelet)状态显示为 N/N up,则表明分片采集目标已生效。

  3. 同时,原 /metrics/cadvisor 接口不再返回 cAdvisor 容器监控数据(仅保留 kubelet_node_name 等少量 kubelet 基础指标)。

    执行以下命令验证原接口返回内容:

    export node=<NODE-NAME>
    kubectl get --raw "/api/v1/nodes/$node/proxy/metrics/cadvisor" | tail

    预期输出:

    # HELP kubelet_node_name The node's name. The count is always 1.
    # TYPE kubelet_node_name gauge
    kubelet_node_name 1

自建 Prometheus

  1. 通过Service暴露Prometheus的标准API,当前以ack-prometheus-operator的Service:ack-prometheus-operator-prometheus为例。

  2. 在浏览器中访问ServiceIP:9090,需为Service开通公网访问,查看Prometheus控制台。

  3. 在页面上方菜单栏,单击Status > Targets,查看所有采集任务。

    若对应的 Target(形如 cs/virtual-kubelet-metrics-with-metrics-shard 或 ack-prometheus-operator-virtual-kubelet)状态显示为 N/N up,则表明分片采集目标已生效。

常见问题

使用 VictoriaMetrics 采集分片指标时出现时间序列中断或指标量异常

使用 VictoriaMetrics(VM)等 Prometheus 高可用方案采集分片指标时,可能出现以下异常:

  • 时间序列意外中断或丢失。

  • 采集与存储的指标量高于预期。

原因:上述异常通常与 VM 的 Stale Markers(过期标记)机制有关。当抓取目标返回的 Label 顺序变化但实际内容未变时,VM 会将其误判为新的时间序列,并将旧序列标记为 stale,从而导致数据断点或丢失。详情请参见 VictoriaMetrics Issue #1857。

建议:优先通过修复抓取端(例如固定 Label 顺序)解决。若确认无法修复且 Stale Markers 已造成实际影响,可为 VictoriaMetrics 开启命令行参数-promscrape.noStaleMarkers。

该参数会影响告警时效性,生产环境变更前请充分评估。