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 各占一部分实际的效果没有区别。新算法是否支持对低版本节点生效?
暂不支持。存量节点后续可以通过节点升级来体验新算法。