管理资源使用
在 OpenShift Pipelines 中管理资源消耗
摘要
第 1 章 减少 OpenShift Pipelines 的资源消耗 复制链接链接已复制到粘贴板!
如果在多租户环境中使用集群,您必须控制各个项目和 Kubernetes 对象的 CPU、内存和存储资源的消耗。这有助于防止一个应用程序消耗太多资源并影响其他应用程序。
要定义在生成的 pod 上设置的最终资源限值,Red Hat OpenShift Pipelines 使用资源配额限制和/或限制执行项目的范围。
要限制项目中的资源消耗,您可以:
- 设置和管理资源配额,以限制聚合资源消耗。
- 使用限制范围来限制特定对象的资源消耗,如 pod、镜像、镜像流和持久性卷声明。
1.1. 了解管道中的资源消耗 复制链接链接已复制到粘贴板!
每个任务都由 Task 资源中 steps 字段中定义的特定顺序执行的一些所需步骤组成。每个任务都作为 pod 运行,每个步骤都作为该 pod 中的容器运行。
每次都会执行一个步骤。执行此任务的 Pod 仅请求足够的资源,以一次在任务中运行单个容器镜像(步骤),因此不会为任务中的所有步骤存储资源。
steps spec 中的 Resources 字段指定资源消耗的限值。默认情况下,CPU、内存和临时存储的资源请求设置为 BestEffort (零)值,或通过该项目中限制范围设置的最小值。
步骤的资源请求和限值配置示例
当在执行管道和任务运行的项目中指定 LimitRange 参数和容器资源请求的最小值时,Red Hat OpenShift Pipelines 会查看项目中的所有 LimitRange 值,并使用最小值而不是零。
在项目级别配置限制范围参数示例
1.2. 缓解管道中的额外资源消耗 复制链接链接已复制到粘贴板!
当您在 pod 中的容器上设置了资源限制时,OpenShift Container Platform 会将请求的资源限值作为同时运行的所有容器的总和。
为了消耗调用任务一次执行一个步骤所需的最小资源,Red Hat OpenShift Pipelines 请求最大 CPU、内存和临时存储,这在需要最多资源的步骤中指定。这样可确保满足所有步骤的资源要求。最大值以外的请求设置为零。
但是,这种行为的资源使用量会超过要求。如果使用资源配额,这也可能导致无法调度的 pod。
例如,有一个任务,它带有两个使用脚本的步骤,且没有定义任何资源限值和请求。生成的 pod 有两个 init 容器(一个用于入口点复制,另一个用于编写脚本)和两个容器(每个步骤一个)。
OpenShift Container Platform 使用为项目设置的限制范围来计算所需资源请求和限值。在本例中,在项目中设置以下限制范围:
在这种情况下,每个 init 容器使用 1Gi 请求内存(限制范围的最大限制),每个容器都使用 500Mi 请求内存。因此,pod 的内存请求总数为 2Gi。
如果对一个有十个步骤的任务使用相同的限制范围,则最终内存请求为 5Gi,高于每个步骤实际需要的 500Mi(因为每个步骤均在另一个步骤之后运行)。
因此,为了减少资源消耗,您可以:
- 通过将不同的步骤分组到一个较大的步骤,使用脚本功能和同一镜像来减少给定任务中的步骤数量。这可减少最低请求资源。
- 分发步骤,它们相互独立,可以对于多个任务而不是单个任务运行。这样可减少每个任务中的步骤数量,使每个任务的请求更小,那么调度程序可在资源可用时运行它们。
第 2 章 为 OpenShift Pipelines 设置计算资源配额 复制链接链接已复制到粘贴板!
Red Hat OpenShift Pipelines 中的 ResourceQuota 对象控制每个命名空间的总资源消耗。您可以使用它来限制命名空间中创建的对象数量,具体取决于对象的类型。另外,您可以指定计算资源配额来限制命名空间中消耗的计算资源总量。
但是,您可能希望限制管道运行生成的 Pod 所消耗的计算资源数量,而不是为整个命名空间设置配额。目前,Red Hat OpenShift Pipelines 不会让您直接为管道指定计算资源配额。
2.1. 在 OpenShift Pipelines 中限制计算资源消耗的替代方法 复制链接链接已复制到粘贴板!
要获得对管道使用计算资源的一定程度的控制,请考虑以下备选方法:
为任务中的每个步骤设置资源请求和限值。
示例:为任务中的每个步骤设置资源请求和限值。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
通过为
LimitRange对象指定值来设置资源限值。如需有关LimitRange的更多信息,请参阅限制范围限制资源消耗。 - 减少管道资源消耗。
- 设置和管理 每个项目的资源配额。
- 理想情况下,管道的计算资源配额应与管道运行中同时运行的 Pod 所消耗的计算资源总量相同。不过,运行任务的容器集会根据用例消耗计算资源。例如,Maven 构建任务可能需要为它构建的不同应用提供不同的计算资源。因此,您无法为通用管道中的任务预先确定计算资源配额。要提高计算资源使用率的可预测性,并对计算资源的使用进行控制,请将自定义管道用于不同的应用程序。
如果您的用例没有通过这些方法解决,您可以使用优先级类的资源配额来实施临时解决方案。
2.2. 使用优先级类指定管道资源配额 复制链接链接已复制到粘贴板!
PriorityClass 对象将优先级类名称映射到表示其相对优先级的整数值。数值越高,类的优先级越高。创建优先级类后,您可以创建 pod,在其规格中指定优先级类名称。另外,您可以根据 pod 优先级控制 pod 对系统资源的消耗。
为管道指定资源配额类似于为管道运行创建的 pod 子集设置资源配额。以下步骤通过根据优先级类指定资源配额来提供临时解决方案示例。
流程
为管道创建优先级类。
示例:管道的优先级类
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为管道创建资源配额。
示例:管道的资源配额
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证管道的资源配额使用量。
示例:验证管道的资源配额使用情况
oc describe quota
$ oc describe quotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 由于容器集没有运行,因此配额没有被使用。
创建管道和任务。
示例:管道的 YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例:管道中任务的 YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建并启动管道运行。
示例:管道运行的 YAML
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意管道运行可能会失败,并显示错误:
failed quota: <quota name> must specify cpu, memory。要避免这个错误,请为命名空间设置一个限制范围,其中
LimitRange对象中的默认值应用到构建过程中创建的 pod。有关设置限制范围的更多信息,请参阅附加资源部分中的限制范围限制资源消耗。
创建 pod 后,验证管道运行的资源配额使用量。
示例:验证管道的资源配额使用情况
oc describe quota
$ oc describe quotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出表明,您可以通过指定每个优先级类的资源配额,为属于优先级类的所有并发运行 pod 管理组合资源配额。