Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程(system daemons)。除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题。
kubelet 公开了一个名为 Node Allocatable 的特性,有助于为系统守护进程预留计算资源。Kubernetes 推荐集群管理员按照每个节点上的工作负载密度配置 Node Allocatable。
Node Allocatable
Node Capacity
kube-reserved |
|
kube-reserved |
|
system-reserved |
|
eviction-threshold |
|
allocatable (available for pods) |
示例场景
这是一个用于说明节点 Allocatable 计算方式的示例:
节点拥有 32Gi 内存,16 核 CPU 和 100Gi 存储
–kube-reserved 设置为 cpu=1,memory=2Gi,storage=1Gi
–system-reserved 设置为 cpu=500m,memory=1Gi,storage=1Gi
–eviction-hard 设置为 memory.available<500Mi,nodefs.available<10%
在这个场景下,Allocatable 将会是 14.5 CPUs、28.5Gi 内存以及 98Gi 存储。调度器保证这个节点上的所有 pod 请求的内存总量不超过 28.5Gi,存储不超过 88Gi。当 pod 的内存使用总量超过 28.5Gi 或者磁盘使用总量超过 88Gi 时,Kubelet 将会驱逐它们。如果节点上的所有进程都尽可能多的使用 CPU,则 pod 加起来不能使用超过 14.5 CPUs 的资源。
当没有执行 kube-reserved 和/或 system-reserved 且系统守护进程使用量超过其预留时,如果节点内存用量高于 31.5Gi 或存储大于 90Gi,kubelet 将会驱逐 pod。
修改/etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false --allow-privileged=true --system-reserved=cpu=12,memory=16Gi --kube-reserved=cpu=1,memory=2Gi --eviction-hard=memory.available<2Gi""