배경
작업은 머신러닝, 렌더링, 시뮬레이션, 분석, CI/CD 및 유사한 워크로드 등 완료될 때까지 실행되는 애플리케이션입니다.
Kueue는 기본 Kubernetes 스케줄러, 작업 컨트롤러, 클러스터 자동 확장 처리와 함께 작동하여 엔드 투 엔드 일괄 시스템을 제공하는 클라우드 네이티브 작업 스케줄러입니다. Kueue는 작업을 큐에 추가하여 여러 팀 간에 리소스가 공정하게 공유되도록 할당량과 계층 구조에 따라 작업의 대기 시기 및 시작 시기를 결정합니다.
Kueue의 특징은 다음과 같습니다.
- 리소스가 여러 다른 종류로 이루어지며 교환 및 확장이 가능한 클라우드 아키텍처에 최적화되어 있습니다.
- 탄력적인 할당량을 관리하고 작업을 큐에 추가하는 것을 관리할 수 있는 API 집합을 제공합니다.
- 자동 확장, 포드 예약, 작업 수명 주기 관리와 같은 기존 기능은 다시 구현되지 않습니다.
- Kueue는 기본적으로 Kubernetes
batch/v1.Job
API를 지원합니다. - 다른 작업 API와 통합할 수 있습니다.
Kueue는 특정 Kubernetes Job API와 혼동되지 않도록 모든 API로 정의된 작업을 워크로드로 참조합니다.
목표
이 튜토리얼은 Kubernetes에서 일괄 시스템을 구현하려는 클러스터 운영자 및 기타 사용자를 대상으로 합니다. 이 튜토리얼에서는 두 테넌트 팀의 공유 클러스터를 설정합니다. 팀마다 작업을 만들고 해당하는 할당량으로 제어되는 동일한 전역 리소스를 공유하는 자체 네임스페이스가 있습니다.
이 가이드는 다음 과정을 다룹니다.
- GKE 클러스터 만들기
- ResourceFlavor 만들기
- ClusterQueue 만들기
- LocalQueue 만들기
- 작업을 만들고 허용된 워크로드 관찰하기
비용
이 튜토리얼에서는 다음과 같은 Google Cloud 구성요소를 사용하며 여기에는 비용이 청구될 수 있습니다.가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다.
이 튜토리얼을 마친 후 비용이 계속 청구되지 않도록 자신이 만든 리소스를 삭제하세요. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
프로젝트 설정
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Google Cloud CLI 기본값 설정
Google Cloud 콘솔에서 Cloud Shell 인스턴스를 시작합니다.
Cloud Shell 열기이 샘플 앱의 소스 코드를 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/batch/kueue-intro
기본 환경 변수를 설정합니다.
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
다음 값을 바꿉니다.
- PROJECT_ID: Google Cloud 프로젝트 ID입니다.
- COMPUTE_REGION: Compute Engine 리전입니다.
GKE 클러스터 만들기
kueue-autopilot
이라는 GKE Autopilot 클러스터를 만듭니다.gcloud container clusters create-auto kueue-autopilot \ --release-channel "rapid" --region COMPUTE_REGION
Autopilot 클러스터는 완전 관리형이며 자동 확장이 기본 제공됩니다. GKE Autopilot에 대해 자세히 알아보세요.
Kueue는 노드 자동 프로비저닝 및 일반 자동 확장 노드 풀이 있는 GKE Standard도 지원합니다.
클러스터가 생성된 후의 결과는 다음과 비슷합니다.
NAME: kueue-autopilot LOCATION: us-central1 MASTER_VERSION: 1.26.2-gke.1000 MASTER_IP: 35.193.173.228 MACHINE_TYPE: e2-medium NODE_VERSION: 1.26.2-gke.1000 NUM_NODES: 3 STATUS: RUNNING
여기서
kueue-autopilot
의STATUS
는RUNNING
입니다.클러스터의 사용자 인증 정보를 가져옵니다.
gcloud container clusters get-credentials kueue-autopilot
클러스터에 Kueue를 설치합니다.
VERSION=VERSION kubectl apply --server-side -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
VERSION을 Kueue의 최신 버전으로 바꿉니다. Kueue 버전에 대한 자세한 내용은 Kueue 출시 버전을 참조하세요.
Kueue 포드가 준비될 때까지 기다립니다.
watch kubectl -n kueue-system get pods
계속하기 전에 출력이 다음과 비슷한지 확인합니다.
NAME READY STATUS RESTARTS AGE kueue-controller-manager-66d8bb946b-wr2l2 2/2 Running 0 3m36s
team-a
와team-b
라는 새 네임스페이스 2개를 만듭니다.kubectl create namespace team-a kubectl create namespace team-b
ResourceFlavor 만들기
ResourceFlavor는 노드 라벨 및 taint와 연결하여 클러스터에서 사용 가능한 노드의 변형을 나타내는 객체입니다. 예를 들어 ResourceFlavor를 사용하여 다양한 프로비저닝 보장(예: 스팟 vs 주문형), 아키텍처(예: x86 vs ARM CPU), 브랜드 및 모델(예: Nvidia A100 vs T4 GPU)의 VM을 나타낼 수 있습니다.
이 튜토리얼에서는kueue-autopilot
클러스터에 동종 리소스가 있습니다.
따라서 라벨 또는 taint 없이 CPU, 메모리, 임시 스토리지, GPU에 대해 단일 ResourceFlavor를 만듭니다.
kubectl apply -f flavors.yaml
ClusterQueue 만들기
ClusterQueue는 CPU, 메모리, GPU와 같은 리소스 풀을 관리하는 클러스터 범위 객체입니다. ResourceFlavor를 관리하고, 사용량을 제한하며, 워크로드가 허용되는 순서를 지정합니다.
ClusterQueue를 배포합니다.
kubectl apply -f cluster-queue.yaml
사용 순서는 두 가지 구성이 있는 .spec.queueingStrategy
에 따라 결정됩니다.
BestEffortFIFO
- 기본 큐 추가 전략 구성입니다.
- 워크로드 허용은 선입 선출(FIFO) 규칙을 따르지만 큐 맨 위에 워크로드를 허용하기에 할당량이 충분하지 않으면 줄의 다음 항목이 시도됩니다.
StrictFIFO
- FIFO 시맨틱스를 보장합니다.
- 큐 맨 위에 있는 워크로드는 워크로드가 허용될 수 있을 때까지 큐 추가를 차단할 수 있습니다.
cluster-queue.yaml
에서 cluster-queue
라는 새 ClusterQueue를 만듭니다. 이 ClusterQueue는 flavors.yaml
에서 생성된 버전으로 4개의 리소스(cpu
, memory
, nvidia.com/gpu
, ephemeral-storage
)를 관리합니다.
이 할당량은 워크로드 포드 사양의 요청에서 사용됩니다.
각 버전에는 .spec.resourceGroups[].flavors[].resources[].nominalQuota
으로 표현되는 사용량 한도가 포함됩니다. 여기에서는 ClusterQueue가 다음과 같은 경우에만 워크로드를 허용합니다.
- CPU 요청 합계가 10보다 작거나 같습니다.
- 메모리 요청 합계가 10Gi보다 작거나 같습니다.
- GPU 요청 합계가 10보다 작거나 같습니다.
- 사용한 스토리지의 합계가 10Gi보다 작거나 같습니다.
LocalQueue 만들기
LocalQueue는 네임스페이스에 있는 사용자의 워크로드를 허용하는 네임스페이스 객체입니다.
다른 네임스페이스의 LocalQueue가 리소스 할당량을 공유할 수 있는 동일한 ClusterQueue를 가리킬 수 있습니다. 이 경우 네임스페이스 team-a
및 team-b
의 LocalQueue가 .spec.clusterQueue
아래의 동일한 ClusterQueue cluster-queue
를 가리킵니다.
각 팀에서 자체 네임스페이스의 LocalQueue에 워크로드를 전송합니다. 그런 다음 ClusterQueue에 의해 리소스가 할당됩니다.
LocalQueue를 배포합니다.
kubectl apply -f local-queue.yaml
작업을 만들고 허용된 워크로드 관찰하기
작업은 team-a
네임스페이스 아래에 생성됩니다. 이 작업은 LocalQueue lq-team-a
를 가리킵니다. GPU 리소스를 요청하려면 nodeSelector
가 nvidia-tesla-t4
로 설정됩니다.
작업은 10초 동안 동시에 절전 모드로 전환되는 3개의 포드로 구성됩니다.
ttlSecondsAfterFinished
에 따라 60초 후에 작업이 삭제됩니다.
이 작업에는 포드가 3개 있으므로 1,500milliCPU, 메모리 1,536Mi, 임시 스토리지 1,536Mi, GPU 3개가 필요합니다.
또한 네임스페이스가 team-b
에 속하는 job-team-b.yaml
파일 아래에 작업이 생성되고, 서로 다른 요구사항을 가진 다른 팀을 나타내는 요청이 포함됩니다.
자세한 내용은 Autopilot에서 GPU 워크로드 배포를 참조하세요.
새 터미널에서 2초마다 새로고침되는 ClusterQueue의 상태를 관찰합니다.
watch -n 2 kubectl get clusterqueue cluster-queue -o wide
새 터미널에서 노드 상태를 관찰합니다.
watch -n 2 kubectl get nodes -o wide
새 터미널에서 10초마다 네임스페이스
team-a
및team-b
에서 LocalQueue에 대한 작업을 만듭니다../create_jobs.sh job-team-a.yaml job-team-b.yaml 10
큐에 추가되고 ClusterQueue에 허용된 작업, GKE Autopilot을 사용해 가져온 노드를 관찰합니다.
네임스페이스
team-a
에서 작업을 가져옵니다.kubectl -n team-a get jobs
출력은 다음과 비슷합니다.
NAME COMPLETIONS DURATION AGE sample-job-team-b-t6jnr 3/3 21s 3m27s sample-job-team-a-tm7kc 0/3 2m27s sample-job-team-a-vjtnw 3/3 30s 3m50s sample-job-team-b-vn6rp 0/3 40s sample-job-team-a-z86h2 0/3 2m15s sample-job-team-b-zfwj8 0/3 28s sample-job-team-a-zjkbj 0/3 4s sample-job-team-a-zzvjg 3/3 83s 4m50s
이전 단계에서 작업 이름을 복사하고 Workloads API를 통해 작업의 허용 상태와 이벤트를 관찰합니다.
kubectl -n team-a describe workload JOB_NAME
대기 중인 작업이 ClusterQueue에서 증가하기 시작하면 실행 중인 스크립트에서
CTRL + C
를 눌러 스크립트를 종료합니다.모든 작업이 완료되면 노드가 축소되는 것을 확인할 수 있습니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
Kueue 할당량 시스템을 삭제합니다.
kubectl delete -n team-a localqueue lq-team-a kubectl delete -n team-b localqueue lq-team-b kubectl delete clusterqueue cluster-queue kubectl delete resourceflavor default-flavor
Kueue 매니페스트를 삭제합니다.
VERSION=VERSION kubectl delete -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
다음과 같이 클러스터를 삭제합니다.
gcloud container clusters delete kueue-autopilot --region=COMPUTE_REGION
다음 단계
GKE 문서 확인
채용정보 자세히 알아보기
네임스페이스 간 할당량 공유를 위한 Kueue 설정 방법 알아보기