必须基于 Allocatable 而非 Capacity 计算资源分配率,因调度器仅在 Allocatable 范围内分配;需用 kubectl + jq 提取各节点 .status.allocatable,再汇总所有 Pod requests,统一单位后分别计算 CPU 和内存使用率。

要准确掌握 Kubernetes 集群中所有节点的硬件资源分配率(即 CPU 和内存的请求总和占节点可分配资源的比例),不能只看 Capacity 总量,必须基于 Allocatable 可分配资源计算——因为 K8s 调度器只在 Allocatable 范围内做资源分配,而预留资源(如系统组件、kubelet、eviction threshold)已从中扣除。直接用 Capacity 会高估可用空间,导致分配率失真。
获取各节点 Allocatable 资源总量
执行 kubectl get nodes -o json 获取所有节点原始数据,再用 jq 提取每个节点的 .status.allocatable 字段:
kubectl get nodes -o json | jq -r '.items[] | "\(.metadata.name) \(.status.allocatable.cpu) \(.status.allocatable.memory)"'
输出示例:
node-1 3900m 5824732Ki
node-2 7800m 11649464Ki
注意:CPU 单位为 millicores(如 3900m = 3.9 核),内存单位为 KiB(如 5824732Ki ≈ 5700MiB)。【必须用 allocatable 而非 capacity,否则结果不反映真实调度水位】
统计全部 Pod 的 CPU 和内存请求总和
方法一:用 kubectl + awk 一行汇总(推荐,无需额外工具)
kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.containers[]?.resources.requests) | .spec.containers[]?.resources.requests | select(.cpu or .memory) | "\(.cpu // "0") \(.memory // "0")"' | awk '{cpu+=$1; mem+=$2} END {printf "CPU请求总和: %.3f m\n内存请求总和: %d Ki\n", cpu, mem}'
⚠️ 注意:该命令默认将未声明 requests 的 Pod 视为 0,符合调度器实际行为;若某容器 requests 缺失,其值为空字符串,awk 会按 0 处理。
方法二:分命名空间逐个采集(更稳定,适合大规模集群)
先列出所有命名空间:NAMESPACES=$(kubectl get ns -o jsonpath='{.items[*].metadata.name}')
再对每个命名空间执行:kubectl get pods -n $ns -o json | jq -r '.items[] | .spec.containers[]?.resources.requests | select(.cpu or .memory) | "\(.cpu // "0") \(.memory // "0")"',最后用 awk 合并累加。
手动计算分配率(CPU 和内存分别)
第一步:把所有节点 Allocatable CPU 汇总为核数
例如 node-1 3900m → 3.9 核,node-2 7800m → 7.8 核,总和 = 11.7 核
第二步:把所有 Pod CPU requests 汇总为 millicores,再除以 1000 得核数
若总 requests 为 8200m,则换算为 8.2 核
第三步:CPU 分配率 = (8.2 / 11.7) × 100% ≈ 70.09%
第四步:内存同理,统一转为 MiB 计算 —— 将 Allocatable 内存(KiB)÷ 1024 得 MiB;将 Pod requests 内存(如 2Gi、512Mi、1024Mi)全部标准化为 MiB 后求和;再相除得百分比。
第五步:直接运行脚本完成全部转换与计算(见知识库中 k8s-resource-summary.sh),它自动处理 m/Ki/Mi/Gi 单位混用,并输出 Total/Used/Available/Usage% 四列。

















