tencent cloud

文档反馈

节点资源预留算法(新)

最后更新时间:2024-12-26 17:57:19
    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 各占一部分实际的效果没有区别。

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

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

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持