הקצאת משאבי רשת באמצעות GKE managed DRANET

‫DRANET ב-Google Kubernetes Engine‏ (GKE) הוא תכונה מנוהלת של GKE שמבוססת על פרויקט DRANET בקוד פתוח, שמיישם את Kubernetes DRA API למשאבי רשת. ‫DRANET מאפשר לכם לבקש ולהקצות משאבי רשת בעלי ביצועים גבוהים עבור ה-Pods שלכם, כולל ממשקי רשת שתומכים בגישה ישירה לזיכרון מרחוק (RDMA). הגישה הזו מספקת API נייד שתואם ל-upstream לניהול משאבי רשת.

במאמר הזה מוסבר מהו GKE DRANET ואיך להקצות משאבי רשת לעומסי עבודה באשכולות GKE.

המאמר הזה מיועד לארכיטקטים של ענן ולמומחי רשתות שמתכננים רשתות לארגונים שלהם. סקירה כללית של כל מסמכי GKE זמינה במאמר עיון במסמכי GKE. במאמר תפקידים נפוצים של משתמשי GKE ומשימות מוסבר על תפקידים ומשימות נפוצים שמוזכרים בתוכן Google Cloud .

לפני שקוראים את המסמך הזה, חשוב לוודא שמכירים את הנושאים הבאים:

איך פועל GKE managed DRANET

‫GKE managed DRANET מיושם באמצעות networking-dra-driverDaemonSet. ה-DaemonSet הזה פועל בצמתים עם GPUs או TPUs שמופעל בהם GKE DRANET. הוא פועל כסוכן ברמת הצומת כדי לאפשר גילוי של ממשקי רשת והקצאה שלהם לקבוצות Pod באמצעות ממשקי ה-API של Kubernetes Dynamic Resource Allocation (DRA).

בגרסאות GKE‏ 1.34.1-gke.1829001 ואילך, מערכת GKE מתקינה באופן אוטומטי משאבי DeviceClass לרישות. הסיווגים האלה מגדירים את סוגי מכשירי הרשת שאפשר לבקש. לדוגמה, GKE יוצר את המחלקה mrdma.google.com למכשירים עם יכולת RDMA ואת המחלקה netdev.google.com למכשירי רשת אחרים.

כדי להשתמש ב-GKE DRANET, קודם מפעילים את מנהל ההתקן GKE DRANET במאגר צמתים עם מעבדי GPU או TPU.

כדי לבקש מכשירי רשת לעומס עבודה, מגדירים ResourceClaimTemplate. בתבנית הזו מציינים את DeviceClass ואת מצב ההקצאה, למשל בקשה של כל המכשירים הזמינים בצומת. במפרט של ה-Pod, מציינים הפניה לתבנית הזו בשדה resourceClaims כדי להעניק ל-Pod גישה לממשקי הרשת המבוקשים בצומת.

מתי כדאי להשתמש ב-DRANET מנוהל של GKE

‫GKE DRANET מספק דרך סטנדרטית לניהול משאבי רשת שמודעים לטופולוגיה ולתלות. הסטנדרטיזציה הזו הופכת אותו לפתרון מתאים לעומסי עבודה של AI ו-ML שדורשים רשתות עם ביצועים גבוהים.

תרחישים נפוצים לבקשת ממשקי רשת עבור Pod:

  • נשלחת בקשה לכל הממשקים הזמינים עם תמיכה ב-RDMA.
  • שליחת בקשה למספר מסוים של ממשקים עם תמיכה ב-RDMA.
  • בקשה לכל הממשקים הזמינים שאינם RDMA.
  • בקשה למספר מסוים של ממשקי non-RDMA.

שיקולים חשובים כשמשתמשים ב-DRANET מנוהל של GKE לרישות

כשמשתמשים ב-GKE DRANET לרשתות, כדאי לקחת בחשבון את הנקודות הבאות:

  • ממשקי רשת ייעודיים

    כשמשתמשים ב-GKE DRANET כדי לתבוע ממשק רשת בשביל Pod, הממשק הזה מוקדש ל-Pod הזה. אי אפשר לשתף אותו עם Pods אחרים באותו הצומת. כך מובטחת ל-Pod גישה בלעדית לרוחב הפס ולמשאבים המלאים של הממשק הזה, וזה יתרון משמעותי לעומסי עבודה שרגישים לביצועים.

  • שימוש בדרייבר DRANET מנוהל של GKE באופן עצמאי

    אתם יכולים להפעיל את מנהל ה-DRA של GKE כדי לנהל משאבי רשת בלי להפעיל מנהלי DRANET אחרים של GKE. כדי לעשות זאת, מוסיפים את התווית cloud.google.com/gke-networking-dra-driver=true למאגר צמתים עם מעבדי GPU ו-TPU.

  • שימוש במנהלי התקנים אחרים של GKE DRA

    כדי להשיג תפוקה גבוהה יותר בעומסי עבודה תובעניים של AI/ML, אפשר לשלב את DRA API למאיצים (כמו GPU ו-TPU) עם רשת מנוהלת של GKE DRANET. הגישה המשולבת הזו משפרת את התאמת המשאבים ואת המודעות לטופולוגיה. הוראות לשימוש ב-DRA למשאבים אחרים מפורטות במאמר הכנת תשתית GKE לעומסי עבודה של DRA.

  • הימנעות מהגדרות סותרות

    הדרייבר GKE DRANET מנהל ממשקי RDMA ו-gVNIC שלא מוגדרים בהם טווחים של כתובות IP משניות. אל תשתמשו גם במנהל התקן GKE DRANET וגם ב-GKE multi-network API עם משאב Network מסוג Device באותו אשכול. השימוש במנהל ההתקן וב-API ביחד לא נתמך כי שני ממשקי ה-API מנסים לנהל את אותו סט של כרטיסי רשת, מה שעלול להוביל להגדרה שגויה ולהתנהגות בלתי צפויה.

דרישות

כדי להשתמש ב-DRANET מנוהל של GKE, הסביבה שלכם צריכה לעמוד בדרישות הבאות:

  • ‫GKE גרסה ‎1.34.1-gke.1829001 ואילך.
  • ‫GKE Dataplane V2 מופעל באשכול.
  • ‫(Preview)‏ GKE DRANET זמין במכונות A4X Max.

מגבלות

יש כמה מגבלות ל-GKE DRANET:

  • אי אפשר להשתמש ב-GKE DRANET כדי להקצות את כרטיס ממשק הרשת (NIC) שמוגדר כברירת מחדל או כרטיסי NIC וירטואליים (כמו veth).
  • אין תמיכה במידרוג אוטומטי של אשכולות וב-Autopilot.
  • אי אפשר להשתמש ב-GKE DRANET עם ממשקים שבהם הגדרתם secondaryPodRange.

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

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

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות ליצירת מאגרי צמתים ולהקצאת משאבי רשת, צריך לבקש מהאדמין להקצות לכם את התפקיד Kubernetes Engine Admin (roles/container.admin) ב-IAM בפרויקט. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

יצירת אשכול

יוצרים אשכול GKE Standard שמשתמש ב-GKE Dataplane V2:

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --region=CONTROL_PLANE_LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION

מחליפים את מה שכתוב בשדות הבאים:

  • CLUSTER_NAME: השם של האשכול החדש.
  • CONTROL_PLANE_LOCATION: האזור או האזור של מישור הבקרה של האשכול, למשל us-central1 או us-central1-a.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • CLUSTER_VERSION: גרסת GKE של האשכול. הגרסה הזו צריכה להיות 1.34.1-gke.1829001 ואילך.

שימוש בממשקי RDMA ממאגר צמתים של GPU

בקטעים הבאים מוסבר איך להגדיר מאגר צמתים ועומס עבודה של GPU לשימוש בממשקי רשת RDMA עם GKE DRANET.

הפעלת דרייבר GKE מנוהל של DRANET במאגר צמתים של GPU

כדי להפעיל את דרייבר ה-DRANET של GKE במאגר צמתים של GPU שתומך ב-RDMA, מוסיפים את התווית cloud.google.com/gke-networking-dra-driver=true כשיוצרים את מאגר הצמתים.

gcloud beta container node-pools create NODE_POOL_NAME \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --node-locations=NODE_LOCATIONS \
  --accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
  --machine-type=MACHINE_TYPE \
  --num-nodes=NUM_NODES \
  --reservation-affinity=specific \
  --reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
  --accelerator-network-profile=auto \
  --node-labels=cloud.google.com/gke-networking-dra-driver=true

מחליפים את מה שכתוב בשדות הבאים:

  • NODE_POOL_NAME: השם של מאגר הצמתים החדש.
  • REGION: האזור Google Cloud של האשכול.
  • CLUSTER_NAME: השם של האשכול.
  • ACCELERATOR_TYPE: הסוג של מאיץ GPU:

    לדוגמה:

    • מכונות וירטואליות מסוג A4: מזינים nvidia-b200.
    • מכונות VM מסוג A3 Ultra: מזינים nvidia-h200-141gb.
  • ACCELERATOR_COUNT: מספר יחידות ה-GPU לצירוף לצמתים במאגר הצמתים. לדוגמה, גם במכונות וירטואליות מסוג a4-highgpu-8g וגם במכונות וירטואליות מסוג a3-ultragpu-8g, מספר ה-GPU הוא 8.

  • DRIVER_VERSION: גרסת מנהל ההתקן של ה-GPU שבה רוצים להשתמש. לדוגמה, default או latest.

  • MACHINE_TYPE: סוג המכונה של מאגר הצמתים, לדוגמה, a3-ultragpu-8g.

  • NUM_NODES: מספר הצמתים במאגר הצמתים. עבור התחלה גמישה (Flex-start), הערך הזה חייב להיות 0.

  • RESERVATION_PROJECT: מזהה הפרויקט של ההזמנה.

  • RESERVATION_NAME: השם של ההזמנה. כדי למצוא את הערך הזה, אפשר לעיין במאמר בנושא צפייה בבקשות למקום שמור לעתיד.

  • RESERVATION_BLOCK: השם של בלוק ספציפי בהזמנה. כדי למצוא את הערך הזה, אפשר לעיין במאמר בנושא צפייה בבקשות למקום שמור לעתיד.

הפקודה הזו משתמשת בפרופילים של רשתות האצה כדי להגדיר אוטומטית רשתות VPC ורשתות משנה למכונות הווירטואליות של המאיץ. אפשר גם לציין במפורש את רשת ה-VPC ואת רשתות המשנה.

פריסת משאבי RDMA של עומס עבודה

כדי להקצות משאבי RDMA ל-Pod, מציינים ResourceClaimTemplate.

  1. יוצרים ResourceClaimTemplate כדי להגדיר איך להקצות את מכשירי ה-RDMA. בקובץ המניפסט הבא יש בקשה לכל מכשירי mrdma הזמינים בצומת. שומרים את קובץ המניפסט בשם all-mrdma-template.yaml:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: All
    
  2. החלת המניפסט:

    kubectl apply -f all-mrdma-template.yaml
    
  3. פורסים את עומס העבודה ומפנים אל ResourceClaimTemplate. במניפסט הבא מוגדר Pod שמפנה לתבנית all-mrdma, שנותנת ל-Pod גישה לממשקי RDMA בצומת. שומרים את קובץ המניפסט בשם agnhost-rdma-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-rdma
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: rdma
          limits:
            nvidia.com/gpu: 1
      resourceClaims:
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  4. החלת המניפסט:

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. מוודאים שממשקי הרשת הנוספים שהוקצו גלויים בתוך ה-Pod.

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    בדוגמה הבאה של פלט אפשר לראות את ממשקי ברירת המחדל eth0 ו-lo, וגם את ממשקי ה-RDMA שהוקצו, כמו gpu0rdma0. המספר והשמות של ממשקי הרשת (NIC) משתנים בהתאם לסוג המכונה של צומת GKE.

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

שימוש בממשקי רשת שאינם RDMA במאגר צמתי TPU

בקטעים הבאים מוסבר איך להגדיר מאגר צמתים של TPU ועומס עבודה לשימוש בממשקי רשת שאינם RDMA עם GKE DRANET.

אימות של DeviceClasses ברשת

מוודאים שקיימים באשכול משאבי DeviceClass לרשת.

kubectl get deviceclass netdev.google.com

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

NAME                AGE
netdev.google.com   2d22h

הפעלת דרייבר DRANET מנוהל של GKE במאגר צמתים של פרוסת TPU

כדי להפעיל את דרייבר ה-DRANET של GKE כשיוצרים מאגר צמתים של פרוסת TPU, מוסיפים את התווית cloud.google.com/gke-networking-dra-driver=true.

gcloud beta container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_LOCATIONS \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto \
    --node-labels=cloud.google.com/gke-networking-dra-driver=true

מחליפים את מה שכתוב בשדות הבאים:

  • NODE_POOL_NAME: השם של מאגר הצמתים החדש.
  • LOCATION: האזור או האזור של האשכול. Google Cloud
  • CLUSTER_NAME: השם של האשכול.
  • NODE_LOCATIONS: Google Cloud האזורים של הצמתים במאגר הצמתים.
  • MACHINE_TYPE: סוג המכונה שבה רוצים להשתמש לצמתים. מידע נוסף על סוגי מכונות שתואמים ל-TPU זמין במאמר בחירת גרסת ה-TPU.
  • TPU_TOPOLOGY: טופולוגיית ה-TPU, לדוגמה, 2x4x4. הפורמט של הטופולוגיה תלוי בגרסת ה-TPU. מידע נוסף על טופולוגיות של TPU זמין במאמר בחירת טופולוגיה.
  • NUM_NODES: מספר הצמתים במאגר הצמתים.

מידע נוסף זמין במאמר יצירת מאגר צמתים של פרוסת TPU עם מארח יחיד.

פריסת עומס עבודה שדורש את כל מכשירי הרשת

כדי להקצות מכשירי רשת שאינם RDMA לקבוצת Pod, מציינים ResourceClaimTemplate.

  1. יוצרים ResourceClaimTemplate שמפנה אל netdev.google.com DeviceClass. במניפסט הבא מתבצעת בקשה לכל מכשירי הרשת שזמינים בצומת ושאינם RDMA.

    שומרים את קובץ המניפסט בשם all-netdev-template.yaml:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-netdev
    spec:
      spec:
        devices:
          requests:
          - name: req-netdev
            exactly:
              deviceClassName: netdev.google.com
              allocationMode: All
    
  2. החלת המניפסט:

    kubectl apply -f all-netdev-template.yaml
    
  3. פורסים את עומס העבודה ומפנים אל ResourceClaimTemplate. הקובץ הבא של מניפסט פורס Pod שמשתמש בתבנית all-netdev כדי להעניק ל-Pod גישה לכל מכשירי הרשת שאינם RDMA בצומת. שומרים את קובץ המניפסט בשם netdev-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-netdev
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: netdev
          limits:
            google.com/tpu: 4
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
      resourceClaims:
      - name: netdev
        resourceClaimTemplateName: all-netdev
    

    מחליפים את מה שכתוב בשדות הבאים:

    • TPU_ACCELERATOR: סוג המאיץ של TPU, לדוגמה, tpu-v5p-slice.
    • TPU_TOPOLOGY: טופולוגיית ה-TPU, לדוגמה, 2x4x4.
  4. החלת המניפסט:

    kubectl apply -f netdev-pod.yaml
    
  5. מוודאים שממשקי הרשת הנוספים שהוקצו גלויים בתוך ה-Pod.

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    בדוגמה הבאה של פלט מוצגים ממשקי ברירת המחדל eth0 ו-lo, וגם מכשירי הרשת שהוקצו, עם שמות כמו eth1 ו-eth2. מספר כרטיסי ה-NIC והשמות שלהם משתנים בהתאם לסוג המכונה של צומת GKE.

    eth0
    eth1
    eth2
    lo
    

בקשה למספר ספציפי של מכשירי רשת

בדוגמאות הקודמות אפשר לראות איך מבקשים את כל מכשירי הרשת הזמינים מסוג מסוים על ידי הגדרת allocationMode ל-All. אם אתם צריכים לבקש מספר מסוים של מכשירים, אתם יכולים להגדיר את allocationMode ל-ExactCount ב-ResourceClaimTemplate.

בדוגמה הבאה מוצגת בקשה לשני מכשירי רשת RDMA:

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: two-mrdma
spec:
  spec:
    devices:
      requests:
      - name: req-mrdma
        exactly:
          deviceClassName: mrdma.google.com
          allocationMode: ExactCount
          count: 2

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