本文介绍 Azure Kubernetes 服务 (AKS) 中的节点资源预留。
AKS 使用节点资源来帮助节点作为群集的一部分运行。 这种用法可能会造成节点的资源总数和 AKS 中可分配的资源数之间存在差异。
为了保持节点性能和功能,AKS 在每个节点上预留两种类型的资源(CPU 和内存)。 随着节点资源的增加,由于管理用户部署的 Pod 的需求增加,资源预留会增加。 请记住,无法更改节点上的资源预留。
预留的 CPU 取决于节点类型和群集配置,这可能会由于运行额外功能而导致可分配的 CPU 较少。 下表显示了 CPU 预留(以毫核为单位):
主机上的 CPU 核心数 | 1 个内核 | 2 个核心 | 4 核 | 8 核 | 16 核 | 32 个核心 | 64 个核心 |
---|---|---|---|---|---|---|---|
Kube 预留 CPU(毫核) | 60 | 100 | 140 | 180 | 260 | 420 | 740 |
AKS 中的预留内存包括两个值的总和:
AKS 1.29 及更高版本
默认情况下,
kubelet
守护程序具有 memory.available < 100 Mi 逐出规则。 此规则确保节点至少有 100 Mi 可供分配。 当主机低于该可用内存阈值时,kubelet
会触发以终止其中一个正在运行的 Pod,并释放主机上的内存。根据以下较小值设置的内存预留率:20 MB * 节点上支持的最大 Pod 数 + 50 MB 或总系统内存资源的 25%。
示例:
- 如果虚拟机 (VM) 提供 8 GB 内存,并且节点最多支持 30 个 Pod,则 AKS 将为预留的 kube 预留 20 MB * 最多 30 个 Pod + 50 MB = 650 MB。
Allocatable space = 8 GB - 0.65 GB (kube-reserved) - 0.1 GB (eviction threshold) = 7.25 GB or 90.625% allocatable.
- 如果 VM 提供 4 GB 内存,并且节点最多支持 70 个 Pod,AKS 将为预留的 kube 预留 25% * 4 GB = 1000 MB,因为这小于 20 MB * 最多 70 个 Pod + 50 MB = 1450 MB。
- 如果虚拟机 (VM) 提供 8 GB 内存,并且节点最多支持 30 个 Pod,则 AKS 将为预留的 kube 预留 20 MB * 最多 30 个 Pod + 50 MB = 650 MB。
1.29 之前的 AKS 版本
- 默认情况下,
kubelet
守护程序具有 memory.available < 750 Mi 逐出规则。 此规则确保节点始终至少有 750 Mi 可供分配。 当主机低于该可用内存阈值时,kubelet
会触发终止其中一个正在运行的 Pod,并释放主机上的内存。 - 为 kubelet 守护程序正常运行而预留 (kube-reserved) 的内存的递减速率。
- 前 4 GB 内存的 25%
- 下一个 4 GB 内存的 20%(最多 8 GB)
- 下一个 8 GB 内存的 10%(最多 16 GB)
- 下一个 112 GB 内存的 6%(最多 128 GB)
- 任何超过 128 GB 的内存的 2%
备注
AKS 为计算内存中未包含的 Windows 节点中的系统进程额外保留 2 GB。
内存和 CPU 分配规则设计为:
- 使代理节点保持正常运行,包括某些对群集运行状况至关重要的托管系统 Pod。
- 使节点报告的可分配内存和 CPU 数量少于它不属于 Kubernetes 群集时报告的数量。
例如,如果一个节点提供 7 GB 内存,它会报告 34% 的内存不可分配,包括 750Mi 硬逐出阈值。
0.75 + (0.25*4) + (0.20*3) = 0.75 GB + 1 GB + 0.6 GB = 2.35 GB / 7 GB = 33.57% reserved
除了 Kubernetes 本身的预留外,基础节点 OS 还预留了一定数量的 CPU 和内存资源以维持 OS 功能的运行。
如需相关的最佳做法,请参阅 AKS 中适用于基本计划程序功能的最佳做法。