问题现象
从界面上看节点内存使用率并不是很高,但使用kubelet top node查看节点内存使用率已超过100%。
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% 192.168.0.243 79m 4% 2357Mi 109%
问题根因
出现该问题的原因是kubectl top node是调用kubelet的metrics API来获取数据的,因此看到的是节点上已使用的资源总和除以可分配的所有资源。
社区issue链接:kubectl shows node memory >100%? · Issue #86499 · kubernetes/kubernetes · GitHub。
场景示例
例如,某节点的参数可通过kubectl describe node命令查询,示例如下:
...
Capacity:
cpu: 2
ephemeral-storage: 51286496Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
localssd: 0
localvolume: 0
memory: 3494556Ki
pods: 40
Allocatable:
cpu: 1960m
ephemeral-storage: 47265634636
hugepages-1Gi: 0
hugepages-2Mi: 0
localssd: 0
localvolume: 0
memory: 2213604Ki
pods: 40
...
- 节点内存总量:即Capacity.memory字段,为4030180Ki。
- 节点可分配量:即Allocatable.memory字段,为2213604Ki。
- 节点已使用量:可通过以下命令获取,本示例中为2413824Ki。 kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/回显如下:
{
"kind": "NodeMetricsList",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
...
"timestamp": "2023-08-15T14:09:38Z",
"window": "1m0.177s",
"usage": {
"cpu": "78528126n",
"memory": "2413824Ki"
}
}
]
}
- 则使用kubelet top node查看节点内存使用率:
节点内存使用率 = 节点已使用量 / 节点可分配 = 2413824Ki / 2213604Ki = 109%
- 实际节点内存使用率:
实际节点内存利用率 = 节点已使用量 / 节点内存总量 = 2413824Ki / 4030180Ki = 59.9%