Attribuer des appareils existants à des charges de travail avec DRA

Vous pouvez demander des appareils de manière flexible pour vos charges de travail Google Kubernetes Engine (GKE) à l'aide de l'allocation dynamique des ressources (DRA). Ce document vous explique comment créer un ResourceClaimTemplate pour demander des appareils existants dans les pools de nœuds de votre cluster, puis créer une charge de travail pour observer comment Kubernetes alloue de manière flexible les appareils à vos pods.

Ce document s'adresse aux opérateurs d'applications et aux ingénieurs des données qui exécutent des charges de travail telles que l'IA/ML ou le calcul hautes performances (HPC).

Demander des appareils avec DRA

Lorsque vous configurez votre infrastructure GKE pour DRA, les pilotes DRA de vos nœuds créent des objets DeviceClass dans le cluster. Une DeviceClass définit une catégorie d'appareils, tels que les GPU, qui peuvent être demandés pour les charges de travail. Un administrateur de plate-forme peut éventuellement déployer des DeviceClasses supplémentaires qui limitent les appareils que vous pouvez demander dans des charges de travail spécifiques.

Pour demander des appareils dans une DeviceClass, vous devez créer l'un des objets suivants :

  • ResourceClaim : ResourceClaim permet à un pod ou à un utilisateur de demander des ressources matérielles en filtrant certains paramètres dans une DeviceClass.
  • ResourceClaimTemplate : un ResourceClaimTemplate définit un modèle que les pods peuvent utiliser pour créer automatiquement des ResourceClaims par pod.

Pour en savoir plus sur les ResourceClaims et les ResourceClaimTemplates, consultez Quand utiliser les ResourceClaims et les ResourceClaimTemplates.

Les exemples de ce document utilisent un ResourceClaimTemplate de base pour demander la configuration d'appareil spécifiée. Pour en savoir plus sur tous les champs que vous pouvez spécifier, consultez la documentation de référence de l'API ResourceClaimTemplate.

Limites

Les limites suivantes s'appliquent :

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser la Google Cloud CLI pour cette tâche, installez et initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.

Revendiquer des appareils et déployer des charges de travail

Pour demander l'allocation d'appareils par pod, vous devez créer un ResourceClaimTemplate qui contient la configuration d'appareil souhaitée, comme des GPU d'un type spécifique. Lorsque vous déployez une charge de travail qui fait référence à ResourceClaimTemplate, Kubernetes crée des ResourceClaims pour chaque pod de la charge de travail en fonction de ResourceClaimTemplate. Kubernetes alloue les ressources demandées et planifie les pods sur les nœuds correspondants.

Pour demander des GPU dans une charge de travail avec DRA, procédez comme suit :

  1. Enregistrez le manifeste suivant sous le nom 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. Créez le ResourceClaimTemplate :

    kubectl create -f gpu-claim-template.yaml
    
  3. Pour créer une charge de travail qui fait référence à ResourceClaimTemplate, enregistrez le fichier manifeste suivant sous le nom 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. Déployer la charge de travail :

    kubectl create -f dra-gpu-example.yaml
    

Vérifier l'allocation du matériel

Vous pouvez vérifier que du matériel a été alloué à vos charges de travail en consultant la ResourceClaim ou les journaux de votre pod. Pour vérifier l'attribution, procédez comme suit :

  1. Obtenez le ResourceClaim associé à la charge de travail que vous avez déployée :

    kubectl get resourceclaims
    

    Le résultat ressemble à ce qui suit :

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. Obtenez plus d'informations sur le matériel attribué au pod :

    kubectl describe resourceclaims RESOURCECLAIM
    

    Remplacez RESOURCECLAIM par le nom complet de ResourceClaim que vous avez obtenu à l'étape précédente.

    Le résultat ressemble à ce qui suit :

    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. Obtenez les journaux de la charge de travail que vous avez déployée :

    kubectl logs deployment/dra-gpu-example --all-pods=true
    

    Le résultat ressemble à ce qui suit :

    [pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
    

    Ce résultat indique que GKE a attribué un GPU au conteneur.

Étapes suivantes