הכנת תשתית GKE לעומסי עבודה של DRA

במאמר הזה נסביר איך להגדיר באופן ידני את התשתית של Google Kubernetes Engine ‏ (GKE) כדי לתמוך בהקצאת משאבים דינמית (DRA). שלבי ההגדרה כוללים יצירה של מאגרי צמתים שמשתמשים ב-GPU והתקנה של דרייברים של DRA.

המסמך הזה מיועד לאדמינים של פלטפורמות שרוצים ליצור תשתית עם מכשירי חומרה ייעודיים, שמפעילי אפליקציות יכולים להשתמש בהם בעומסי עבודה.

מגבלות

ההגבלות הבאות חלות:

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

יצירת מאגר צמתים ב-GKE עם מעבדי GPU

בקטע הזה מוסבר איך ליצור מאגר צמתים של GPU ולהתקין את מנהלי ההתקנים המתאימים של DRA. השלבים בקטע הזה רלוונטיים רק למאגרי צמתים שיוצרים באופן ידני. כדי ליצור מאגר צמתים של GPU שתומך ב-DRA:

  • השבתה של התקנה אוטומטית של מנהל התקן של GPU: מציינים את האפשרות gpu-driver-version=disabled בדגל --accelerator.
  • השבתת הפלאגין של מכשיר ה-GPU: מוסיפים את התווית gke-no-default-nvidia-gpu-device-plugin=true של הצומת למאגר הצמתים.
  • מריצים את ה-DaemonSet של מנהל התקן ה-DRA: מוסיפים את התווית nvidia.com/gpu.present=true node למאגר הצמתים.
  • הגדרת התאמה לעומס (autoscaling): כדי להשתמש ב-Cluster Autoscaler במאגר הצמתים, מוסיפים את תווית הצומת cloud.google.com/gke-nvidia-gpu-dra-driver=true למאגר הצמתים. הכלי Cluster Autoscaler משתמש בתווית הצומת הזו כדי לזהות צמתים שמריצים את מנהל ההתקן של DRA עבור מעבדי GPU.

כדי ליצור ולהגדיר מאגרי צמתים של GPU, פועלים לפי השלבים הבאים:

  1. יוצרים מאגר צומתי GPU. הפקודות לדוגמה הבאות יוצרות מאגרי צמתים עם הגדרות שונות:

    • יצירת מאגר צמתים עם מכונת g2-standard-24 שיש לה שני מעבדי L4 GPU:

      gcloud container node-pools create NODEPOOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --node-locations=NODE_LOCATION1,NODE_LOCATION2,... \
          --machine-type="g2-standard-24" \
          --accelerator="type=nvidia-l4,count=2,gpu-driver-version=disabled" \
          --num-nodes="1" \
          --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫NODEPOOL_NAME: שם למאגר הצמתים.
      • ‫CLUSTER_NAME: השם של האשכול.
      • ‫CONTROL_PLANE_LOCATION: האזור או האזור של מישור הבקרה של האשכול, למשל us-central1 או us-central1-a.
      • ‫NODE_LOCATION1,NODE_LOCATION2,...: רשימה מופרדת בפסיקים של אזורים, באותו אזור כמו מישור הבקרה, שבהם ייצרו צמתים. בוחרים אזורים שבהם יש זמינות של GPU.
    • יצירת מאגר צמתים עם שינוי גודל אוטומטי עם a2-ultragpu-1g מכונות שכוללות מעבד GPU אחד מסוג NVIDIA A100 ‏ (80 GB) בכל מכונה:

      gcloud container node-pools create NODEPOOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --node-locations=NODE_LOCATION1,NODE_LOCATION2,... \
          --enable-autoscaling \
          --max-nodes=5 \
          --machine-type="a2-ultragpu-1g" \
          --accelerator="type=nvidia-a100-80gb,count=1,gpu-driver-version=disabled" \
          --num-nodes="1" \
          --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true,cloud.google.com/gke-nvidia-gpu-dra-driver=true
      
  2. התקנה ידנית של דרייברים של NVIDIA GPU

  3. התקנת מנהלי התקנים של DRA

התקנה של מנהלי התקנים של DRA

  1. מושכים ומעדכנים את תרשים Helm שמכיל את הדרייבר NVIDIA DRA:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. מתקינים את הדרייבר של NVIDIA DRA GPU בגרסה 25.8.0 או בגרסה מתקדמת יותר:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.8.0" --create-namespace --namespace=nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set 'kubeletPlugin.tolerations[0].key=nvidia.com/gpu' \
        --set 'kubeletPlugin.tolerations[0].operator=Exists' \
        --set 'kubeletPlugin.tolerations[0].effect=NoSchedule'
    

    בצמתים של Ubuntu, מציינים את נתיב הספרייה "/opt/nvidia" באמצעות הדגל --set nvidiaDriverRoot.

בדיקה שהתשתית מוכנה ל-DRA

  1. מוודאים שרכיבי ה-Pod של מנהל ההתקן DRA פועלים:

    kubectl get pods -n nvidia-dra-driver-gpu
    

    הפלט אמור להיראות כך:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    
  2. מוודאים שברשימת ResourceSlice מופיעים מכשירי החומרה שהוספתם:

    kubectl get resourceslices -o yaml
    

    הפלט אמור להיראות כך:

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1
      kind: ResourceSlice
      metadata:
      # Multiple lines are omitted here.
      spec:
        devices:
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 0
            minor:
              int: 0
            pcieBusID:
              string: "0000:00:03.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f
          capacity:
            memory:
              value: 23034Mi
          name: gpu-0
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 1
            minor:
              int: 1
            pcieBusID:
              string: "0000:00:04.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978
          capacity:
            memory:
              value: 23034Mi
          name: gpu-1
        driver: gpu.nvidia.com
        nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
        pool:
          generation: 1
          name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

המאמרים הבאים