限制范围

默认情况下,容器在 Kubernetes 集群上运行时,其计算资源不受限制 计算资源。 使用 Kubernetes 资源配额,管理员(也称为*集群运维人员*)可以限制在指定的 命名空间 内消耗和创建集群资源(例如 CPU 时间、内存和持久存储)。 在命名空间内,Pod 可以消耗应用于该命名空间的 ResourceQuotas 所允许的 CPU 和内存。 作为集群运维人员或命名空间级别的管理员,你可能还关心确保单个对象不能独占命名空间内的所有可用资源。

LimitRange 是一种策略,用于约束你可以为命名空间中的每个适用对象类型(例如 Pod 或 PersistentVolumeClaim)指定的资源分配(限制和请求)。

LimitRange 提供的约束可以

  • 强制执行命名空间中每个 Pod 或容器的最小和最大计算资源使用量。
  • 强制执行命名空间中每个 PersistentVolumeClaim 的最小和最大存储请求。
  • 强制执行命名空间中资源的请求和限制之间的比率。
  • 设置命名空间中计算资源的默认请求/限制,并在运行时自动将其注入到容器中。

当命名空间中存在 LimitRange 对象时,将在该特定命名空间中强制执行 LimitRange。

LimitRange 对象的名称必须是有效的 DNS 子域名

对资源限制和请求的约束

  • 管理员在命名空间中创建 LimitRange。
  • 用户在该命名空间中创建(或尝试创建)对象,例如 Pod 或 PersistentVolumeClaims。
  • 首先,LimitRange 准入控制器会为所有未设置计算资源需求的 Pod(及其容器)应用默认请求和限制值。
  • 其次,LimitRange 会跟踪使用情况,以确保它不超过命名空间中存在的任何 LimitRange 中定义的资源最小值、最大值和比率。
  • 如果你尝试创建或更新违反 LimitRange 约束的对象(Pod 或 PersistentVolumeClaim),则你对 API 服务器的请求将失败,并显示 HTTP 状态代码 403 Forbidden 以及解释违反的约束的消息。
  • 如果你在命名空间中添加了一个应用于计算相关资源(例如 cpumemory)的 LimitRange,则必须为这些值指定请求或限制。 否则,系统可能会拒绝 Pod 创建。
  • LimitRange 验证仅在 Pod 准入阶段进行,而不是在运行的 Pod 上进行。 如果你添加或修改了 LimitRange,则该命名空间中已存在的 Pod 将继续保持不变。
  • 如果命名空间中存在两个或多个 LimitRange 对象,则将应用哪个默认值是不确定的。

LimitRange 和 Pod 的准入检查

LimitRange 不会 检查其应用的默认值的一致性。 这意味着由 LimitRange 设置的*限制*的默认值可能小于客户端提交给 API 服务器的规范中为容器指定的*请求*值。 如果发生这种情况,最终的 Pod 将无法调度。

例如,你使用以下清单定义了一个 LimitRange

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
  - default: # this section defines default limits
      cpu: 500m
    defaultRequest: # this section defines default requests
      cpu: 500m
    max: # max and min define the limit range
      cpu: "1"
    min:
      cpu: 100m
    type: Container

以及一个声明了 700m 的 CPU 资源请求但没有限制的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: example-conflict-with-limitrange-cpu
spec:
  containers:
  - name: demo
    image: registry.k8s.io/pause:2.0
    resources:
      requests:
        cpu: 700m

那么该 Pod 将不会被调度,并会失败并显示类似于以下内容的错误

Pod "example-conflict-with-limitrange-cpu" is invalid: spec.containers[0].resources.requests: Invalid value: "700m": must be less than or equal to cpu limit

如果你同时设置了 requestlimit,那么即使使用相同的 LimitRange,新的 Pod 也会被成功调度

apiVersion: v1
kind: Pod
metadata:
  name: example-no-conflict-with-limitrange-cpu
spec:
  containers:
  - name: demo
    image: registry.k8s.io/pause:2.0
    resources:
      requests:
        cpu: 700m
      limits:
        cpu: 700m

示例资源约束

可以使用 LimitRange 创建的策略示例如下

  • 在一个具有 8 GiB RAM 和 16 个核心的 2 节点集群中,将命名空间中的 Pod 限制为请求 100m 的 CPU,CPU 的最大限制为 500m,请求 200Mi 的内存,内存的最大限制为 600Mi。
  • 为在其规范中未启动 CPU 和内存请求的容器定义默认 CPU 限制和请求为 150m,默认内存请求为 300Mi。

如果命名空间的总限制小于 Pod/容器的限制总和,则可能会出现资源争用。 在这种情况下,将不会创建容器或 Pod。

争用和 LimitRange 的更改都不会影响已创建的资源。

下一步

有关使用限制的示例,请参阅

有关上下文和历史信息,请参阅 LimitRanger 设计文档

上次修改时间:2024 年 3 月 14 日下午 2:28 PST:添加元数据以使用 API 参考链接机制 (c889d9b251)