במאמר הזה נסביר איך להגדיר באופן ידני את התשתית של Google Kubernetes Engine (GKE) כדי לתמוך בהקצאת משאבים דינמית (DRA). שלבי ההגדרה כוללים יצירה של מאגרי צמתים שמשתמשים ב-GPU והתקנה של דרייברים של DRA.
המסמך הזה מיועד לאדמינים של פלטפורמות שרוצים ליצור תשתית עם מכשירי חומרה מיוחדים שמפעילים של אפליקציות יכולים להשתמש בהם בעומסי עבודה.
מגבלות
ההגבלות הבאות חלות:
- מגבלות של DRA ב-GKE
- מגבלות ספציפיות למכשיר, שחלות בלי קשר לשימוש ב-DRA: עומסי עבודה של GPU באשכולות רגילים
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
אשכול GKE Standard שפועלת בו גרסה 1.35 ואילך. אפשר גם ליצור אשכול אזורי.
מתקינים את Helm. אם אתם משתמשים ב-Cloud Shell, Helm כבר מותקן.
יצירת מאגר צמתים ב-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=truenode לצומת. - הגדרת שינוי גודל אוטומטי: כדי להשתמש בשינוי גודל אוטומטי של אשכול במאגר הצמתים, מוסיפים את תווית הצומת
cloud.google.com/gke-nvidia-gpu-dra-driver=trueלמאגר הצמתים. הכלי Cluster Autoscaler משתמש בתווית הצומת הזו כדי לזהות צמתים שמריצים את מנהל ההתקן של DRA עבור מעבדי GPU.
כדי ליצור ולהגדיר מאגרי צמתים של GPU, פועלים לפי השלבים הבאים:
יוצרים מאגר צמתים של 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
התקנת מנהלי התקנים של DRA
מושכים ומעדכנים את תרשים Helm שמכיל את הדרייבר של NVIDIA DRA:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateמתקינים את דרייבר ה-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
מוודאים שרכיבי ה-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מוודאים שברשימת ה-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: ""