הקצאת מכשירים קיימים לעומסי עבודה באמצעות DRA

אתם יכולים לבקש מכשירים באופן גמיש עבור עומסי העבודה שלכם ב-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.

מגבלות

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

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

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

  • מפעילים את ממשק ה-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, פועלים לפי השלבים הבאים:

  1. שומרים את המניפסט הבא בתור 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
    
  2. יוצרים את ResourceClaimTemplate:

    kubectl create -f gpu-claim-template.yaml
    
  3. כדי ליצור עומס עבודה שמפנה אל 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"
    
  4. פורסים את עומס העבודה:

    kubectl create -f dra-gpu-example.yaml
    

אימות הקצאת החומרה

כדי לוודא שהוקצה לכם חומרה לעומסי העבודה, אפשר לבדוק את ResourceClaim או את היומנים של ה-Pod. כדי לאמת את ההקצאה, פועלים לפי השלבים הבאים:

  1. מקבלים את ResourceClaim שמשויך לעומס העבודה שפרסתם:

    kubectl get resourceclaims
    

    הפלט אמור להיראות כך:

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. פרטים נוספים על החומרה שהוקצתה ל-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>
    
  3. מקבלים יומנים של עומס העבודה שפרסתם:

    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 אחד לקונטיינר.

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