【问题标题】:Using k8s node resources out of k8s使用k8s外的k8s节点资源
【发布时间】:2019-12-26 20:37:28
【问题描述】:

如果我有一个 kubernetes 节点,kubernetes 调度会发生什么,但我将容器 (docker) 引擎用于其他一些东西,在 kubernetes 的上下文之外。

例如,如果我手动 SSH 到相应的节点并执行 docker run 某事。 Kubernetes 调度是否会考虑到这个节点正忙于运行其他东西,并且它现在可能无法托管任何其他容器?

在以下情况下会发生什么:

  • 具有 8 GB RAM 的节点
  • 运行资源请求 2 GB、限制 4 GB 和当前使用量 3 GB 的 pod
  • 节点上的 ssh 和 docker run 一个 5 GB 的容器,全部使用

附:请跳过“你为什么要直接在节点上运行docker run”问题。我不想,但有原因。

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    我很确定 Kubernetes 的调度只考虑 (a) 它知道的 pod 而不是其他资源,以及 (b) 只考虑它们的资源请求。

    在您描述的情况下,正是利用该资源利用率,一切都会好起来的。可以在节点上调度 pod,因为使用它的总资源请求是 8 GB 中的 2 GB。总内存使用量也没有超过物理内存大小,所以没关系。

    假设 pod 分配了更多内存。现在整个系统都超过了它的物理内存容量,所以 Linux 内核会任意杀死一些东西。这通常是最大的事情。您通常会在管理它的任何系统中看到退出代码 137(匹配 SIGKILL)。

    即使你在 DaemonSet 之类的东西中运行你的副业,这种行为也是一样的。它需要 2 GB 的 RAM,因此两个 pod 都适合同一个节点 [4 GB/8 GB],但如果它的资源限制为 6 GB RAM,就会被杀死。

    情况不同的地方在于您是否可以预测高内存使用情况。假设您的 pod 请求 3 GB/限制 6 GB 的 RAM,并且您的辅助进程可以预见也将使用 6 GB。如果你只是 docker run 它肯定会被 OOM 杀死。如果您将它作为一个声明 6 GB 内存请求的 DaemonSet 运行,Kubernetes 调度程序将知道该 pod 不适合并且不会将其放置在那里(如果无法在任何地方调度它,它可能会卡在“Pending”状态)。

    【讨论】:

      【解决方案2】:

      Kubernetes 不会看到主机上运行的其他进程,但是您可以告诉该主机上的 kubelet 为主机本身保留多少主机资源,防止 Kubernetes 调度超出主机容量的 Pod。查看可以传递给 kubelet 的 --system-reserved flag

      --system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
      

      【讨论】:

        猜你喜欢
        • 2019-08-28
        • 2022-12-06
        • 2019-04-25
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        相关资源
        最近更新 更多