3.13. OpenShift Pipelines에 대한 컴퓨팅 리소스 할당량 설정

Red Hat OpenShift Pipelines의 ResourceQuota 오브젝트는 네임스페이스당 총 리소스 사용량을 제어합니다. 이를 사용하여 오브젝트 유형에 따라 네임스페이스에서 생성된 오브젝트 수를 제한할 수 있습니다. 또한 컴퓨팅 리소스 할당량을 지정하여 네임스페이스에서 소비되는 총 컴퓨팅 리소스 양을 제한할 수 있습니다.

그러나 전체 네임스페이스에 할당량을 설정하지 않고 파이프라인 실행으로 인해 Pod에서 사용하는 컴퓨팅 리소스의 양을 제한할 수 있습니다. 현재 Red Hat OpenShift Pipelines에서는 파이프라인에 대한 컴퓨팅 리소스 할당량을 직접 지정할 수 없습니다.

3.13.1. OpenShift Pipelines에서 컴퓨팅 리소스 사용을 제한하는 대체 방법

파이프라인에서 컴퓨팅 리소스 사용에 대한 어느 정도 제어하려면 다음과 같은 대체 방법을 고려하십시오.

  • 작업의 각 단계에 대한 리소스 요청 및 제한을 설정합니다.

    예: 작업의 각 단계에 대한 리소스 요청 및 제한 설정.

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

  • LimitRange 오브젝트의 값을 지정하여 리소스 제한을 설정합니다. LimitRange 에 대한 자세한 내용은 제한 범위가 있는 리소스 사용 제한에서 참조하십시오.
  • 파이프라인 리소스 사용량을 줄입니다.
  • 프로젝트당 리소스 할당량을 설정하고 관리합니다.
  • 파이프라인의 컴퓨팅 리소스 할당량은 파이프라인 실행에서 동시에 실행 중인 Pod에서 사용하는 총 컴퓨팅 리소스 할당량과 동일해야 합니다. 그러나 작업을 실행하는 Pod는 사용 사례에 따라 컴퓨팅 리소스를 사용합니다. 예를 들어 Maven 빌드 작업에 빌드하는 다른 애플리케이션에 대해 다른 컴퓨팅 리소스가 필요할 수 있습니다. 따라서 일반 파이프라인의 작업에 대한 컴퓨팅 리소스 할당량을 사전 정의할 수 없습니다. 더 큰 예측 가능성과 컴퓨팅 리소스 사용에 대한 제어 제어는 다양한 애플리케이션에 대해 사용자 지정 파이프라인을 사용합니다.
참고

ResourceQuota 오브젝트로 구성된 네임스페이스에서 Red Hat OpenShift Pipelines를 사용하는 경우 작업 실행으로 생성된 Pod 및 파이프라인 실행이 오류와 함께 실패할 수 있습니다(예: failed quota: <quota name>은 cpu, memory )을 지정해야 합니다.

이 오류를 방지하려면 다음 중 하나를 수행하십시오.

  • (권장) 네임스페이스의 제한 범위를 지정합니다.
  • 모든 컨테이너에 대한 요청 및 제한을 명시적으로 정의합니다.

자세한 내용은 문제해결 방법을 참조하십시오.

이러한 방식으로 사용 사례를 처리하지 않는 경우 우선순위 클래스에 리소스 할당량을 사용하여 해결방법을 구현할 수 있습니다.

3.13.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

    Pod가 실행 중이 아니므로 할당량이 사용되지 않습니다.

  4. 파이프라인 및 작업을 생성합니다.

    예: 파이프라인의 YAML

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

  5. 파이프라인 실행을 생성하고 시작합니다.

    예: 파이프라인 실행을 위한 YAML

    apiVersion: tekton.dev/v1beta1
    kind: PipelineRun
    metadata:
      generateName: petclinic-run-
    spec:
      pipelineRef:
        name: maven-build
      podTemplate:
        priorityClassName: pipeline1-pc
      workspaces:
      - name: local-maven-repo
        emptyDir: {}
      resources:
      - name: app-git
        resourceSpec:
          type: git
          params:
            - name: url
              value: https://github.com/spring-projects/spring-petclinic

    참고

    파이프라인 실행이 실패하고 할당량 실패: <quota name>에서 cpu, memory를 지정해야 합니다.

    이 오류를 방지하려면 네임스페이스에 대한 제한 범위를 설정합니다. 여기서 LimitRange 오브젝트의 기본값은 빌드 프로세스 중 생성된 Pod에 적용됩니다.

    제한 범위 설정에 대한 자세한 내용은 Additional resources 섹션에서 제한 범위를 사용하여 리소스 소비 제한 을 참조하십시오.

  6. Pod가 생성되면 파이프라인 실행에 대한 리소스 할당량 사용량을 확인합니다.

    예: 파이프라인에 대한 리소스 할당량 사용 확인

    $ oc describe quota

    샘플 출력

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

    출력에서는 우선순위 클래스당 리소스 할당량을 지정하여 우선순위 클래스에 속하는 모든 동시 실행 중인 Pod에 대해 결합된 리소스 할당량을 관리할 수 있음을 나타냅니다.

3.13.3. 추가 리소스