8.3. 使用限制范围限制资源消耗
默认情况下,容器在 OpenShift Dedicated 集群中使用未绑定的计算资源运行。通过限制范围,您可以限制项目中特定对象的资源消耗:
- pod 和容器:您可以为 pod 及其容器设置 CPU 和内存的最小和最大要求。
-
镜像流:您可以设置
ImageStream对象中的镜像和标签数量的限制。 - 镜像:您可以限制可推送到内部 registry 的镜像大小。
- 持久性卷声明(PVC):您可以限制请求的 PVC 的大小。
如果 pod 未满足限制范围强制的限制,则无法在命名空间中创建 pod。
8.3.1. 关于限制范围 复制链接链接已复制到粘贴板!
LimitRange 对象定义的限值范围限制项目中的资源消耗。在项目中,您可以为 pod、容器、镜像、镜像流或持久性卷声明(PVC)设置特定资源限值。
要创建和修改资源的所有请求都会针对项目中的每个 LimitRange 对象进行评估。如果资源违反了任何限制,则会拒绝该资源。
以下显示了所有组件的限制范围对象: pod、容器、镜像、镜像流或 PVC。您可以在同一对象中为这些组件的一个或多个组件配置限值。您可以为每个要控制资源的项目创建不同的限制范围对象。
容器的限制范围对象示例
8.3.1.1. 关于组件限制 复制链接链接已复制到粘贴板!
以下示例显示每个组件的限制范围参数。为清楚起见,示例已被分隔。您可以根据需要为任何或所有组件创建一个 LimitRange 对象。
8.3.1.1.1. 容器限制 复制链接链接已复制到粘贴板!
通过限制范围,您可以指定 pod 中每个容器可以请求的特定项目的最小和最大 CPU 和内存。如果在项目中创建容器,则 Pod spec 中的容器 CPU 和内存请求必须符合 LimitRange 对象中设置的值。如果没有,则 pod 不会被创建。
-
对于在
LimitRange对象中指定的容器,容器 CPU 或内存请求和限制必须大于或等于min资源约束。 容器 CPU 或内存请求和限制必须小于或等于
LimitRange对象中指定的容器的max资源约束。如果
LimitRange对象定义了maxCPU,则不需要在Podspec 中定义 CPU请求(request)值。但您必须指定一个 CPUlimit值,它需要满足在限制范围中指定的最大 CPU 限值。容器限制与请求的比例必须小于或等于
LimitRange对象中指定的容器的maxLimitRequestRatio值。如果
LimitRange对象定义了maxLimitRequestRatio约束,则任何新容器都必须同时具有request和limit值。OpenShift Dedicated 通过将limit除以request来计算限制与请求的比率。这个值应该是大于 1 的非负整数。例如,如果容器的
limit值中包括cpu: 500,request值中包括cpu: 100,则cpu的限制与请求的比率是5。这个比例必须小于或等于maxLimitRequestRatio。
如果 Pod spec 没有指定容器资源内存或限制,则将限制范围对象中指定的容器的 default 或 defaultRequest CPU 和内存值分配给容器。
容器 LimitRange 对象定义
8.3.1.1.2. Pod 限值 复制链接链接已复制到粘贴板!
限制范围允许您为给定项目中所有 pod 的容器指定最小和最大 CPU 和内存限值。要在项目中创建容器,Pod spec 中的容器 CPU 和内存请求必须符合 LimitRange 对象中设置的值。如果没有,则 pod 不会被创建。
如果 Pod spec 没有指定容器资源内存或限制,则将限制范围对象中指定的容器的 default 或 defaultRequest CPU 和内存值分配给容器。
在 pod 中的所有容器中,需要满足以下条件:
-
对于在
LimitRange对象中指定的 pod,容器 CPU 或内存请求和限制必须大于或等于min资源约束。 -
容器 CPU 或内存请求和限制必须小于或等于
LimitRange对象中指定的 pod 的max资源约束。 -
容器限制与请求的比例必须小于或等于
LimitRange对象中指定的maxLimitRequestRatio约束。
Pod LimitRange 对象定义
8.3.1.1.3. 镜像限制 复制链接链接已复制到粘贴板!
LimitRange 对象允许您指定可推送到 OpenShift 镜像 registry 的镜像的最大大小。
将镜像推送到 OpenShift 镜像 registry 时,必须满足以下条件:
-
镜像的大小必须小于或等于
LimitRange对象中指定的镜像的最大值。
镜像 LimitRange 对象定义
在上传的镜像清单中,镜像大小并非始终可用。这对使用 Docker 1.10 或更高版本构建并推送到 v2 registry 的镜像来说尤为如此。如果这样的镜像使用旧的 Docker 守护进程拉取,由 registry 将镜像清单转换为 schema v1 时缺少了所有与大小相关的信息。镜像没有设置存储限制会阻止镜像被上传。
这个问题正在被决。
8.3.1.1.4. 镜像流限值 复制链接链接已复制到粘贴板!
LimitRange 对象允许您为镜像流指定限值。
对于每个镜像流,需要满足以下条件:
-
ImageStream规格中镜像标签的数量必须小于或等于LimitRange对象中的openshift.io/image-tags约束。 -
ImageStream规格中对镜像的唯一引用数量必须小于或等于限制范围对象中的openshift.io/images约束。
镜像流 LimitRange 对象定义
openshift.io/image-tags 资源代表唯一镜像引用。可能的引用是 ImageStreamTag、ImageStreamImage 和 DockerImage。可以使用 oc tag 和 oc import-image 命令创建标签。内部和外部引用之间没有区别。但是,ImageStream 规格中标记的每个唯一引用仅计算一次。它不以任何方式限制推送到内部容器镜像 registry,但对标签限制很有用。
openshift.io/images 资源代表镜像流状态中记录的唯一镜像名称。它允许对可以推送到 OpenShift 镜像 registry 的多个镜像进行限制。内部和外部引用无法区分。
8.3.1.1.5. 持久性卷声明(PVC)限制 复制链接链接已复制到粘贴板!
LimitRange 对象允许您限制持久性卷声明(PVC)中请求的存储。
在一个项目中的所有持久性卷声明中,必须满足以下条件:
-
持久性卷声明(PVC)中的资源请求必须大于或等于
LimitRange对象中指定的 PVC 的min约束。 -
持久性卷声明(PVC)中的资源请求必须小于或等于
LimitRange对象中指定的 PVC 的max约束。
PVC LimitRange 对象定义
8.3.2. 创建限制范围 复制链接链接已复制到粘贴板!
将限制范围应用到一个项目:
使用您的所需规格创建
LimitRange对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为
LimitRange对象指定一个名称。 - 2
- 要为 pod 设置限值,请根据需要指定最小和最大 CPU 和内存请求。
- 3
- 要为容器设置限值,请根据需要指定最小和最大 CPU 和内存请求。
- 4
- 可选。对于容器,如果没有在
Podspec 中指定,则指定容器可以使用的默认 CPU 或内存量。 - 5
- 可选。对于容器,如果没有在
Podspec 中指定,则指定容器可以请求的默认 CPU 或内存量。 - 6
- 可选。对于容器,指定
Podspec 中可指定的最大限制与请求比例。 - 7
- 要为镜像对象设置限值,请设置可推送到 OpenShift 镜像 registry 的镜像的最大大小。
- 8
- 要为镜像流设置限值,请根据需要设置
ImageStream对象文件中的最大镜像标签和引用数。 - 9
- 要为持久性卷声明设置限制,请设置可请求的最小和最大存储量。
创建对象:
oc create -f <limit_range_file> -n <project>
$ oc create -f <limit_range_file> -n <project>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定您创建的 YAML 文件的名称以及要应用限制的项目。
8.3.3. 查看限制 复制链接链接已复制到粘贴板!
您可以通过在 web 控制台中导航到项目的 Quota 页面来查看项目中定义的任何限制。
您还可以使用 CLI 查看限制范围详情:
获取项目中定义的
LimitRange对象列表。例如,对于名为 demoproject 的项目:oc get limits -n demoproject
$ oc get limits -n demoprojectCopy to Clipboard Copied! Toggle word wrap Toggle overflow NAME CREATED AT resource-limits 2020-07-15T17:14:23Z
NAME CREATED AT resource-limits 2020-07-15T17:14:23ZCopy to Clipboard Copied! Toggle word wrap Toggle overflow 描述您感兴趣的
LimitRange对象,如resource-limits限制范围:oc describe limits resource-limits -n demoproject
$ oc describe limits resource-limits -n demoprojectCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.4. 删除限制范围 复制链接链接已复制到粘贴板!
要删除任何活跃的 LimitRange 对象,使其不再在项目中强制实施限制:
运行以下命令:
oc delete limits <limit_name>
$ oc delete limits <limit_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow