동적 리소스 할당 (DRA)을 사용하여 Google Kubernetes Engine (GKE) 워크로드에 필요한 기기를 유연하게 요청할 수 있습니다. 이 문서에서는 ResourceClaimTemplate을 만들어 클러스터의 노드 풀에 있는 기존 기기를 요청한 후 워크로드를 만들어 Kubernetes에서 포드에 기기를 유연하게 할당하는 방법을 보여줍니다.
이 문서는 AI/ML 또는 고성능 컴퓨팅 (HPC)과 같은 워크로드를 실행하는 애플리케이션 운영자 및 데이터 엔지니어를 대상으로 합니다.
DRA로 기기 요청 정보
DRA용 GKE 인프라를 설정하면 노드의 DRA 드라이버에서 클러스터에 DeviceClass 객체를 만듭니다. DeviceClass는 워크로드에 요청할 수 있는 기기 카테고리(예: GPU)를 정의합니다. 플랫폼 관리자는 특정 워크로드에서 요청할 수 있는 기기를 제한하는 추가 DeviceClass를 선택적으로 배포할 수 있습니다.
DeviceClass 내에서 기기를 요청하려면 다음 객체 중 하나를 만듭니다.
- ResourceClaim: ResourceClaim을 사용하면 포드 또는 사용자가 DeviceClass 내에서 특정 파라미터를 필터링하여 하드웨어 리소스를 요청할 수 있습니다.
- ResourceClaimTemplate: ResourceClaimTemplate은 포드에서 새 포드별 ResourceClaim을 자동으로 만드는 데 사용할 수 있는 템플릿을 정의합니다.
ResourceClaim 및 ResourceClaimTemplate에 대한 자세한 내용은 ResourceClaim 및 ResourceClaimTemplate을 사용해야 하는 경우를 참고하세요.
이 문서의 예시에서는 기본 ResourceClaimTemplate를 사용하여 지정된 기기 구성을 요청합니다. 지정할 수 있는 모든 필드에 대한 자세한 내용은 ResourceClaimTemplate API 참조를 확인하세요.
제한사항
다음과 같은 제한사항이 적용됩니다.
- GKE의 DRA 제한사항
- DRA 사용 여부와 관계없이 적용되는 기기별 제한사항: Standard 클러스터의 GPU 워크로드
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- GKE 클러스터가 DRA 워크로드에 구성되어 있는지 확인합니다.
기기 소유권 주장 및 워크로드 배포
포드별 기기 할당을 요청하려면 특정 유형의 GPU와 같이 요청된 기기 구성이 있는 ResourceClaimTemplate을 만듭니다. ResourceClaimTemplate을 참조하는 워크로드를 배포하면 Kubernetes는 ResourceClaimTemplate을 기반으로 워크로드의 각 포드에 ResourceClaim을 만듭니다. Kubernetes는 요청된 리소스를 할당하고 해당 노드에 포드를 스케줄링합니다.
DRA가 있는 워크로드에서 GPU를 요청하려면 다음 단계를 따르세요.
다음 매니페스트를
gpu-claim-template.yaml로 저장합니다.apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: gpu-claim-template spec: spec: devices: requests: - name: single-gpu exactly: deviceClassName: gpu.nvidia.com allocationMode: ExactCount count: 1ResourceClaimTemplate을 만듭니다.
kubectl create -f gpu-claim-template.yamlResourceClaimTemplate을 참조하는 워크로드를 만들려면 다음 매니페스트를
dra-gpu-example.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: dra-gpu-example spec: replicas: 1 selector: matchLabels: app: dra-gpu-example template: metadata: labels: app: dra-gpu-example spec: containers: - name: ctr image: ubuntu:22.04 command: ["bash", "-c"] args: ["echo $(nvidia-smi -L || echo Waiting...); sleep infinity"] resources: claims: - name: single-gpu resourceClaims: - name: single-gpu resourceClaimTemplateName: gpu-claim-template tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"워크로드를 배포합니다.
kubectl create -f dra-gpu-example.yaml
하드웨어 할당 확인
ResourceClaim 또는 포드의 로그를 확인하여 워크로드에 하드웨어가 할당되었는지 확인할 수 있습니다. 할당을 확인하려면 다음 단계를 따르세요.
배포한 워크로드와 연결된 ResourceClaim을 가져옵니다.
kubectl get resourceclaims출력은 다음과 비슷합니다.
NAME STATE AGE dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh allocated,reserved 9s포드에 할당된 하드웨어에 대한 자세한 내용을 가져옵니다.
kubectl describe resourceclaims RESOURCECLAIMRESOURCECLAIM을 이전 단계의 출력에서 가져온 ResourceClaim의 전체 이름으로 바꿉니다.출력은 다음과 비슷합니다.
Name: dra-gpu-example-68f595d7dc-prv27-single-gpu-qgjq5 Namespace: default Labels: <none> Annotations: resource.kubernetes.io/pod-claim-name: single-gpu API Version: resource.k8s.io/v1 Kind: ResourceClaim Metadata: # Multiple lines are omitted here. Spec: Devices: Requests: Exactly: Allocation Mode: ExactCount Count: 1 Device Class Name: gpu.nvidia.com Name: single-gpu Status: Allocation: Devices: Results: Device: gpu-0 Driver: gpu.nvidia.com Pool: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm Request: single-gpu Node Selector: Node Selector Terms: Match Fields: Key: metadata.name Operator: In Values: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm Reserved For: Name: dra-gpu-example-68f595d7dc-prv27 Resource: pods UID: e16c2813-08ef-411b-8d92-a72f27ebf5ef Events: <none>배포한 워크로드의 로그를 가져옵니다.
kubectl logs deployment/dra-gpu-example --all-pods=true출력은 다음과 비슷합니다.
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)이 출력은 GKE가 컨테이너에 GPU 하나를 할당했음을 나타냅니다.