기본 개념

ClusterQueue는 클러스터 범위의 리소스로, 리소스 풀을 관리하고 사용 제한 및 Fair Sharing 규칙을 정의합니다. k8sGoogle Cloud Kueue의 핵심 구성 요소로서 실제 리소스 스케줄링과 할당을 담당한다.

주요 기능:

핵심 구성 요소

1. Resource Groups

동일한 flavor에 할당되어야 하는 리소스들을 묶어서 관리하는 단위다. 노드와 연관된 리소스(CPU, 메모리, GPU)는 같은 리소스 그룹에 넣어 동일한 flavor를 사용하도록 하고, 다른 리소스들은 별도 그룹으로 분리할 수 있다. Cluster Queue | Kueue

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: ml-cluster-queue
spec:
  resourceGroups:
# 노드 기반 리소스는 함께 관리
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: on-demand
      resources:
      - name: "cpu"
        nominalQuota: 100
        borrowingLimit: 50
      - name: "memory"
        nominalQuota: 400Gi
        borrowingLimit: 200Gi
# GPU는 별도 관리 (다른 flavor 전략 적용)
  - coveredResources: ["nvidia.com/gpu"]
    flavors:
    - name: gpu-a100
      resources:
      - name: "nvidia.com/gpu"
        nominalQuota: 8
    - name: gpu-t4
      resources:
      - name: "nvidia.com/gpu"
        nominalQuota: 16

2. Queueing Strategy

BestEffortFIFO(기본값) - 오래된 작업이 리소스 부족으로 실행되지 못해도 새로운 작업이 사용 가능한 할당량에 맞으면 실행 가능하다. Cluster Queue | Kueue

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: flexible-queue
spec:
  queueingStrategy: BestEffortFIFO # 기본값
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: default-flavor
      resources:
      - name: "cpu"
        nominalQuota: 50

Cohort을 통한 리소스 공유

기본 Cohort 설정

같은 cohort에 속한 ClusterQueue들이 서로 사용하지 않는 할당량을 빌려서 사용할 수 있다. Concepts

# 팀 A용 ClusterQueue
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: team-a-cq
spec:
  cohort: "research-teams"# 동일한 cohort 이름
  namespaceSelector:
    matchLabels:
      team: team-a
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: on-demand
      resources:
      - name: "cpu"
        nominalQuota: 50# 기본 할당량
        borrowingLimit: 30# 최대 80 CPU까지 빌려 사용 가능
      - name: "memory"
        nominalQuota: 200Gi
        borrowingLimit: 100Gi
---
# 팀 B용 ClusterQueue
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: team-b-cq
spec:
  cohort: "research-teams"# 동일한 cohort 이름
  namespaceSelector:
    matchLabels:
      team: team-b
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: on-demand
      resources:
      - name: "cpu"
        nominalQuota: 50
        borrowingLimit: 30
      - name: "memory"
        nominalQuota: 200Gi
        borrowingLimit: 100Gi

Lending Limit

lendingLimit을 설정하면 ClusterQueue가 다른 팀에게 빌려줄 수 있는 리소스량을 제한할 수 있다. 예를 들어 lendingLimit=1로 설정하면, 해당 ClusterQueue의 사용량이 nominalQuota-1 이하일 때만 다른 ClusterQueue가 리소스를 빌릴 수 있다. Support for hierarchical ClusterQueues · Issue #79 · kubernetes-sigs/kueue