【问题标题】:Kubernetes doesn't take into account total node memory usage when starting PodsKubernetes 在启动 Pod 时不考虑总节点内存使用量
【发布时间】:2018-11-01 08:34:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux memory kubernetes kubelet


    【解决方案1】:

    是的,分配资源的参数很少: 您可以为您的 pod 分配内存和 CPU,并为您的系统守护进程手动分配内存和 CPU。 In documentation 你可以通过这个例子找到它是如何工作的:

    示例场景

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

    • 节点具有32Gimemory16 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 将是内存的14.5 CPUs28.5Gi 和本地存储的98Gi。调度程序确保该节点上所有 pod 的总内存 requests 不超过 28.5Gi 并且存储不超过 88Gi。每当 pod 之间的总内存使用量超过 28.5Gi,或者如果总磁盘使用量超过 88Gi,如果节点上的所有进程都消耗尽可能多的 CPU,则 pod 加起来消耗的 CPU 不能超过 14.5 CPUs

    如果未强制执行 kube-reserved 和/或 system-reserved 并且系统守护程序超出其保留,则只要总节点内存使用量高于 31.5Gistorage 大于 90Gikubelet 就会驱逐 pod

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

    另外,如果你需要更严格的 pod 生成规则,你可以尝试使用Pod Affinity.

    【讨论】:

      【解决方案2】:

      Kubelet 具有参数--system-reserved,允许您为系统进程预留 cpu 和内存。

      它不是动态的(您仅在启动时保留资源),而是告诉 Kubelet 不要使用节点中的所有资源的唯一方法。

      --系统保留的mapStringString

      描述为非 kubernetes 组件保留的资源的一组 ResourceName=ResourceQuantity(例如 cpu=200m,memory=500Mi,ephemeral-storage=1Gi)对。目前仅支持 cpu 和 memory。有关更多详细信息,请参阅http://kubernetes.io/docs/user-guide/compute-resources。 [默认=无]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 2017-12-29
        • 2020-05-16
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多