You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Kubernetes Metrics-server指定window参数并获取API Server指标

Kubernetes API Server 性能指标 CLI 获取方案

工具选型对比

  • Metrics-server:仅适合获取近期(默认5分钟)的指标平均值,轻量但功能受限,无法直接输出MIN/MAX,时间窗口自定义空间小
  • Prometheus:支持任意时间窗口的复杂指标聚合,能满足你获取MIN/MAX/AVG的需求,是更匹配场景的工具

一、Metrics-server 使用说明

1. 自定义时间窗口

Metrics-server本身不支持通过CLI直接修改默认5分钟窗口,它的指标保留时长由采集逻辑决定。若需调整,需修改Deployment启动参数:

kubectl edit deployment metrics-server -n kube-system

在容器args中添加:

  • --metric-resolution=15s:调整指标采集间隔(默认60s)
  • --horizontal-pod-autoscaler-use-rest-clients=false:优化指标缓存逻辑(仅影响短期保留)
    注意:Metrics-server设计为短期指标工具,不适合自定义较长时间窗口。

2. 可获取的指标参数

仅能通过kubectl top获取平均值,无MIN/MAX支持:

  • API Server CPU使用率:kubectl top pod -n kube-system | grep kube-apiserver
  • API Server 内存使用率:同上命令,输出包含内存使用量与百分比

二、Prometheus 解决时间窗口查询问题

1. 核心PromQL查询语句

针对API Server的CPU/内存指标,结合时间窗口聚合:

CPU指标(容器级)

  • 平均值:avg(container_cpu_usage_seconds_total{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]
  • 最大值:max(container_cpu_usage_seconds_total{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]
  • 最小值:min(container_cpu_usage_seconds_total{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]

内存指标(容器级)

  • 平均值:avg(container_memory_working_set_bytes{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]
  • 最大值:max(container_memory_working_set_bytes{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]
  • 最小值:min(container_memory_working_set_bytes{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod) [你的时间窗口:1m]

2. 解决start/end/step参数无效问题

你遇到的问题大概率是用错了API接口:

  • 必须使用query_range接口(而非query瞬时查询接口),start/end/step参数才会生效
  • 时间格式需为RFC3339(如2024-05-20T10:00:00Z)或Unix时间戳
  • step采样间隔不能小于Prometheus默认采集间隔(15s)

正确的CLI调用示例(替换为你的Prometheus地址):

curl -G 'http://prometheus-service.kube-system.svc.cluster.local:9090/api/v1/query_range' \
  --data-urlencode 'query=avg(container_cpu_usage_seconds_total{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod)' \
  --data-urlencode 'start=2024-05-20T10:00:00Z' \
  --data-urlencode 'end=2024-05-20T10:10:00Z' \
  --data-urlencode 'step=15s'

3. 脚本集成示例

用jq解析返回的JSON结果,提取聚合值:

# 脚本内定义起始/结束时间
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# 执行你的K8s API调用脚本
./your-k8s-api-script.sh
END_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

# 获取CPU平均值并计算最终聚合值
curl -G 'http://prometheus-service.kube-system.svc.cluster.local:9090/api/v1/query_range' \
  --data-urlencode 'query=avg(container_cpu_usage_seconds_total{pod=~"kube-apiserver.*", namespace="kube-system"}) by (pod)' \
  --data-urlencode "start=$START_TIME" \
  --data-urlencode "end=$END_TIME" \
  --data-urlencode 'step=15s' | jq '.data.result[].values | map(.[1] | tonumber) | add / length'

总结

  • Metrics-server仅能满足短期平均值查询,无法实现你的MIN/MAX/自定义时间窗口需求
  • 必须使用Prometheus,通过query_range接口搭配正确的PromQL语句,即可获取指定时间段内的完整指标聚合值

内容的提问来源于stack exchange,提问作者mberge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:37:05