기본 개념

WorkloadPriorityClass는 Kueue 컨트롤러에서 활용되며 Pod의 우선순위와는 독립적인 우선순위 클래스다. WorkloadPriorityClass를 사용하면 pod의 우선순위에 영향을 주지 않고 Workload의 우선순위를 제어할 수 있다.

이 기능은 다음과 같은 경우에 유용하다: 특정 기간 동안 비활성 상태로 남아있는 워크로드의 우선순위를 높이고 싶을 때, 개발 워크로드에는 낮은 우선순위를, 프로덕션 워크로드에는 높은 우선순위를 설정하고 싶을 때

기본 구조와 생성

WorkloadPriorityClass 생성

apiVersion: kueue.x-k8s.io/v1beta1
kind: WorkloadPriorityClass
metadata:
  name: urgent-ml-tasks
value: 10000                    # 우선순위 값 (높을수록 우선순위 높음)
description: "Urgent ML training tasks requiring immediate attention"
globalDefault: false            # 전역 기본값 여부
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: WorkloadPriorityClass
metadata:
  name: production-workloads
value: 5000
description: "Production ML workloads"
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: WorkloadPriorityClass
metadata:
  name: development-experiments
value: 1000
description: "Development and experimental workloads"
globalDefault: true             # 기본 우선순위로 설정
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: WorkloadPriorityClass
metadata:
  name: background-processing
value: 100
description: "Low priority background processing tasks"

Job에서 WorkloadPriorityClass 사용

kueue.x-k8s.io/priority-class 레이블을 설정하여 WorkloadPriorityClass를 지정할 수 있다.

apiVersion: batch/v1
kind: Job
metadata:
  name: critical-model-training
  namespace: ml-team
  labels:
    kueue.x-k8s.io/queue-name: ml-training-queue
    kueue.x-k8s.io/priority-class: urgent-ml-tasks  # WorkloadPriorityClass 지정
spec:
  suspend: true
  template:
    spec:
      containers:
      - name: trainer
        image: critical-model-trainer:latest
        resources:
          requests:
            nvidia.com/gpu: "4"
            cpu: "16"
            memory: "64Gi"
      restartPolicy: Never

Workload에서의 우선순위 표현

WorkloadPriorityClass 사용 시 생성되는 Workload

Kueue는 위 Job에 대해 다음과 같은 Workload를 생성한다. priorityClassSource 필드를 통해 구분할 수 있으며, WorkloadPriorityClass 사용 시 kueue.x-k8s.io/workloadpriorityclass 값을, PriorityClass 사용 시 scheduling.k8s.io/priorityclass 값을 갖는다.

apiVersion: kueue.x-k8s.io/v1beta1
kind: Workload
metadata:
  name: job-critical-model-training-abc123
  namespace: ml-team
spec:
  priorityClassSource: kueue.x-k8s.io/workloadpriorityclass  # WorkloadPriorityClass 사용
  priorityClassName: urgent-ml-tasks
  priority: 10000                # WorkloadPriorityClass의 value
  queueName: ml-training-queue
  podSets:
  - count: 1
    name: main
    template:
      spec:
        containers:
        - name: trainer
          image: critical-model-trainer:latest
          resources:
            requests:
              nvidia.com/gpu: "4"
              cpu: "16"
              memory: "64Gi"

Pod Priority vs WorkloadPriority 비교

Pod Priority 사용 (Kubernetes 기본)

# PriorityClass 생성 (Kubernetes 기본)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-pods
value: 1000
globalDefault: false
description: "High priority pods for critical workloads"
---
# Job에서 Pod Priority 사용
apiVersion: batch/v1
kind: Job
metadata:
  name: pod-priority-job
  labels:
    kueue.x-k8s.io/queue-name: ml-queue
spec:
  template:
    spec:
      priorityClassName: high-priority-pods  # Pod의 우선순위에 영향
      containers:
      - name: worker
        image: ml-trainer:latest
        resources:
          requests:
            cpu: "4"
            memory: "8Gi"

위 경우 생성되는 Workload:

apiVersion: kueue.x-k8s.io/v1beta1
kind: Workload
metadata:
  name: job-pod-priority-job-xyz789
spec:
  priorityClassSource: scheduling.k8s.io/priorityclass  # Kubernetes PriorityClass 사용
  priorityClassName: high-priority-pods
  priority: 1000                 # PriorityClass의 value
  # Pod priority와 Workload priority가 동일

WorkloadPriority 사용 (독립적 제어)