默认情况下, Kubernetes 集群上的容器运行使用的[计算资源]没有限制。
使用 Kubernetes [资源配额],
管理员(也称为 集群操作者)可以在一个指定的内限制集群资源的使用与创建。
在命名空间中,一个 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。
作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个 Pod 不会垄断命名空间内所有可用的资源。
LimitRange 是限制命名空间内可为每个适用的对象类别
(例如 Pod 或 )
指定的资源分配量(限制和请求)的策略对象。
一个 LimitRange(限制范围) 对象提供的限制能够做到:
当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。
LimitRange 的名称必须是合法的
[DNS 子域名]。
LimitRange
对象。LimitRanger
准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值。LimitRange
跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange
所定义的最小、最大资源使用量以及使用量比值。LimitRange
的约束,403 Forbidden
以及描述哪一项约束被违反的消息。LimitRange
启用了对 cpu
和 memory
等计算相关资源的限制,LimitRange
的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。LimitRange
对象,应用哪个默认值是不确定的。LimitRange
不 检查所应用的默认值的一致性。
这意味着 LimitRange
设置的 limit 的默认值可能小于客户端提交给 API 服务器的规约中为容器指定的 request 值。
如果发生这种情况,最终 Pod 将无法调度。
例如,你使用如下清单定义一个 LimitRange
:
以及一个声明 CPU 资源请求为 700m
但未声明限制值的 Pod:
那么该 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
如果你同时设置了 request
和 limit
,那么即使使用相同的 LimitRange
,新 Pod 也会被成功调度:
能够使用限制范围创建的策略示例有:
在命名空间的总限制值小于 Pod 或 Container 的限制值的总和的情况下,可能会产生资源竞争。
在这种情况下,将不会创建 Container 或 Pod。
竞争和对 LimitRange 的改变都不会影响任何已经创建了的资源。
关于使用限值的例子,可参阅:
有关上下文和历史信息,请参阅 [LimitRanger 设计文档]。