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