如何通过命令或编程方式获取Kubernetes Pod的每核CPU使用率?
获取Kubernetes Pod每核CPU使用情况的方法
命令行方式
1. 直接从容器内读取cgroup统计
Kubernetes通过cgroup管理容器CPU资源,每个容器的CPU使用统计存放在cgroup文件系统中,无需额外工具即可获取每核数据:
- 查看Pod中容器的每核累计CPU使用时间(纳秒):
kubectl exec <你的Pod名称> -- cat /sys/fs/cgroup/cpuacct/cpuacct.usage_percpu
输出示例:1234567890 9876543210 4567890123 ...,每个数字对应一个CPU核心的累计使用时长。
计算每核使用率:
- 先记录当前的
cpuacct.usage_percpu值,等待N秒(比如10秒) - 再次读取该文件的值,计算每个核心的差值
- 差值除以
N*1e9(因为1秒=1e9纳秒),得到该核心的使用率(0~1之间,乘以100%为百分比)
- 先记录当前的
获取空闲时间:
容器内的/proc/stat包含宿主机每个CPU核心的总时间和空闲时间(容器内的/proc/stat是宿主机的视图),执行:
kubectl exec <你的Pod名称> -- cat /proc/stat | grep '^cpu[0-9]'
输出示例:cpu0 12345 678 9012 3456789 ...,其中第四个数字是该核心的空闲时间(jiffies单位,1jiffy通常为1/100秒)。结合之前的Pod每核使用时间,可计算出Pod在该核心上的空闲占比。
2. 借助宿主机cgroup路径
如果有权限访问宿主机,可直接定位到Pod容器的cgroup目录:
- 获取Pod的UID和容器ID:
# 获取Pod UID kubectl get pod <你的Pod名称> -o jsonpath='{.metadata.uid}' # 获取容器ID(去掉前缀,比如docker://后的部分) kubectl get pod <你的Pod名称> -o jsonpath='{.status.containerStatuses[0].containerID}' | sed 's/.*://'
- 进入对应cgroup目录(路径根据QoS等级可能不同,burstable/guaranteed/besteffort):
cd /sys/fs/cgroup/cpu,cpuacct/kubepods/<QoS等级>/<Pod-UID>/<容器ID>
- 查看
cpuacct.usage_percpu和cpu.stat等文件获取详细统计。
编程方式
1. 基于cgroup文件的脚本实现(Python示例)
通过调用kubectl命令读取cgroup数据,定时采样计算每核使用率:
import subprocess import time POD_NAME = "你的Pod名称" def get_percpu_usage(): result = subprocess.run( ["kubectl", "exec", POD_NAME, "--", "cat", "/sys/fs/cgroup/cpuacct/cpuacct.usage_percpu"], capture_output=True, text=True ) return list(map(int, result.stdout.strip().split())) # 第一次采样 prev_usage = get_percpu_usage() time.sleep(10) # 第二次采样 curr_usage = get_percpu_usage() # 计算每核使用率 for i, (prev, curr) in enumerate(zip(prev_usage, curr_usage)): diff = curr - prev usage_pct = (diff / (10 * 1e9)) * 100 print(f"CPU核心{i}使用率: {usage_pct:.2f}%")
2. 利用Prometheus指标(编程查询)
如果集群部署了Prometheus,可通过查询container_cpu_usage_seconds_total指标获取每核数据:
- 指标标签包含
pod="<你的Pod名称>"和cpu="<核心编号>",该指标是累计值 - 通过计算两次查询的差值除以时间间隔,得到每核的使用率(速率)
- 示例PromQL查询:
rate(container_cpu_usage_seconds_total{pod="你的Pod名称"}[1m])
编程时可通过Prometheus HTTP API调用该查询,解析返回的JSON结果得到每核使用率。
3. Kubernetes Go客户端扩展
如果用Go开发,可直接访问节点上的cgroup文件(需要节点权限),或通过Kubernetes API获取Pod的容器ID后,构造cgroup路径读取统计数据。
内容的提问来源于stack exchange,提问作者Vishal Raghavan
相关产品推荐
相关产品推荐

