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