全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:节点资源预留策略

更新时间:Dec 11, 2023

ACK需要占用一定的节点资源来为kube组件和system进程预留资源,从而保证OS内核和系统服务、Kubernetes守护进程的正常运行。这会导致节点的资源总数Capacity与可分配的资源数Allocatable之间存在差异。ACK存在默认的资源预留策略,也支持通过kubelet配置自定义资源预留。

使用限制

仅v1.16.9及以上版本的ACK集群支持自定义节点资源预留策略。如需升级集群,请参见升级ACK集群

影响范围

自定义资源预留及其影响范围

您可以参见自定义节点池kubelet配置修改资源预留的取值。修改后,节点池中的已有节点将即时生效,新增节点(例如扩缩容的新节点、通过添加已有节点新增的ECS实例)也会使用该配置。

重要
  • 不支持通过黑屏手动修改kubelet配置文件,以避免配置冲突,导致后续节点池运维过程中的非预期结果。

  • 改变资源预留的值可能会造成节点的可分配资源变少。对于资源水位较高的节点,可能会触发节点驱逐。请合理配置取值。

默认资源预留影响范围

ACK可能会迭代节点资源预留的默认取值。迭代后,如果您在节点池维度更新了节点配置,例如集群升级、节点池升级、修改节点池自定义kubelet参数等,节点将自动使用新的资源预留策略。如果您没有相关运维操作,出于稳定性考量,节点池中的已有节点不会自动生效新的资源预留策略。

如果某个已有节点需要使用新的资源预留策略,您可以将该节点移除出集群,再重新添加已有节点。新添加的节点会默认执行新的资源预留策略。移除节点和添加节点的标准操作及带来的影响,请参见移除节点添加已有节点

查询节点可分配资源

执行以下命令,查看节点的资源总量和可分配资源。

kubectl describe node [NODE_NAME] | grep Allocatable -B 7 -A 6

预期输出:

Capacity:
  cpu:                4                 #节点的CPU总核数。
  ephemeral-storage:  123722704Ki       #节点的临时存储总量,单位KiB。
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             7925980Ki         #节点的内存总量,单位KiB。
  pods:               64
Allocatable:
  cpu:                3900m             #节点可分配的CPU核数。
  ephemeral-storage:  114022843818      #节点可分配的临时存储,单位Byte。
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             5824732Ki         #节点可分配的内存,单位KiB。
  pods:               64

计算节点可分配资源

可分配资源的计算公式:可分配资源(Allocatable) = 总资源(Capacity)-预留资源(Reserved)-驱逐阈值(Eviction-Threshold)

公式说明:

  • 总资源对应查询节点命令输出中的Capacity字段。

  • 关于预留资源的相关信息,请参见资源预留策略

  • 关于驱逐阈值的相关信息,请参见节点压力驱逐

资源预留策略

节点的预留资源量通常要考虑以下因素:

  • 由于规格较高的ECS节点通常会运行更多的Pod,为了保证节点的性能,ACK会为Kubernetes组件预留更多资源。

  • 由于Windows节点需要使用额外的资源来运行Windows操作系统和Windows Server相关组件,Windows节点通常会比Linux节点需要更多的预留资源。更多信息,请参见创建Windows节点池

预留资源包括给kube组件预留的资源(kubeReserved)和给system进程预留的资源(systemReserved)。kubeReserved和systemReserved各占预留资源的50%。例如,节点总CPU 1 Core,则预留CPU为100 milliCore,其中kubeReserved占用50 milliCore,systemReserved占用50 milliCore。修改资源预留的值,请参见自定义节点池kubelet配置

ACK会根据CPU和内存所在的不同区间来计算预留的资源量,节点的总预留资源量等于各区间的预留资源量之和。

  • CPU:计算节点的总CPU预留量示意图如下。预留资源策略

    以32核的节点为例,总的CPU预留量计算如下:

    100+(32000-4000)×2.5%=800 milliCore

  • 内存:计算节点的总内存预留量示意图如下所示。总内存预留量

    以256 GiB内存的节点为例,总的内存预留量计算如下:

    4×25%+(8-4)×20%+(16-8)×10%+(128-16)×6%+(256-128)×2%=11.88 GiB

ACK节点预留资源示例

节点总资源

预留资源

CPU

(单位:Core)

Memory

(单位:GiB)

CPU

(单位:milliCore)

Memory

(单位:MiB)

1

2

100

512

2

4

100

1024

4

8

100

1843

8

16

200

2662

16

32

400

3645

32

64

800

5611

64

128

1600

9543

128

256

2400

12164

256

512

3040

17407

512

1024

4320

27893

常见问题

如何查看节点总CPU和内存?

CPU

执行如下命令,查询节点总CPU。

cat /proc/cpuinfo | grep processor

预期输出:

processor       : 0
processor       : 1
processor       : 2
processor       : 3

内存

执行如下命令,查询节点总内存。

cat /proc/meminfo | grep MemTotal

预期输出:

MemTotal:        7660952 kB

相关文档

  • 配置自定义资源预留和驱逐阈值,请参见自定义节点池kubelet配置

  • 根据可分配资源,您可以为业务Pod设置所需资源(request),节点上所有业务Pod所需资源之和不应该大于节点的可分配资源,否则业务Pod会因节点容量不足而调度失败。ACK为K8s原生的工作负载提供了资源画像能力,通过对资源使用量历史数据的分析,辅助您填写Pod所需资源。设置业务Pod所需资源的具体操作,请参见创建无状态工作负载Deployment

  • 如果您希望对已存在节点应用自定义资源预留策略,您可以将已有节点移除出集群,然后重新添加节点。新添加的节点会默认执行自定义资源预留策略。移除节点和添加节点的标准操作及带来的影响,请参见移除节点添加已有节点