אתם יכולים לבקש מכשירים באופן גמיש לעומסי העבודה שלכם ב-Google Kubernetes Engine (GKE) באמצעות הקצאת משאבים דינמית (DRA). במאמר הזה מוסבר איך ליצור ResourceClaimTemplate כדי לבקש מכשירים קיימים במאגרי צמתים באשכול, ואז ליצור עומס עבודה כדי לראות איך Kubernetes מקצה את המכשירים בצורה גמישה ל-Pods.
המסמך הזה מיועד למפעילים של אפליקציות ולמהנדסי נתונים שמריצים עומסי עבודה כמו AI/ML או מחשוב עתיר ביצועים (HPC).
מידע על בקשת מכשירים באמצעות DRA
כשמגדירים את התשתית של GKE ל-DRA, מנהלי ההתקנים של DRA בצמתים יוצרים אובייקטים של DeviceClass באשכול. ה-DeviceClass מגדיר קטגוריה של מכשירים, כמו GPUs, שאפשר לבקש עבור עומסי עבודה. אדמינים של פלטפורמות יכולים גם לפרוס DeviceClasses נוספים שמגבילים את המכשירים שאפשר לבקש בעומסי עבודה ספציפיים.
כדי לבקש מכשירים ב-DeviceClass, יוצרים אחד מהאובייקטים הבאים:
- ResourceClaim: אובייקט ResourceClaim מאפשר ל-Pod או למשתמש לבקש משאבי חומרה על ידי סינון פרמטרים מסוימים ב-DeviceClass.
- ResourceClaimTemplate: ResourceClaimTemplate מגדיר תבנית שרכיבי Pod יכולים להשתמש בה כדי ליצור באופן אוטומטי ResourceClaim חדש לכל Pod.
מידע נוסף על ResourceClaims ו-ResourceClaimTemplates זמין במאמר מתי כדאי להשתמש ב-ResourceClaims וב-ResourceClaimTemplates.
בדוגמאות במסמך הזה נעשה שימוש ב-ResourceClaimTemplate בסיסי כדי לבקש את הגדרת המכשיר שצוינה. מידע נוסף על כל השדות שאפשר לציין מופיע במאמר בנושא ResourceClaimTemplate API.
מגבלות
ההגבלות הבאות חלות:
- מגבלות של DRA ב-GKE
- מגבלות ספציפיות למכשיר, שחלות בלי קשר לשימוש ב-DRA: עומסי עבודה של GPU באשכולות רגילים
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
הקצאת מכשירים ופריסת עומסי עבודה
כדי לבקש הקצאת מכשיר לכל Pod, יוצרים ResourceClaimTemplate עם הגדרת המכשיר המבוקשת, כמו מעבדי GPU מסוג מסוים. כשפורסים עומס עבודה שמפנה אל ResourceClaimTemplate, Kubernetes יוצר ResourceClaim לכל Pod בעומס העבודה על סמך ResourceClaimTemplate. Kubernetes מקצה את המשאבים המבוקשים ומתזמן את ה-Pods בצמתים המתאימים.
כדי לבקש GPUs בעומס עבודה עם DRA, פועלים לפי השלבים הבאים:
שומרים את קובץ המניפסט הבא בשם
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יוצרים את ResourceClaimTemplate:
kubectl create -f gpu-claim-template.yamlכדי ליצור עומס עבודה שמפנה אל ResourceClaimTemplate, שומרים את המניפסט הבא כ-
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"פורסים את עומס העבודה:
kubectl create -f dra-gpu-example.yaml
אימות הקצאת החומרה
כדי לוודא שהוקצה לכם חומרה, אפשר לבדוק את ResourceClaim או את היומנים של ה-Pod. כדי לאמת את ההקצאה, מבצעים את השלבים הבאים:
מקבלים את ResourceClaim שמשויך לעומס העבודה שפרסתם:
kubectl get resourceclaimsהפלט אמור להיראות כך:
NAME STATE AGE dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh allocated,reserved 9sפרטים נוספים על הציוד שהוקצה ל-Pod:
kubectl describe resourceclaims RESOURCECLAIMמחליפים את
RESOURCECLAIMבשם המלא של ResourceClaim שקיבלתם מהפלט של השלב הקודם.הפלט אמור להיראות כך:
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>קבלת יומנים של עומס העבודה שפרסתם:
kubectl logs deployment/dra-gpu-example --all-pods=trueהפלט אמור להיראות כך:
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)הפלט הזה מציין ש-GKE הקצה GPU אחד לקונטיינר.