cpu
以下描述了可以由配额管理的计算资源和对象类型的集合。
如果 |
资源名称 | 描述 |
---|---|
|
非终端状态下所有 Pod 的 CPU 请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的内存请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的 CPU 请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的内存请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的 CPU 限制总和不能超过此值。 |
|
非终端状态下所有 Pod 的内存限制总和不能超过此值。 |
资源名称 | 描述 |
---|---|
|
任何状态下所有持久卷声明的存储请求总和不能超过此值。 |
|
项目中可以存在的持久卷声明总数。 |
|
任何状态下所有具有匹配存储类的持久卷声明的存储请求总和不能超过此值。 |
|
项目中可以存在的具有匹配存储类的持久卷声明总数。 |
|
非终端状态下所有 Pod 的本地临时存储请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的临时存储请求总和不能超过此值。 |
|
非终端状态下所有 Pod 的临时存储限制总和不能超过此值。 |
资源名称 | 描述 |
---|---|
|
项目中可以存在的非终端状态 Pod 总数。 |
|
项目中可以存在的副本控制器总数。 |
|
项目中可以存在的资源配额总数。 |
|
项目中可以存在的服务总数。 |
|
项目中可以存在的类型为 |
|
项目中可以存在的 |
|
项目中可以存在的密钥总数。 |
|
项目中可以存在的 |
|
项目中可以存在的持久卷声明总数。 |
|
项目中可以存在的镜像流总数。 |
每个配额可以有一组关联的范围。只有当配额与枚举范围的交集匹配时,它才会衡量资源的使用情况。
向配额添加范围会限制该配额可以应用到的资源集。指定允许集之外的资源会导致验证错误。
范围 |
描述 |
|
匹配具有 |
|
匹配不具有 |
BestEffort
范围将配额限制为限制以下资源
pods
NotBestEffort
范围将配额限制为跟踪以下资源
pods
memory
requests.memory
limits.memory
cpu
requests.cpu
limits.cpu
项目资源配额首次创建后,项目会限制创建任何可能违反配额约束的新资源的能力,直到它计算出更新的使用情况统计数据。
配额创建并更新使用情况统计数据后,项目将接受新内容的创建。创建或修改资源时,您的配额使用量会在创建或修改资源的请求后立即递增。
删除资源时,您的配额使用量将在项目配额统计数据的下次完整重新计算期间递减。可配置的时间量决定了将配额使用情况统计数据减少到其当前观察到的系统值所需的时间。
如果项目修改超过了配额使用限制,服务器将拒绝该操作,并向用户返回相应的错误消息,解释违反的配额约束以及他们在系统中当前观察到的使用情况统计数据。
分配计算资源时,每个容器都可能为CPU、内存和临时存储分别指定请求值和限制值。配额可以限制这些值中的任何一个。
如果配额为requests.cpu
或requests.memory
指定了值,则它要求每个传入容器都对这些资源发出明确的请求。如果配额为limits.cpu
或limits.memory
指定了值,则它要求每个传入容器都为这些资源指定明确的限制。
core-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: core-object-counts
spec:
hard:
configmaps: "10" (1)
persistentvolumeclaims: "4" (2)
replicationcontrollers: "20" (3)
secrets: "10" (4)
services: "10" (5)
services.loadbalancers: "2" (6)
1 | 项目中可以存在的ConfigMap 对象总数。 |
2 | 项目中可以存在的持久卷声明 (PVC) 的总数。 |
3 | 项目中可以存在的副本控制器的总数。 |
4 | 项目中可以存在的密钥总数。 |
5 | 项目中可以存在的服务总数。 |
6 | 项目中可以存在的类型为LoadBalancer 的服务总数。 |
openshift-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: openshift-object-counts
spec:
hard:
openshift.io/imagestreams: "10" (1)
1 | 项目中可以存在的镜像流总数。 |
compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4" (1)
requests.cpu: "1" (2)
requests.memory: 1Gi (3)
limits.cpu: "2" (4)
limits.memory: 2Gi (5)
1 | 项目中可以存在的非终端状态 Pod 总数。 |
2 | 在所有非终止状态的Pod中,CPU请求总和不能超过1个核心。 |
3 | 在所有非终止状态的Pod中,内存请求总和不能超过1Gi。 |
4 | 在所有非终止状态的Pod中,CPU限制总和不能超过2个核心。 |
5 | 在所有非终止状态的Pod中,内存限制总和不能超过2Gi。 |
besteffort.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: besteffort
spec:
hard:
pods: "1" (1)
scopes:
- BestEffort (2)
1 | 项目中可以存在的具有BestEffort 服务质量的非终止状态Pod总数。 |
2 | 将配额限制为仅匹配内存或CPU具有BestEffort 服务质量的Pod。 |
compute-resources-long-running.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources-long-running
spec:
hard:
pods: "4" (1)
limits.cpu: "4" (2)
limits.memory: "2Gi" (3)
scopes:
- NotTerminating (4)
1 | 非终止状态的Pod总数。 |
2 | 在所有非终止状态的Pod中,CPU限制总和不能超过此值。 |
3 | 在所有非终止状态的Pod中,内存限制总和不能超过此值。 |
4 | 将配额限制为仅匹配spec.activeDeadlineSeconds 设置为nil 的Pod。除非应用了RestartNever 策略,否则构建Pod属于NotTerminating 。 |
compute-resources-time-bound.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources-time-bound
spec:
hard:
pods: "2" (1)
limits.cpu: "1" (2)
limits.memory: "1Gi" (3)
scopes:
- Terminating (4)
1 | 终止状态的Pod总数。 |
2 | 在所有终止状态的Pod中,CPU限制总和不能超过此值。 |
3 | 在所有终止状态的Pod中,内存限制总和不能超过此值。 |
4 | 将配额限制为仅匹配spec.activeDeadlineSeconds >=0 的Pod。例如,此配额会对构建或部署程序 Pod 收费,但不计费给长时间运行的 Pod,例如 Web 服务器或数据库。 |
storage-consumption.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-consumption
spec:
hard:
persistentvolumeclaims: "10" (1)
requests.storage: "50Gi" (2)
gold.storageclass.storage.k8s.io/requests.storage: "10Gi" (3)
silver.storageclass.storage.k8s.io/requests.storage: "20Gi" (4)
silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5" (5)
bronze.storageclass.storage.k8s.io/requests.storage: "0" (6)
bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0" (7)
requests.ephemeral-storage: 2Gi (8)
limits.ephemeral-storage: 4Gi (9)
1 | 项目中持久卷声明的总数 |
2 | 项目中所有持久卷声明的存储请求总和不能超过此值。 |
3 | 项目中所有持久卷声明中,gold存储类中请求的存储总和不能超过此值。 |
4 | 项目中所有持久卷声明中,silver存储类中请求的存储总和不能超过此值。 |
5 | 项目中所有持久卷声明中,silver存储类中的声明总数不能超过此值。 |
6 | 项目中所有持久卷声明中,bronze存储类中请求的存储总和不能超过此值。当设置为0 时,表示bronze存储类不能请求存储。 |
7 | 项目中所有持久卷声明中,bronze存储类中请求的存储总和不能超过此值。当设置为0 时,表示bronze存储类不能创建声明。 |
8 | 在所有非终止状态的Pod中,临时存储请求总和不能超过2Gi。 |
9 | 在所有非终止状态的Pod中,临时存储限制总和不能超过4Gi。 |
您可以创建配额来限制给定项目中的资源使用情况。
在一个文件中定义配额。
使用该文件创建配额并将其应用于项目
$ oc create -f <file> [-n <project_name>]
例如
$ oc create -f core-object-counts.yaml -n demoproject
您可以为OpenShift Dedicated上的所有标准命名空间资源类型(例如BuildConfig
和DeploymentConfig
对象)创建对象计数配额。对象配额计数会对所有标准命名空间资源类型设置已定义的配额。
使用资源配额时,对象在创建时会计入配额。这些类型的配额对于防止资源耗尽非常有用。只有当项目中有足够的剩余资源时,才能创建配额。
要为资源配置对象计数配额
运行以下命令
$ oc create quota <name> \
--hard=count/<resource>.<group>=<quota>,count/<resource>.<group>=<quota> (1)
1 | <resource> 变量是资源的名称,<group> 是API组(如果适用)。使用oc api-resources 命令可以列出资源及其关联的API组。 |
例如
$ oc create quota test \
--hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4
resourcequota "test" created
此示例将列出的资源限制为集群中每个项目的硬性限制。
验证配额是否已创建
$ oc describe quota test
Name: test
Namespace: quota
Resource Used Hard
-------- ---- ----
count/deployments.extensions 0 2
count/pods 0 3
count/replicasets.extensions 0 4
count/secrets 0 4
扩展资源不允许资源超额使用,因此您必须在配额中为相同的扩展资源指定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可用。
创建一个ResourceQuota
对象以在nvidia
命名空间中设置配额。在这个例子中,配额为1
apiVersion: v1
kind: ResourceQuota
metadata:
name: gpu-quota
namespace: nvidia
spec:
hard:
requests.nvidia.com/gpu: 1
创建配额
# 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。以下示例定义文件名为gpu-pod.yaml
apiVersion: v1
kind: Pod
metadata:
generateName: gpu-pod-
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 create -f gpu-pod.yaml
验证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
由于您只有一个GPU的配额,而此Pod尝试分配第二个GPU,这超出了其配额,因此出现此禁止错误消息是预期的。
您可以通过在Web控制台中导航到项目的配额页面来查看与项目配额中定义的任何硬性限制相关的使用情况统计信息。
您也可以使用CLI查看配额详细信息。
获取项目中定义的配额列表。例如,对于名为demoproject
的项目
$ oc get quota -n demoproject
NAME AGE REQUEST LIMIT
besteffort 4s pods: 1/2
compute-resources-time-bound 10m pods: 0/2 limits.cpu: 0/1, limits.memory: 0/1Gi
core-object-counts 109s configmaps: 2/10, persistentvolumeclaims: 1/4, replicationcontrollers: 1/20, secrets: 9/10, services: 2/10
描述您感兴趣的配额,例如core-object-counts
配额
$ oc describe quota core-object-counts -n demoproject
Name: core-object-counts
Namespace: demoproject
Resource Used Hard
-------- ---- ----
configmaps 3 10
persistentvolumeclaims 0 4
replicationcontrollers 3 20
secrets 9 10
services 2 10
在项目请求模板中配置显式资源配额,以便在新项目中应用特定的资源配额。
具有cluster-admin角色的用户对集群的访问权限。
安装OpenShift CLI (oc
)。
向项目请求模板添加资源配额定义
如果集群中不存在项目请求模板
创建一个引导项目模板并将其输出到名为template.yaml
的文件中
$ oc adm create-bootstrap-project-template -o yaml > template.yaml
向template.yaml
添加资源配额定义。以下示例定义了一个名为“storage-consumption”的资源配额。该定义必须添加到模板中的parameters:
部分之前
- apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-consumption
namespace: ${PROJECT_NAME}
spec:
hard:
persistentvolumeclaims: "10" (1)
requests.storage: "50Gi" (2)
gold.storageclass.storage.k8s.io/requests.storage: "10Gi" (3)
silver.storageclass.storage.k8s.io/requests.storage: "20Gi" (4)
silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5" (5)
bronze.storageclass.storage.k8s.io/requests.storage: "0" (6)
bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0" (7)
1 | 项目中持久卷声明的总数。 |
2 | 项目中所有持久卷声明的存储请求总和不能超过此值。 |
3 | 项目中所有持久卷声明中,gold存储类中请求的存储总和不能超过此值。 |
4 | 项目中所有持久卷声明中,silver存储类中请求的存储总和不能超过此值。 |
5 | 项目中所有持久卷声明中,silver存储类中的声明总数不能超过此值。 |
6 | 在项目中的所有持久卷声明中,在bronze存储类中请求的存储总和不能超过此值。当此值设置为0 时,bronze存储类无法请求存储。 |
7 | 在项目中的所有持久卷声明中,在bronze存储类中请求的存储总和不能超过此值。当此值设置为0 时,bronze存储类无法创建声明。 |
从openshift-config
命名空间中修改后的template.yaml
文件创建项目请求模板
$ oc create -f template.yaml -n openshift-config
要将配置作为 |
默认情况下,模板名为project-request
。
如果集群中已存在项目请求模板
如果您使用配置文件声明式或命令式地管理集群中的对象,请改通过这些文件编辑现有的项目请求模板。 |
列出openshift-config
命名空间中的模板
$ oc get templates -n openshift-config
编辑现有的项目请求模板
$ oc edit template <project_request_template> -n openshift-config
将资源配额定义(例如前面的storage-consumption
示例)添加到现有模板中。该定义必须添加到模板中的parameters:
部分之前。
如果您创建了项目请求模板,请在集群的项目配置资源中引用它
访问项目配置资源进行编辑
使用Web控制台
导航到管理→集群设置页面。
单击配置以查看所有配置资源。
找到项目的条目并单击编辑YAML。
使用CLI
编辑project.config.openshift.io/cluster
资源
$ oc edit project.config.openshift.io/cluster
更新项目配置资源的spec
部分以包含projectRequestTemplate
和name
参数。以下示例引用默认项目请求模板名称project-request
apiVersion: config.openshift.io/v1
kind: Project
metadata:
# ...
spec:
projectRequestTemplate:
name: project-request
验证创建项目时是否应用了资源配额
创建一个项目
$ oc new-project <project_name>
列出项目的资源配额
$ oc get resourcequotas
详细描述资源配额
$ oc describe resourcequotas <resource_quota_name>