限制范围
默认情况下,容器在 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
以及解释违反的约束的消息。 - 如果你在命名空间中添加了一个应用于计算相关资源(例如
cpu
和memory
)的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
如果你同时设置了 request
和 limit
,那么即使使用相同的 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 的更改都不会影响已创建的资源。
下一步
有关使用限制的示例,请参阅
- 如何配置每个命名空间的最小和最大 CPU 约束.
- 如何配置每个命名空间的最小和最大内存约束.
- 如何配置每个命名空间的默认 CPU 请求和限制.
- 如何配置每个命名空间的默认内存请求和限制.
- 如何配置每个命名空间的最小和最大存储消耗.
- 有关配置每个命名空间的配额的详细示例。
有关上下文和历史信息,请参阅 LimitRanger 设计文档。