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

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

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

מגבלות

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

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

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

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-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 למאגר הצמתים.
  • מריצים את DRA driver DaemonSet: מוסיפים את התווית nvidia.com/gpu.present=true node לצומת.
  • הגדרת שינוי גודל אוטומטי: כדי להשתמש בשינוי גודל אוטומטי של אשכול במאגר הצמתים, מוסיפים את תווית הצומת 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. מתקינים את דרייבר ה-GPU של NVIDIA DRA בגרסה 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: ""
    

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