# 节点预留资源策略说明
节点的部分资源需要运行一些必要的Kubernetes系统组件和Kubernetes系统资源，使该节点可作为您的集群的一部分。 因此，您的节点资源总量与节点在Kubernetes中的可分配资源之间会存在差异。节点的规格越大，在节点上部署的容器可能会越多，所以Kubernetes自身需预留更多的资源。
为了保证节点的稳定性，CCE集群节点上会根据节点的规格预留一部分资源给Kubernetes的相关组件（kubelet，kube-proxy以及docker等）。
CCE对用户节点可分配的资源计算法则如下：
**Allocatable = Capacity - Reserved - Eviction Threshold**
即，**节点资源可分配量** =**总量** -**预留值** -**驱逐阈值**。其中内存资源的驱逐阈值，固定为100MiB。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
此处**总量 Capacity** 为弹性云服务器除系统组件消耗外的可用内存，因此总量会略小于节点规格的内存值。详情请参见[使用free命令查看弹性云服务器的内存，为什么与实际不符？](https://support.huaweicloud.com/ecs_faq/ecs_faq_1105.html)
当节点上所有Pod消耗的内存上涨时，可能存在下列两种行为：
- 当节点可用内存低于驱逐阈值时，将会触发kubelet驱逐Pod。关于Kubernetes中驱逐阈值的相关信息，请参见[节点压力驱逐](https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction)。
- 如果节点在kubelet回收内存之前触发操作系统内存不足事件（OOM），系统会终止容器，但是与Pod驱逐不同，kubelet会根据Pod的RestartPolicy重新启动它。
 #### 查询节点可分配资源
使用kubectl连接集群，执行以下命令查看集群中所有节点的概要信息，返回信息中将列出所有节点的名称、状态等信息。
```
kubectl get nodes
```
查看特定节点的资源总量和可分配资源，其中*\<node_name\>*需要替换为待查看的节点名称。
```
kubectl describe node <node_name> | grep Capacity -A 17
```
预期输出如下：
```
Capacity:
  cpu:                2                 # 节点的CPU核数
  ephemeral-storage:  102622136Ki       # 节点的临时存储总量，单位为KiB
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  localssd:           0
  localvolume:        0
  memory:             3852580Ki         # 节点的内存总量，单位为KiB
  pods:               20
Allocatable:
  cpu:                1930m             # 节点可分配的CPU核数
  ephemeral-storage:  94576560382       # 节点可分配的临时存储，单位为Byte
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  localssd:           0
  localvolume:        0
  memory:             2632996Ki          # 节点可分配的内存，单位为KiB
  pods:               20
```
#### 节点预留规则与集群版本关系
| **集群版本** | **具体版本号**                   | **节点内存的预留规则**                                                                                                                                                                                                                                                  | 节点CPU的预留规则                                         | 节点数据盘的预留规则                                            |
|:---|:---|:---|:---|:---|
| v1.29及以上 | -                           | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                          | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.28    | v1.28.2-r0及以上               | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                          | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.28    | v1.28.2-r0以下              | - 自定义节点池：[CCE对节点内存的预留规则v1]  - 默认节点池：[CCE对节点内存的预留规则v2]   | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.27    | v1.27.4-r0及以上                | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                         | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.27    | v1.27.4-r0以下                | - 自定义节点池：[CCE对节点内存的预留规则v1]  - 默认节点池：[CCE对节点内存的预留规则v2]     | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.25   | v1.25.7-r0及以上                 | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                          | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.25   | v1.25.7-r0以下               | - 自定义节点池：[CCE对节点内存的预留规则v1]  - 默认节点池：[CCE对节点内存的预留规则v2]    | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.23     | v1.23.12-r0及以上             | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                          | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.23     | v1.23.3-r0及以上，v1.23.12-r0以下 | - 自定义节点池：[CCE对节点内存的预留规则v1]  - 默认节点池：[CCE对节点内存的预留规则v2]   | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.23     | v1.23.3-r0以下                 | [CCE对节点内存的预留规则v1]                                                                                                                                                                                                           | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.21   | v1.21.13-r0及以上               | [CCE对节点内存的预留规则v2]                                                                                                                                                                                                           | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.21   | v1.21.4-r0及以上，v1.21.13-r0以下  | - 自定义节点池：[CCE对节点内存的预留规则v1]  - 默认节点池：[CCE对节点内存的预留规则v2]      | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
| v1.21   | v1.21.4-r0以下                | [CCE对节点内存的预留规则v1]                                                                                                                                                                                                            | [CCE对节点CPU的预留规则] | [CCE对节点数据盘的预留规则] |
   
 #### CCE对节点内存的预留规则v1
CCE节点内存的总预留值等于**系统组件预留值** 与**Kubelet管理Pod所需预留值**之和。
**公式为：** 总预留值 = [系统组件预留值] + [Kubelet管理Pod所需预留值]
 表1系统组件预留规则 
| 内存总量范围                   | 系统组件预留值                                                                  |
|:---|:---|
| 内存总量 \<= 8GiB               | 0MiB                                                                    |
| 8GiB \< 内存总量 \<= 16GiB   | ( (内存总量 -- 8GiB)\*1024\*10% )MiB                                       |
| 16GiB \< 内存总量 \<= 128GiB | ( 8GiB\*1024\*10% + (内存总量 -- 16GiB)\*1024\*6% )MiB                      |
| 内存总量 \> 128GiB           | ( 8GiB\*1024\*10% + 112GiB\*1024\*6% + (内存总量 -- 128GiB)\*1024\*2% )MiB |
   
 表2Kubelet管理Pod所需预留规则 
| 内存总量范围          | Pod数量                 | Kubelet管理Pod所需预留值                     |
|:---|:---|:---|
| 内存总量 \<= 2GiB  | -                        | 内存总量 \*25%                            |
| 内存总量 \> 2GiB | 0 \< 节点的最大实例数 \<= 16    | 700 MiB                                 |
| 内存总量 \> 2GiB | 16 \< 节点的最大实例数 \<= 32   | ( 700 + (节点的最大实例数 - 16)\*18.75 )MiB    |
| 内存总量 \> 2GiB | 32 \< 节点的最大实例数 \<= 64 | ( 1024 + (节点的最大实例数 - 32)\*6.25 )MiB    |
| 内存总量 \> 2GiB | 64 \< 节点的最大实例数 \<= 128 | ( 1230 + (节点的最大实例数 - 64)\*7.80 )MiB    |
| 内存总量 \> 2GiB | 节点的最大实例数 \> 128        | ( 1740 + (节点的最大实例数 - 128)\*11.20 )MiB |
   
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
对于小规格节点，需根据实际使用情况调整节点的最大实例数。或者在CCE控制台创建节点时，需考虑根据节点规格自适应调整节点的最大实例数参数。
 #### CCE对节点内存的预留规则v2
CCE节点内存v2模型的总预留值等于**系统内存预留** 与**Kubernetes内存预留**之和。
其中系统内存预留包括基础预留和随节点内存规格变动的浮动预留；Kubernetes内存预留包括基础预留和随节点Pod数量的浮动预留。
系统默认自动计算节点预留内存，计算规则如[表3]所示，您也可以通过节点池配置管理参数（system-reserved-mem和kube-reserved-mem）自定义调整**系统内存预留** 和**Kubernetes内存预留** ，具体方法请参见[节点池配置管理](https://support.huaweicloud.com/usermanual-cce/cce_10_0652.html)。
 表3节点内存预留规则v2 
| 预留类型          | 基础/浮动         | 预留公式                                                               | 预留对象                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| 系统内存预留       | 基础预留          | 固定400MiB                                                             | sshd、systemd-journald等操作系统服务组件占用                                                                                                                                                                    |
| 系统内存预留       | 浮动预留（随节点内存）     | 每GiB节点内存预留25MiB，其中自定义节点池使用节点实际内存计算，默认节点池使用节点规格的内存值计算。                | 内核占用                                                                                                                                                                                                |
| Kubernetes内存预留 | 基础预留            | 固定500MiB                                                             | 节点空载时， kubelet、kube-proxy等容器运行时组件占用。                                                                                                                                                               |
| Kubernetes内存预留 | 浮动预留（随节点Pod数量） | Docker：20MiB/Pod Containerd：5MiB/Pod | Pod数量增加时，容器运行时组件的额外占用。 说明： v2模型在计算节点默认预留内存时，随内存估计节点默认最大实例数，请参见[表1](https://support.huaweicloud.com/usermanual-cce/cce_10_0348.html#cce_10_0348__table1710310156526)。 |
   
 #### CCE对节点CPU的预留规则
表4节点CPU预留规则 
| CPU总量范围                   | CPU预留值                                                        |
|:---|:---|
| CPU总量 \<= 1core         | CPU总量 \*6%                                                 |
| 1core \< CPU总量 \<= 2core | 1core\*6% + (CPU总量-- 1core)\*1 %                            |
| 2core \< CPU总量 \<= 4core | 1core\*6% + 1core\*1% + (CPU总量-- 2core)\*0.5%               |
| CPU总量 \> 4core            | 1core\*6% + 1core\*1% + 2core\*0.5% + (CPU总量-- 4core)\*0.25% |
   
 #### CCE对节点数据盘的预留规则
CCE使用LVM（Logical Volume Manager）进行磁盘管理，LVM会在磁盘上创建一个metadata区域用于存储逻辑卷和物理卷的信息，导致磁盘存在4MiB的不可用空间。因此节点实际可用的磁盘空间 = 磁盘大小 - 4MiB。
#### 相关文档
关于如何配置资源预留量和驱逐阈值，请参见[节点池配置管理](https://support.huaweicloud.com/usermanual-cce/cce_10_0652.html)。
