Kubernetes资源限制范围

2023-11-08 41

一般情况下,Kubernetes 集群上的容器运行使用的计算资源没有限制。使用 Kubernetes 资源配额,管理员(也称为集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。作为集群操作者或命名空间级的管理员,可能也会担心如何确保一个 Pod 不会垄断命名空间内所有可用的资源。

LimitRange 是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制;
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制;
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制;
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。

当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施 LimitRange 限制。

注意:LimitRange 的名称必须是合法的 DNS 子域名。

一、资源限制和请求约束

1、管理员在一个命名空间内创建一个 LimitRange 对象;

2、用户在此命名空间内创建(或尝试创建) Pod 和 PersistentVolumeClaim 等对象;

3、首先,LimitRanger 准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值;

4、其次,LimitRange 跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 所定义的最小、最大资源使用量以及使用量比值;

5、若尝试创建或更新的对象(Pod 和 PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 Forbidden 以及描述哪一项约束被违反的消息;

6、若在命名空间中添加 LimitRange 启用了对 cpu 和 memory 等计算相关资源的限制, 必须指定这些值的请求使用量与限制使用量。否则,系统将会拒绝创建 Pod;

7、LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 如果添加或修改 LimitRange,命名空间中已存在的 Pod 将继续不变;

8、如果命名空间中存在两个或更多 LimitRange 对象,应用哪个默认值是不确定的。

二、Pod的LimitRange和准入检查

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

为了解决这个问题,可以在 LimitRange 中设置一个默认值,以确保在没有客户端提交请求的情况下,容器的请求值不会小于这个默认值。这样,即使客户端没有指定请求值,Pod 仍然可以调度。

例如,使用如下清单定义一个 LimitRange:

apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default: # 此处定义默认限制值
cpu: 500m
defaultRequest: # 此处定义默认请求值
cpu: 500m
max: # max 和 min 定义限制范围
cpu: "1"
min:
cpu: 100m
type: Container

以及一个声明 CPU 资源请求为 700m 但未声明限制值的 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

三、资源约束示例

能够使用限制范围创建的策略示例有:

1、在一个有两个节点,8 GiB 内存与16个核的集群中,限制一个命名空间的 Pod 申请 100m 单位,最大 500m 单位的 CPU,以及申请 200Mi,最大 600Mi 的内存。
为 spec 中没有 cpu 和内存需求值的 Container 定义默认 CPU 限制值与需求值 150m,内存默认需求值 300Mi。

2、在命名空间的总限制值小于 Pod 或 Container 的限制值的总和的情况下,可能会产生资源竞争。 在这种情况下,将不会创建 Container 或 Pod。

注意:竞争和对 LimitRange 的改变都不会影响任何已经创建了的资源。

  • 广告合作

  • QQ群号:707632017

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。