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)
公式说明:
资源预留策略
节点的预留资源量通常要考虑以下因素:
-
由于规格较高的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 。
-
如果您希望对已存在节点应用自定义资源预留策略,您可以将已有节点移除出集群,然后重新添加节点。新添加的节点会默认执行自定义资源预留策略。移除节点和添加节点的标准操作及带来的影响,请参见 移除节点 、 添加已有节点 。