如何为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
相关产品推荐
相关产品推荐

