ResourceFlavor 정의

# ResourceFlavor 생성
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: spot-flavor # ← 이 이름을 ClusterQueue에서 참조
spec:
  nodeLabels:
    instance-type: spot
  tolerations:
  - key: "spot"
    operator: "Exists"
    effect: "NoSchedule"
---
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: on-demand-flavor # ← 이 이름을 ClusterQueue에서 참조
spec:
  nodeLabels:
    instance-type: on-demand

ClusterQueue에서 ResourceFlavor 참조

ClusterQueue에서 사용하는 "flavor"는 ResourceFlavor를 참조하는 것이다.

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: multi-flavor-cq
spec:
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: spot-flavor # ← ResourceFlavor의 metadata.name
      resources:
      - name: "cpu"
        nominalQuota: 100
      - name: "memory"
        nominalQuota: 400Gi
    - name: on-demand-flavor # ← ResourceFlavor의 metadata.name
      resources:
      - name: "cpu"
        nominalQuota: 50
      - name: "memory"
        nominalQuota: 200Gi

동작 원리

1. Flavor 순서의 중요성

ClusterQueue에서 flavor의 순서가 중요합니다. Kueue는 리스트 순서대로 flavor를 평가하여 워크로드가 사용 가능한 할당량에 맞는지 확인한다. Cluster Queue | Kueue

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: cost-optimized-cq
spec:
  resourceGroups:
  - coveredResources: ["cpu", "memory"]
    flavors:
    - name: spot-flavor # 1순위: 저비용 먼저 시도
      resources:
      - name: "cpu"
        nominalQuota: 100
    - name: on-demand-flavor # 2순위: spot이 부족할 때 사용
      resources:
      - name: "cpu"
        nominalQuota: 50

2. Workload 승인 과정

Kueue가 flavor를 할당할 때, ClusterQueue의 (.spec.resourceGroups[*].flavors) 목록을 순서대로 검토하여 각 flavor에 대해 워크로드의 pod set이 해당 flavor에 정의된 할당량에 맞는지 확인한다. Cluster Queue | Kueue

실제 사용 예시

GPU 타입별 ResourceFlavor

# T4 GPU ResourceFlavor
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: gpu-t4
spec:
  nodeLabels:
    accelerator: nvidia-tesla-t4
    gpu-memory: 16gb
---
# A100 GPU ResourceFlavor
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: gpu-a100
spec:
  nodeLabels:
    accelerator: nvidia-tesla-a100
    gpu-memory: 80gb
  nodeTaints:
  - effect: NoSchedule
    key: high-end-gpu
    value: "true"
---
# ClusterQueue에서 GPU ResourceFlavor 사용
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: ml-training-cq
spec:
  resourceGroups:
  - coveredResources: ["nvidia.com/gpu"]
    flavors:
    - name: gpu-t4 # gpu-t4 ResourceFlavor 참조
      resources:
      - name: "nvidia.com/gpu"
        nominalQuota: 16
    - name: gpu-a100 # gpu-a100 ResourceFlavor 참조
      resources:
      - name: "nvidia.com/gpu"
        nominalQuota: 4

Job 실행 시 Flavor 선택

apiVersion: batch/v1
kind: Job
metadata:
  labels:
    kueue.x-k8s.io/queue-name: ml-queue
spec:
  template:
    spec:
# A100 GPU를 선호하는 설정
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: accelerator
                operator: In
                values: ["nvidia-tesla-a100"]
# 고성능 GPU 노드의 taint 허용
      tolerations:
      - key: "high-end-gpu"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"
      containers:
      - name: trainer
        image: tensorflow/tensorflow:latest-gpu
        resources:
          requests:
            nvidia.com/gpu: "2"

중요한 포인트

1. ResourceFlavor 생성 → ClusterQueue 참조

# 1단계: ResourceFlavor 생성
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: my-custom-flavor
spec:
  nodeLabels:
    custom-label: value

# 2단계: ClusterQueue에서 참조
apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: my-cq
spec:
  resourceGroups:
  - coveredResources: ["cpu"]
    flavors:
    - name: my-custom-flavor # 위에서 생성한 ResourceFlavor 이름
      resources:
      - name: "cpu"
        nominalQuota: 100