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