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

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

מגבלות

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

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

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

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

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

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