节点资源预留算法(新)

最近更新时间:2024-09-29 16:49:41

我的收藏
TKE 需要占用节点的一部分资源来运行相关组件(例如:kubelet、kube-proxy、Runtime 等),因此节点的总资源与集群中可分配的资源之间会存在差异。本文主要介绍 TKE 集群中 Kubernetes 版本在1.30及以上节点的新资源预留算法,帮助用户在部署应用时合理设置 Pod 的请求资源量和限制资源量。

适用范围

本算法适用于集群 kubernetes 版本在1.30及以上的普通和原生节点。

定义

整机使用资源 = 维持节点运行的系统进程占用资源 + Pod 运行占用资源
注意:
本文主要讨论“维持节点运行的系统进程占用资源”的预留算法。

节点 CPU 预留规则

由于 CPU 是可压缩资源且存在部分 perCPU 的内核线程,我们尽量保持算法的一致性,并在大规格机型上提供更多的资源。更新后的算法如下:
第一个核心的6%。
下一个核心(最多2个核心)的1%。
接下来2个核心(最多4个核心)的0.5%。
4个以上任何核心数量的0.25%。
需注意,在小规格机器上创建过多的 Pod 可能会导致预留的 CPU 过少,从而影响系统稳定性。以下行为也可能会占用系统资源,可以使用自定义参数适当调整预留的资源情况:
容器打印过多日志(容器日志通过 pipe 交给 containerd,最终由 kubelet 压缩落盘)。
exec probe 执行过于频繁(如每秒一次,exec probe 通过 runc 在容器中执行命令,因此可能会占用大量的 CPU)。
在节点上部署其他服务(非 Pod 管理的服务会占用节点预留资源,从而导致系统不稳定)。
新旧算法在 CPU 资源占用情况的对比如下:
CPU(核)
旧算法
新算法
1
0.1
0.06
2
0.1
0.07
4
0.1
0.08
8
0.2
0.09
16
0.4
0.11
32
0.8
0.15
64
1.6
0.23
128
2.4
0.39
256
3.04
0.71

节点 Mem 预留规则

Memory 是不可压缩资源,设置预留内存时应较为谨慎。经过测试内存和 Pod 数量、机器规格紧密相关,调整新算法为:min(旧算法,20MiB * Pod 数量 + 256MiB)注意在节点上部署其他服务也可能会占用节点预留资源,导致节点稳定性降低。如果需要部署非 Pod 管理的服务,建议调整预留资源。
新旧算法在 Mem 资源占用情况的对比如下:
内存大小
(GiB)
旧算法
16个 pod
(GiB)
32个 pod
(GiB)
64个 pod
(GiB)
128个 pod
(GiB)
256个 pod
(GiB)
1
0.25
0.25
0.25
0.25
0.25
0.25
2
0.5
0.5
0.5
0.5
0.5
0.5
4
1
0.58
0.9
1
1
1
8
1.8
0.58
0.9
1.54
1.8
1.8
16
2.6
0.58
0.9
1.54
2.6
2.6
32
3.56
0.58
0.9
1.54
2.82
3.56
64
5.48
0.58
0.9
1.54
2.82
5.38
128
9.32
0.58
0.9
1.54
2.82
5.38
256
11.88
0.58
0.9
1.54
2.82
5.38

常见问题

新旧算法有什么差异?

旧算法:根据机器规格为资源预留固定值,详情请参见 资源预留说明。算法相对保守,预留资源量较大,用户可以给业务使用的资源量较低。
新算法:通过调整 Pod 数在不同规格机器上进行大规模压测获得资源预留公式,新算法在大规格机型上提供更多的资源给业务使用。

关于设置 kube-reserved 且不设置 system-reserved 的解释

kubelet 将 capacity - kubeReserved - systemReserved - evictionHard 作为节点可分配资源,用来控制 Pod 可用到的资源量。按照文档,kubeReserved 可用来限制 kubelet 和运行时组件的资源使用量、systemReserved 可用来限制系统服务资源量,但生效的前提是需要开启 enforce-node-allocatable 并指定 kube-reserved-cgroup 和 system-reserved-cgroup ,这对系统的 cgroup 布局有额外要求。同时,社区官方和众多云厂商出于对整体稳定性考量,并不会启用这两种限制。因此 TKE 也不会对 kubelet 组件和系统组件进行资源限制,同样 reserved 的资源完全设置在 kube-reserved 上还是 kube-reserved 和 system-reserved 各占一部分实际的效果没有区别。

新算法是否支持对低版本节点生效?

暂不支持。存量节点后续可以通过节点升级来体验新算法。