אתם יכולים לבקש מכשירים באופן גמיש עבור עומסי העבודה שלכם ב-Google Kubernetes Engine (GKE) באמצעות הקצאת משאבים דינמית (DRA). במאמר הזה מוסבר איך ליצור ResourceClaimTemplate כדי לבקש מכשירים קיימים במאגרי צמתים באשכול, ואז ליצור עומס עבודה כדי לראות איך Kubernetes מקצה את המכשירים לפודים בצורה גמישה.
המסמך הזה מיועד למפעילים של אפליקציות ולמהנדסי נתונים שמריצים עומסי עבודה כמו 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 באשכולות רגילים
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
הקצאת מכשירים ופריסת עומסי עבודה
כדי לבקש הקצאת מכשיר לכל Pod, יוצרים ResourceClaimTemplate עם הגדרת המכשיר המבוקשת, כמו מעבדי GPU מסוג מסוים. כשפורסים עומס עבודה שמפנה ל-ResourceClaimTemplate, Kubernetes יוצר ResourceClaims לכל Pod בעומס העבודה על סמך ה-ResourceClaimTemplate. Kubernetes מקצה את המשאבים המבוקשים ומתזמן את ה-Pods בצמתים המתאימים.
כדי לבקש יחידות GPU בעומס עבודה עם 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 אחד לקונטיינר.