管理性能和资源使用
在 OpenShift Pipelines 中管理资源消耗
摘要
第 1 章 管理 OpenShift Pipelines 性能 复制链接链接已复制到粘贴板!
如果您的 OpenShift Pipelines 安装同时运行大量任务,其性能可能会降低。您可能会遇到性能下降和失败的管道运行。
为便于参考,在红帽测试中,在一个 Amazon Web Services (AWS) m6a.2xlarge 节点上运行的三节点 OpenShift Container Platform 集群中,最多可最多 60 个简单的测试管道同时运行而无需大量故障或延迟。如果更多管道同时运行,则管道运行的平均运行次数、管道运行的平均持续时间、pod 创建延迟、工作队列深度以及待处理 pod 的数量会增加。此测试是在 Red Hat OpenShift Pipelines 版本 1.13 上执行的;从 1.12 开始,没有显著区别。
这些结果取决于测试配置。您的配置性能结果可能会有所不同。
1.1. 提高 OpenShift Pipelines 性能 复制链接链接已复制到粘贴板!
如果您遇到管道运行的缓慢或重新当前失败,您可以执行以下步骤来改进 OpenShift Pipelines 的性能。
- 监控运行 OpenShift Pipelines 的 OpenShift Container Platform 集群中节点的资源使用情况。如果资源使用量很高,请增加节点数量。
启用高可用性模式。这个模式会影响为任务运行和管道运行创建和启动 pod 的控制器。在红帽测试中,高可用性模式会显著降低管道执行时间,以及创建
TaskRun资源 CR 的延迟到执行任务运行的 pod 的开头。要启用高可用性模式,请在TektonConfig自定义资源(CR)中进行以下更改:-
将
pipeline.performance.disable-haspec 设置为false。 -
将
pipeline.performance.bucketsspec 设置为5到10之间的数字。 将
pipeline.performance.replicasspec 设置为大于2且小于或等于pipeline.performance.buckets设置的数字。注意您可以尝试不同的存储桶和副本数来观察对性能的影响。一般来说,数量越高非常有用。监控节点的耗尽资源,包括 CPU 和内存使用率。
-
将
第 2 章 减少 OpenShift Pipelines 的资源消耗 复制链接链接已复制到粘贴板!
如果在多租户环境中使用集群,您必须控制各个项目和 Kubernetes 对象的 CPU、内存和存储资源的消耗。这有助于防止一个应用程序消耗太多资源并影响其他应用程序。
要定义在生成的 pod 上设置的最终资源限值,Red Hat OpenShift Pipelines 使用资源配额限制和/或限制执行项目的范围。
要限制项目中的资源消耗,您可以:
- 设置和管理资源配额,以限制聚合资源消耗。
- 使用限制范围来限制特定对象的资源消耗,如 pod、镜像、镜像流和持久性卷声明。
2.1. 了解管道中的资源消耗 复制链接链接已复制到粘贴板!
每个任务都由 Task 资源中 steps 字段中定义的特定顺序执行的一些所需步骤组成。每个任务都作为 pod 运行,每个步骤都作为该 pod 中的容器运行。
steps spec 中的 Resources 字段指定资源消耗的限值。默认情况下,CPU、内存和临时存储的资源请求设置为 BestEffort (零)值,或通过该项目中限制范围设置的最小值。
步骤的资源请求和限值配置示例
spec:
steps:
- name: <step_name>
computeResources:
requests:
memory: 2Gi
cpu: 600m
limits:
memory: 4Gi
cpu: 900m
当在执行管道和任务运行的项目中指定 LimitRange 参数和容器资源请求的最小值时,Red Hat OpenShift Pipelines 会查看项目中的所有 LimitRange 值,并使用最小值而不是零。
在项目级别配置限制范围参数示例
apiVersion: v1
kind: LimitRange
metadata:
name: <limit_container_resource>
spec:
limits:
- max:
cpu: "600m"
memory: "2Gi"
min:
cpu: "200m"
memory: "100Mi"
default:
cpu: "500m"
memory: "800Mi"
defaultRequest:
cpu: "100m"
memory: "100Mi"
type: Container
...
2.2. 缓解管道中的额外资源消耗 复制链接链接已复制到粘贴板!
当您在 pod 中的容器上设置了资源限制时,OpenShift Container Platform 会将请求的资源限值作为同时运行的所有容器的总和。
为了消耗调用任务一次执行一个步骤所需的最小资源,Red Hat OpenShift Pipelines 请求最大 CPU、内存和临时存储,这在需要最多资源的步骤中指定。这样可确保满足所有步骤的资源要求。最大值以外的请求设置为零。
但是,这种行为的资源使用量会超过要求。如果使用资源配额,这也可能导致无法调度的 pod。
例如,有一个任务,它带有两个使用脚本的步骤,且没有定义任何资源限值和请求。生成的 pod 有两个 init 容器(一个用于入口点复制,另一个用于编写脚本)和两个容器(每个步骤一个)。
OpenShift Container Platform 使用为项目设置的限制范围来计算所需资源请求和限值。在本例中,在项目中设置以下限制范围:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
在这种情况下,每个 init 容器使用 1Gi 请求内存(限制范围的最大限制),每个容器都使用 500Mi 请求内存。因此,pod 的内存请求总数为 2Gi。
如果对一个有十个步骤的任务使用相同的限制范围,则最终内存请求为 5Gi,高于每个步骤实际需要的 500Mi(因为每个步骤均在另一个步骤之后运行)。
因此,为了减少资源消耗,您可以:
- 通过将不同的步骤分组到一个较大的步骤,使用脚本功能和同一镜像来减少给定任务中的步骤数量。这可减少最低请求资源。
- 分发步骤,它们相互独立,可以对于多个任务而不是单个任务运行。这样可减少每个任务中的步骤数量,使每个任务的请求更小,那么调度程序可在资源可用时运行它们。
第 3 章 为 OpenShift Pipelines 设置计算资源配额 复制链接链接已复制到粘贴板!
Red Hat OpenShift Pipelines 中的 ResourceQuota 对象控制每个命名空间的总资源消耗。您可以使用它来限制命名空间中创建的对象数量,具体取决于对象的类型。另外,您可以指定计算资源配额来限制命名空间中消耗的计算资源总量。
但是,您可能希望限制管道运行生成的 Pod 所消耗的计算资源数量,而不是为整个命名空间设置配额。目前,Red Hat OpenShift Pipelines 不会让您直接为管道指定计算资源配额。
3.1. 在 OpenShift Pipelines 中限制计算资源消耗的替代方法 复制链接链接已复制到粘贴板!
要获得对管道使用计算资源的一定程度的控制,请考虑以下备选方法:
为任务中的每个步骤设置资源请求和限值。
示例:为任务中的每个步骤设置资源请求和限值。
... spec: steps: - name: step-with-limts computeResources: requests: memory: 1Gi cpu: 500m limits: memory: 2Gi cpu: 800m ...-
通过为
LimitRange对象指定值来设置资源限值。如需有关LimitRange的更多信息,请参阅限制范围限制资源消耗。 - 减少管道资源消耗。
- 设置和管理 每个项目的资源配额。
- 理想情况下,管道的计算资源配额应与管道运行中同时运行的 Pod 所消耗的计算资源总量相同。不过,运行任务的容器集会根据用例消耗计算资源。例如,Maven 构建任务可能需要为它构建的不同应用提供不同的计算资源。因此,您无法为通用管道中的任务预先确定计算资源配额。要提高计算资源使用率的可预测性,并对计算资源的使用进行控制,请将自定义管道用于不同的应用程序。
如果您的用例没有通过这些方法解决,您可以使用优先级类的资源配额来实施临时解决方案。
3.2. 使用优先级类指定管道资源配额 复制链接链接已复制到粘贴板!
PriorityClass 对象将优先级类名称映射到表示其相对优先级的整数值。数值越高,类的优先级越高。创建优先级类后,您可以创建 pod,在其规格中指定优先级类名称。另外,您可以根据 pod 优先级控制 pod 对系统资源的消耗。
为管道指定资源配额类似于为管道运行创建的 pod 子集设置资源配额。以下步骤通过根据优先级类指定资源配额来提供临时解决方案示例。
流程
为管道创建优先级类。
示例:管道的优先级类
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: pipeline1-pc value: 1000000 description: "Priority class for pipeline1"为管道创建资源配额。
示例:管道的资源配额
apiVersion: v1 kind: ResourceQuota metadata: name: pipeline1-rq spec: hard: cpu: "1000" memory: 200Gi pods: "10" scopeSelector: matchExpressions: - operator : In scopeName: PriorityClass values: ["pipeline1-pc"]验证管道的资源配额使用量。
示例:验证管道的资源配额使用情况
$ oc describe quota输出示例
Name: pipeline1-rq Namespace: default Resource Used Hard -------- ---- ---- cpu 0 1k memory 0 200Gi pods 0 10由于容器集没有运行,因此配额没有被使用。
创建管道和任务。
示例:管道的 YAML
apiVersion: tekton.dev/v1 kind: Pipeline metadata: name: maven-build spec: params: - name: GIT_URL workspaces: - name: local-maven-repo - name: source tasks: - name: git-clone taskRef: resolver: cluster params: - name: kind value: task - name: name value: git-clone - name: namespace value: openshift-pipelines workspaces: - name: output workspace: source params: - name: URL value: $(params.GIT_URL) - name: build taskRef: name: mvn runAfter: ["git-clone"] params: - name: GOALS value: ["package"] workspaces: - name: maven-repo workspace: local-maven-repo - name: source workspace: source - name: int-test taskRef: name: mvn runAfter: ["build"] params: - name: GOALS value: ["verify"] workspaces: - name: maven-repo workspace: local-maven-repo - name: source workspace: source - name: gen-report taskRef: name: mvn runAfter: ["build"] params: - name: GOALS value: ["site"] workspaces: - name: maven-repo workspace: local-maven-repo - name: source workspace: source示例:管道中任务的 YAML
apiVersion: tekton.dev/v1 kind: Task metadata: name: mvn spec: workspaces: - name: maven-repo - name: source params: - name: GOALS description: The Maven goals to run type: array default: ["package"] steps: - name: mvn image: gcr.io/cloud-builders/mvn workingDir: $(workspaces.source.path) command: ["/usr/bin/mvn"] args: - -Dmaven.repo.local=$(workspaces.maven-repo.path) - "$(params.GOALS)"创建并启动管道运行。
示例:管道运行的 YAML
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: generateName: petclinic-run- spec: pipelineRef: name: maven-build params: - name: GIT_URL value: https://github.com/spring-projects/spring-petclinic taskRunTemplate: podTemplate: priorityClassName: pipeline1-pc workspaces: - name: local-maven-repo emptyDir: {} - name: source volumeClaimTemplate: spec: accessModes: - ReadWriteOnce resources: requests: storage: 200M注意管道运行可能会失败,并显示错误:
failed quota: <quota name> must specify cpu, memory。要避免这个错误,请为命名空间设置一个限制范围,其中
LimitRange对象中的默认值应用到构建过程中创建的 pod。有关设置限制范围的更多信息,请参阅附加资源部分中的限制范围限制资源消耗。
注意从 OpenShift Pipelines 1.17 开始,您为任务设置的优先级类适用于为任务创建的所有 pod,包括 OpenShift Pipelines 创建的关联性助手 pod 以确保任务在特定节点上执行。
创建 pod 后,验证管道运行的资源配额使用量。
示例:验证管道的资源配额使用情况
$ oc describe quota输出示例
Name: pipeline1-rq Namespace: default Resource Used Hard -------- ---- ---- cpu 500m 1k memory 10Gi 200Gi pods 1 10输出表明,您可以通过指定每个优先级类的资源配额,为属于优先级类的所有并发运行 pod 管理组合资源配额。