节点预留资源策略说明
节点的部分资源需要运行一些必要的Kubernetes系统组件和Kubernetes系统资源,使该节点可作为您的集群的一部分。 因此,您的节点资源总量与节点在Kubernetes中的可分配资源之间会存在差异。节点的规格越大,在节点上部署的容器可能会越多,所以Kubernetes自身需预留更多的资源。
为了保证节点的稳定性,CCE集群节点上会根据节点的规格预留一部分资源给Kubernetes的相关组件(kubelet,kube-proxy以及docker等)。
CCE对用户节点可分配的资源计算法则如下:
Allocatable = Capacity - Reserved - Eviction Threshold
即,节点资源可分配量=总量-预留值-驱逐阈值。其中内存资源的驱逐阈值,固定为100MiB。
当节点上所有Pod消耗的内存上涨时,可能存在下列两种行为:
- 当节点可用内存低于驱逐阈值时,将会触发kubelet驱逐Pod。关于Kubernetes中驱逐阈值的相关信息,请参见节点压力驱逐。
- 如果节点在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及以上 |
- |
|||
|
v1.28 |
v1.28.2-r0及以上 |
|||
|
v1.28.2-r0以下 |
|
|||
|
v1.27 |
v1.27.4-r0及以上 |
|||
|
v1.27.4-r0以下 |
|
|||
|
v1.25 |
v1.25.7-r0及以上 |
|||
|
v1.25.7-r0以下 |
|
|||
|
v1.23 |
v1.23.12-r0及以上 |
|||
|
v1.23.3-r0及以上,v1.23.12-r0以下 |
|
|||
|
v1.23.3-r0以下 |
||||
|
v1.21 |
v1.21.13-r0及以上 |
|||
|
v1.21.4-r0及以上,v1.21.13-r0以下 |
|
|||
|
v1.21.4-r0以下 |
CCE对节点内存的预留规则v1
CCE节点内存的总预留值等于系统组件预留值与Kubelet管理Pod所需预留值之和。
公式为:总预留值 = 系统组件预留值 + Kubelet管理Pod所需预留值
|
内存总量范围 |
系统组件预留值 |
|---|---|
|
内存总量 <= 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 |
|
内存总量范围 |
Pod数量 |
Kubelet管理Pod所需预留值 |
|---|---|---|
|
内存总量 <= 2GiB |
- |
内存总量 *25% |
|
内存总量 > 2GiB |
0 < 节点的最大实例数 <= 16 |
700 MiB |
|
16 < 节点的最大实例数 <= 32 |
( 700 + (节点的最大实例数 - 16)*18.75 )MiB |
|
|
32 < 节点的最大实例数 <= 64 |
( 1024 + (节点的最大实例数 - 32)*6.25 )MiB |
|
|
64 < 节点的最大实例数 <= 128 |
( 1230 + (节点的最大实例数 - 64)*7.80 )MiB |
|
|
节点的最大实例数 > 128 |
( 1740 + (节点的最大实例数 - 128)*11.20 )MiB |
对于小规格节点,需根据实际使用情况调整节点的最大实例数。或者在CCE控制台创建节点时,需考虑根据节点规格自适应调整节点的最大实例数参数。
CCE对节点内存的预留规则v2
CCE节点内存v2模型的总预留值等于系统内存预留与Kubernetes内存预留之和。
其中系统内存预留包括基础预留和随节点内存规格变动的浮动预留;Kubernetes内存预留包括基础预留和随节点Pod数量的浮动预留。
系统默认自动计算节点预留内存,计算规则如表3所示,您也可以通过节点池配置管理参数(system-reserved-mem和kube-reserved-mem)自定义调整系统内存预留和Kubernetes内存预留,具体方法请参见节点池配置管理。
|
预留类型 |
基础/浮动 |
预留公式 |
预留对象 |
|---|---|---|---|
|
系统内存预留 |
基础预留 |
固定400MiB |
sshd、systemd-journald等操作系统服务组件占用 |
|
浮动预留(随节点内存) |
25MiB/GiB |
内核占用 |
|
|
Kubernetes内存预留 |
基础预留 |
固定500MiB |
节点空载时, kubelet、kube-proxy等容器运行时组件占用。 |
|
浮动预留(随节点Pod数量) |
Docker:20MiB/Pod Containerd:5MiB/Pod |
Pod数量增加时,容器运行时组件的额外占用。
说明:
v2模型在计算节点默认预留内存时,随内存估计节点默认最大实例数,请参见表1。 |
CCE对节点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。
相关文档
关于如何配置资源预留量和驱逐阈值,请参见节点池配置管理。
