
# 为什么kubectl top命令查看节点内存使用超过100%？
#### 问题现象
从界面上看节点内存使用率并不是很高，但使用**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链接：<https://github.com/kubernetes/kubernetes/issues/86499>。
#### 场景示例
例如，某节点的参数可通过**kubectl describe node**命令查询，示例如下：
```
...
Capacity:
  cpu:                2
  ephemeral-storage:  51286496Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  localssd:           0
  localvolume:        0
  memory:             4030180Ki
  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"
  }
  }
  ]
  }
  ```
  
则使用**kubectl top node**查看节点内存使用率：
节点内存使用率 = 节点已使用量 / 节点可分配 = 2413824Ki / 2213604Ki = 109%
实际节点内存使用率：
实际节点内存利用率 = 节点已使用量 / 节点内存总量 = 2413824Ki / 4030180Ki = 59.9%
