【问题标题】:How exactly k8s reserves resources for a namespace?k8s 究竟是如何为命名空间预留资源的?
【发布时间】:2019-08-17 18:38:51
【问题描述】:

我对 ns 的请求/限制配额有以下疑问:

考虑以下命名空间资源设置: - 请求:1 个核心/1GiB - 限制:2 核/2GiB

  1. 这是否意味着命名空间保证有 1/1GiB?它是如何在集群节点上物理实现的?这是否意味着 k8s 以某种方式严格为 ns 保留这些值(在创建时)?在哪个时间点进行预订?

  2. 限制 2 core/2GiB - 这是否意味着它不能保证 ns 并且取决于当前集群的状态?就像当前集群只有 100MiB 的可用内存,但在运行时 pod 需要比资源请求多 200Mib - pod 会重新启动?如果 pod 需要超过它的请求,k8s 会在哪里获取这个资源?

  3. 关于 namespace granularity 和 k8s 水平自动缩放:假设我们有 2 个应用程序和 2 个命名空间 - 每个应用程序 1 ns。我们设置了两个 ns 配额,以便为 2 个额外的 pod 提供一些空闲缓冲区,并在一定 CPU 阈值的情况下水平自动扩展至 2 个 pod。那么,进行这样的设置真的有意义吗?我担心的是,如果 NS 保留了它的资源并且没有其他 ns 可以使用它们 - 我们可以在每个 ns 副本集中创建 2 个额外的 pod,而没有自动缩放,不断使用这些 pod。如果我们在 1 ns 内有超过 1 个应用程序,我可以看到使用自动缩放的意义,这样这些应用程序可以共享相同的资源缓冲区以进行缩放。这个假设正确吗?

  4. 您认为每个应用程序有 1 ns 是一个好习惯吗?为什么?

附言我知道资源请求/限制是什么以及它们之间的区别。在大多数信息源中,只有非常高级的概念解释。

提前致谢。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    docs 明确声明如下:

    在集群总容量小于命名空间配额之和的情况下,可能会发生资源争用。这是按照先到先得的原则处理的。

    ResourceQuotas 独立于集群容量。它们以绝对单位表示。因此,如果您将节点添加到集群中,这不会自动使每个命名空间能够消耗更多资源。

    资源配额划分聚合集群资源,但它对节点没有限制:来自多个命名空间的 pod 可以在同一个节点上运行

    ResourceQuotas是在命名空间中设置的约束,不预留容量,它只是设置了每个命名空间可以消耗的资源限制。

    为了有效地“保留”容量,您必须对所有命名空间设置限制,以便其他命名空间使用的资源不会超过集群所能提供的资源。通过这种方式,您可以更加保证命名空间将有可用容量来运行它们的负载。

    文档建议:

    • 按比例将总集群资源分配给多个团队(命名空间)。
    • 允许每个团队根据需要增加资源使用量,但要有足够的限制以防止意外的资源耗尽。
    • 检测来自一个命名空间的需求,添加节点并增加配额。

    鉴于此,您的问题的答案是:

    1. 这不是预留容量,预留发生在资源(pod)创建时。

    2. 保留后运行资源不受影响。如果资源创建将超过配额(限制),则会拒绝新资源

    3. 如文档中所述,如果限制高于容量,则预订将以先到先得的方式进行。

    4. 简单来说,这个问题可以在 SO 中变成自己的问题,用于资源隔离和管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2015-11-16
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多