第 4 章 配额和限值范围
资源配额由 ResourceQuota 对象定义,提供约束来限制各个项目的聚合资源消耗。它可根据类型限制项目中创建的对象数量,以及该项目中资源可以消耗的计算资源和存储的总和。
通过使用配额和限值范围,集群管理员可以设置限制来限制项目中所用计算资源的数量或计算资源的数量。这有助于集群管理员更好地管理和分配所有项目的资源,并确保没有项目不适合于集群大小。
配额由集群管理员设置,并可限定到给定项目。OpenShift Container Platform 项目所有者可以更改其项目的配额,但不能更改限制范围。OpenShift Container Platform 用户无法修改配额或限制范围。
以下小节帮助您了解如何检查配额和限值范围设置、它们可能会限制哪些类型,以及如何在自己的 pod 和容器中请求或限制计算资源。
4.1. 由配额管理的资源
资源配额由 ResourceQuota 对象定义,提供约束来限制各个项目的聚合资源消耗。它可根据类型限制项目中创建的对象数量,以及该项目中资源可以消耗的计算资源和存储的总和。
下文描述了可能通过配额管理的计算资源和对象类型的集合。
如果 status.phase
为 Failed
或 Succeeded
, 则 pod 处于终端状态。
资源名称 | 描述 |
---|---|
|
非终端状态的所有 Pod 的 CPU 请求总和不能超过这个值。 |
|
非终端状态的所有 Pod 的 内存请求总和不能超过这个值。 |
|
非终端状态的所有本地临时存储请求总和不能超过这个值。 |
|
非终端状态的所有 Pod 的 CPU 请求总和不能超过这个值。 |
|
非终端状态的所有 Pod 的 内存请求总和不能超过这个值。 |
|
非终端状态的所有临时存储请求总和不能超过这个值。 |
| 非终端状态的所有 Pod 的 CPU 限值总和不能超过这个值。 |
| 非终端状态的所有 Pod 的内存限值总和不能超过这个值。 |
| 非终端状态的所有 Pod 的临时存储限值总和不能超过这个值。只有在您启用了临时存储技术预览时,此资源才可用。此功能默认为禁用。 |
资源名称 | 描述 |
---|---|
| 处于任何状态的所有持久性卷声明的存储请求总和不能超过这个值。 |
| 项目中可以存在的持久性卷声明的总数。 |
| 在处于任何状态且具有匹配存储类的所有持久性卷声明中,存储请求总和不能超过这个值。 |
| 项目中可以存在的具有匹配存储类的持久性卷声明的总数。 |
资源名称 | 描述 |
---|---|
| 项目中可以存在的处于非终端状态的 Pod 总数。 |
| 项目中可以存在的复制控制器的总数。 |
| 项目中可以存在的资源配额总数。 |
| 项目中可以存在的服务总数。 |
| 项目中可以存在的 secret 的总数。 |
|
项目中可以存在的 |
| 项目中可以存在的持久性卷声明的总数。 |
| 项目中可以存在的镜像流的总数。 |
您可以为这些命名空间的资源类型使用 count/<resource>.<group>
语法配置一个对象数配额。
$ oc create quota <name> --hard=count/<resource>.<group>=<quota> 1
4.1.1. 为扩展资源设定资源配额
扩展资源不允许过量使用资源,因此您必须在配额中为相同扩展资源指定 requests
和 limits
。目前,扩展资源只允许使用带有前缀 requests.
配额项。以下是如何为 GPU 资源 nvidia.com/gpu
设置资源配额的示例场景。
流程
要确定集群中的一个节点中有多少可用 GPU,使用以下命令:
$ oc describe node ip-172-31-27-209.us-west-2.compute.internal | egrep 'Capacity|Allocatable|gpu'
输出示例
openshift.com/gpu-accelerator=true Capacity: nvidia.com/gpu: 2 Allocatable: nvidia.com/gpu: 2 nvidia.com/gpu: 0 0
本例中有 2 个 GPU 可用。
在命名空间
nvidia
中设置配额。本例中配额为1
:$ cat gpu-quota.yaml
输出示例
apiVersion: v1 kind: ResourceQuota metadata: name: gpu-quota namespace: nvidia spec: hard: requests.nvidia.com/gpu: 1
使用以下命令创建 pod:
$ oc create -f gpu-quota.yaml
输出示例
resourcequota/gpu-quota created
使用以下命令验证命名空间是否设置了正确的配额:
$ oc describe quota gpu-quota -n nvidia
输出示例
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1
运行以下命令,运行一个请求单个 GPU 的 pod:
$ oc create pod gpu-pod.yaml
输出示例
apiVersion: v1 kind: Pod metadata: generateName: gpu-pod-s46h7 namespace: nvidia spec: restartPolicy: OnFailure containers: - name: rhel7-gpu-pod image: rhel7 env: - name: NVIDIA_VISIBLE_DEVICES value: all - name: NVIDIA_DRIVER_CAPABILITIES value: "compute,utility" - name: NVIDIA_REQUIRE_CUDA value: "cuda>=5.0" command: ["sleep"] args: ["infinity"] resources: limits: nvidia.com/gpu: 1
使用以下命令验证 pod 是否正在运行:
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1m
运行以下命令,检查配额
Used
计数是否正确:$ oc describe quota gpu-quota -n nvidia
输出示例
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1
使用以下命令,尝试在
nvidia
命名空间中创建第二个 GPU pod。从技术上讲这是可行的,因为它有 2 个 GPU:$ oc create -f gpu-pod.yaml
输出示例
Error from server (Forbidden): error when creating "gpu-pod.yaml": pods "gpu-pod-f7z2w" is forbidden: exceeded quota: gpu-quota, requested: requests.nvidia.com/gpu=1, used: requests.nvidia.com/gpu=1, limited: requests.nvidia.com/gpu=1
应该会显示此
Forbidden
错误消息,因为您有设为 1 个 GPU 的配额,但这一 Pod 试图分配第二个 GPU,而这超过了配额。
4.1.2. 配额范围
每个配额都有一组关联的范围。配额只在与枚举的范围交集匹配时才会测量资源的使用量。
为配额添加范围会限制该配额可应用的资源集合。指定允许的集合之外的资源会导致验证错误。
影响范围 | 描述 |
---|---|
|
匹配 |
|
匹配 |
|
匹配 |
|
匹配 |
BestEffort
范围将配额仅限为限制以下资源:
-
pods
Terminating
、NotTerminating
和 NotBestEffort
范围将配额仅限为跟踪以下资源:
-
pods
-
memory
-
requests.memory
-
limits.memory
-
cpu
-
requests.cpu
-
limits.cpu
-
ephemeral-storage
-
requests.ephemeral-storage
-
limits.ephemeral-storage
只有在启用了临时存储技术预览功能时,才会应用临时存储请求和限值。此功能默认为禁用。
其他资源
有关计算资源的更多信息 , 请参阅配额管理的资源。
有关提交计算资源的更多信息,请参阅 服务质量类。