DRA를 사용하여 기존 기기를 워크로드에 할당

동적 리소스 할당 (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 참조를 확인하세요.

제한사항

다음과 같은 제한사항이 적용됩니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

기기 소유권 주장 및 워크로드 배포

포드별 기기 할당을 요청하려면 특정 유형의 GPU와 같이 요청된 기기 구성이 있는 ResourceClaimTemplate을 만듭니다. ResourceClaimTemplate을 참조하는 워크로드를 배포하면 Kubernetes는 ResourceClaimTemplate을 기반으로 워크로드의 각 포드에 ResourceClaim을 만듭니다. Kubernetes는 요청된 리소스를 할당하고 해당 노드에 포드를 스케줄링합니다.

DRA가 있는 워크로드에서 GPU를 요청하려면 다음 단계를 따르세요.

  1. 다음 매니페스트를 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: 1
    
  2. ResourceClaimTemplate을 만듭니다.

    kubectl create -f gpu-claim-template.yaml
    
  3. ResourceClaimTemplate을 참조하는 워크로드를 만들려면 다음 매니페스트를 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"
    
  4. 워크로드를 배포합니다.

    kubectl create -f dra-gpu-example.yaml
    

하드웨어 할당 확인

ResourceClaim 또는 포드의 로그를 확인하여 워크로드에 하드웨어가 할당되었는지 확인할 수 있습니다. 할당을 확인하려면 다음 단계를 따르세요.

  1. 배포한 워크로드와 연결된 ResourceClaim을 가져옵니다.

    kubectl get resourceclaims
    

    출력은 다음과 비슷합니다.

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. 포드에 할당된 하드웨어에 대한 자세한 내용을 가져옵니다.

    kubectl describe resourceclaims RESOURCECLAIM
    

    RESOURCECLAIM을 이전 단계의 출력에서 가져온 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>
    
  3. 배포한 워크로드의 로그를 가져옵니다.

    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 하나를 할당했음을 나타냅니다.

다음 단계