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 标签获取。
开启分片模式后,为避免数据重复导致计算结果翻倍,原监控接口 /metrics/cadvisor 不再返回监控数据。
配置 Prometheus 采集
开启分片功能后,Virtual Node 暴露的 Prometheus 监控数据由原 kubelet cAdvisor 接口切换至分片 cAdvisor 接口,需相应修改 Prometheus 采集配置。根据采集方案选择对应配置方式:
阿里云 Prometheus:已预置分片开启前后的采集规则,确认或升级探针版本即可。
自建 Prometheus:需新增 ScrapeConfig 或 ServiceMonitor 采集配置。
阿里云 Prometheus
进入目标集群,左侧导航栏选择运维管理 > Prometheus 监控。
在Prometheus 监控页面单击右上角 采集配置 跳转至对应的阿里云 Prometheus 实例接入管理页面。
在接入管理页面选择探针页签,单击metric-agent项右侧操作列的Job 列表。
若存在
cs/virtual-kubelet-metrics-with-metrics-shard采集 Job,且该 Job 各采集 Endpoint 的最近采集数据量(LastScrapeSeries)为有效值,则已成功采集 Virtual Node 分片后的监控数据。若不存在
cs/virtual-kubelet-metrics-with-metrics-shard采集 Job,请在阿里云 Prometheus 实例的探针页签右侧操作列的
> 升级,将探针采集版本升级至 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
应用对应的 Prometheus 采集规则后,进入Prometheus控制台-接入管理页面,然后选择进入目标环境。
在目标环境页切换到自监控页签。
若对应的 Target(形如 cs/virtual-kubelet-metrics-with-metrics-shard 或 ack-prometheus-operator-virtual-kubelet)状态显示为 N/N up,则表明分片采集目标已生效。
同时,原
/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
通过Service暴露Prometheus的标准API,当前以ack-prometheus-operator的Service:ack-prometheus-operator-prometheus为例。
在浏览器中访问ServiceIP:9090,需为Service开通公网访问,查看Prometheus控制台。
在页面上方菜单栏,单击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。
该参数会影响告警时效性,生产环境变更前请充分评估。