首页 > 解决方案 > Kubernetes 在启动 Pod 时不考虑总节点内存使用量

问题描述

我所看到的:Kubernetes 在调度新 Pod 时仅考虑其组件使用的内存,并将剩余内存视为空闲内存,即使它正在被 Kubernetes 之外的其他系统进程使用。因此,在创建新部署时,它会尝试在窒息的节点上安排新的 pod。

我期望看到的:Kubernetes 会自动考虑总内存使用量(通过 kubernetes 组件 + 系统进程)并将其调度到另一个节点上。

作为一种解决方法,是否有我需要设置的配置参数或者它是一个错误?

标签: linuxmemorykuberneteskubelet

解决方案


是的,分配资源的参数很少:您可以为您的 pod 分配内存和 CPU,并为您的系统守护进程手动分配内存和 CPU。在文档 中,您可以找到它如何与示例一起使用:

示例场景

这是一个说明节点可分配计算的示例:

  • 节点 有 32Gi , 和 memory_ 16 CPUs100GiStorage
  • --kube-reserved 被设定为 cpu=1,memory=2Gi,ephemeral-storage=1Gi
  • --system-reserved 被设定为 cpu=500m,memory=1Gi,ephemeral-storage=1Gi
  • --eviction-hard 被设定为 memory.available<500Mi,nodefs.available<10%

在这种情况下, 将 Allocatable 是 内存和 本地存储。调度程序确保 该节点上所有 Pod 的总内存不超过 ,存储不超过 . 每当 pod 之间的总内存使用量超过 时,Kubelet 就会驱逐 pod ,或者如果整个磁盘使用量超过, 如果节点上的所有进程都消耗尽可能多的 CPU,则 pod 加起来消耗的 CPU 不能超过 .14.5 CPUs28.5Gi98Girequests28.5Gi88Gi28.5Gi88Gi14.5 CPUs

如果 kube-reserved 和/或未 system-reserved 强制执行且系统守护程序超出其保留, kubelet 则每当总节点内存使用量高于 31.5Gistorage 大于 90Gi

您可以根据需要为带有 flag 的 Kubernetes 和带有 flag--kube-reserved 的系统分配任意数量-system-reserved

此外,如果您需要更严格的 pod 生成规则,您可以尝试使用Pod Affinity。


推荐阅读