4.11. 为 OpenShift Pipelines 设置计算资源配额

Red Hat OpenShift Pipelines 中的 ResourceQuota 对象控制每个命名空间的总资源消耗。您可以使用它来限制命名空间中创建的对象数量,具体取决于对象的类型。另外,您可以指定计算资源配额来限制命名空间中消耗的计算资源总量。

但是,您可能希望限制管道运行生成的 Pod 所消耗的计算资源数量,而不是为整个命名空间设置配额。目前,Red Hat OpenShift Pipelines 不会让您直接为管道指定计算资源配额。

4.11.1. 在 OpenShift Pipelines 中限制计算资源消耗的替代方法

要获得对管道使用计算资源的一定程度的控制,请考虑以下备选方法:

  • 为任务中的每个步骤设置资源请求和限值。

    示例:为任务中的每个步骤设置资源请求和限值。

    ...
    spec:
      steps:
        - name: step-with-limts
          resources:
            requests:
              memory: 1Gi
              cpu: 500m
            limits:
              memory: 2Gi
              cpu: 800m
    ...

  • 通过为 LimitRange 对象指定值来设置资源限值。如需有关 LimitRange 的更多信息,请参阅限制范围限制资源消耗
  • 减少管道资源消耗
  • 设置和管理 每个项目的资源配额
  • 理想情况下,管道的计算资源配额应与管道运行中同时运行的 Pod 所消耗的计算资源总量相同。不过,运行任务的容器集会根据用例消耗计算资源。例如,Maven 构建任务可能需要为它构建的不同应用提供不同的计算资源。因此,您无法为通用管道中的任务预先确定计算资源配额。要提高计算资源使用率的可预测性,并对计算资源的使用进行控制,请将自定义管道用于不同的应用程序。
注意

在配置了 ResourceQuota 对象的命名空间中使用 Red Hat OpenShift Pipelines 时,任务运行和管道运行的 pod 可能会失败,并显示错误,如:failed quota: <quota name> must specify cpu, memory

要避免这个错误,请执行以下操作之一:

  • (推荐)为命名空间指定一个限制范围。
  • 为所有容器明确定义请求和限值。

如需更多信息,请参阅问题解决方案

如果您的用例没有通过这些方法解决,您可以使用优先级类的资源配额来实施临时解决方案。

4.11.2. 使用优先级类指定管道资源配额

PriorityClass 对象将优先级类名称映射到表示其相对优先级的整数值。数值越高,类的优先级越高。创建优先级类后,您可以创建 pod,在其规格中指定优先级类名称。另外,您可以根据 pod 优先级控制 pod 对系统资源的消耗。

为管道指定资源配额类似于为管道运行创建的 pod 子集设置资源配额。以下步骤通过根据优先级类指定资源配额来提供临时解决方案示例。

流程

  1. 为管道创建优先级类。

    示例:管道的优先级类

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: pipeline1-pc
    value: 1000000
    description: "Priority class for pipeline1"

  2. 为管道创建资源配额。

    示例:管道的资源配额

    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"]

  3. 验证管道的资源配额使用量。

    示例:验证管道的资源配额使用情况

    $ oc describe quota

    输出示例

    Name:       pipeline1-rq
    Namespace:  default
    Resource    Used  Hard
    --------    ----  ----
    cpu         0     1k
    memory      0     200Gi
    pods        0     10

    由于容器集没有运行,因此配额没有被使用。

  4. 创建管道和任务。

    示例:管道的 YAML

    apiVersion: tekton.dev/v1alpha1
    kind: Pipeline
    metadata:
      name: maven-build
    spec:
      workspaces:
      - name: local-maven-repo
      resources:
      - name: app-git
        type: git
      tasks:
      - name: build
        taskRef:
          name: mvn
        resources:
          inputs:
          - name: source
            resource: app-git
        params:
        - name: GOALS
          value: ["package"]
        workspaces:
        - name: maven-repo
          workspace: local-maven-repo
      - name: int-test
        taskRef:
          name: mvn
        runAfter: ["build"]
        resources:
          inputs:
          - name: source
            resource: app-git
        params:
        - name: GOALS
          value: ["verify"]
        workspaces:
        - name: maven-repo
          workspace: local-maven-repo
      - name: gen-report
        taskRef:
          name: mvn
        runAfter: ["build"]
        resources:
          inputs:
          - name: source
            resource: app-git
        params:
        - name: GOALS
          value: ["site"]
        workspaces:
        - name: maven-repo
          workspace: local-maven-repo

    示例:管道中任务的 YAML

    apiVersion: tekton.dev/v1alpha1
    kind: Task
    metadata:
      name: mvn
    spec:
      workspaces:
      - name: maven-repo
      inputs:
        params:
        - name: GOALS
          description: The Maven goals to run
          type: array
          default: ["package"]
        resources:
        - name: source
          type: git
      steps:
        - name: mvn
          image: gcr.io/cloud-builders/mvn
          workingDir: /workspace/source
          command: ["/usr/bin/mvn"]
          args:
            - -Dmaven.repo.local=$(workspaces.maven-repo.path)
            - "$(inputs.params.GOALS)"
          priorityClassName: pipeline1-pc

    注意

    确保管道中的所有任务都属于相同的优先级类。

  5. 创建并启动管道运行。

    示例:管道运行的 YAML

    apiVersion: tekton.dev/v1alpha1
    kind: PipelineRun
    metadata:
      generateName: petclinic-run-
    spec:
      pipelineRef:
        name: maven-build
      resources:
      - name: app-git
        resourceSpec:
          type: git
          params:
            - name: url
              value: https://github.com/spring-projects/spring-petclinic

  6. 创建 pod 后,验证管道运行的资源配额使用量。

    示例:验证管道的资源配额使用情况

    $ oc describe quota

    输出示例

    Name:       pipeline1-rq
    Namespace:  default
    Resource    Used  Hard
    --------    ----  ----
    cpu         500m  1k
    memory      10Gi  200Gi
    pods        1     10

    输出表明,您可以通过指定每个优先级类的资源配额,为属于优先级类的所有并发运行 pod 管理组合资源配额。

4.11.3. 其他资源