DRANET ב-Google Kubernetes Engine (GKE) הוא תכונה מנוהלת של GKE שמבוססת על פרויקט DRANET בקוד פתוח, שמיישם את Kubernetes DRA API למשאבי רשת. DRANET מאפשר לכם לבקש ולהקצות משאבי רשת בעלי ביצועים גבוהים עבור ה-Pods שלכם, כולל ממשקי רשת שתומכים בגישה ישירה לזיכרון מרחוק (RDMA). הגישה הזו מספקת API נייד שתואם ל-upstream לניהול משאבי רשת.
במאמר הזה מוסבר מהו GKE DRANET ואיך להקצות משאבי רשת לעומסי עבודה באשכולות GKE.
המאמר הזה מיועד לארכיטקטים של ענן ולמומחי רשתות שמתכננים רשתות לארגונים שלהם. סקירה כללית של כל מסמכי GKE זמינה במאמר עיון במסמכי GKE. במאמר תפקידים נפוצים של משתמשי GKE ומשימות מוסבר על תפקידים ומשימות נפוצים שמוזכרים בתוכן Google Cloud .
לפני שקוראים את המסמך הזה, חשוב לוודא שמכירים את הנושאים הבאים:
- הקצאת משאבים דינמית
- מידע על הקצאת משאבים דינמית ב-GKE
- מושגים ב-Kubernetes
- GKE networking
- מידע בסיסי על רישות ב-GKE
איך פועל 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.
- מכונות וירטואליות מסוג A4: מזינים
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.
יוצרים
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החלת המניפסט:
kubectl apply -f all-mrdma-template.yamlפורסים את עומס העבודה ומפנים אל
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החלת המניפסט:
kubectl apply -f agnhost-rdma-pod.yamlמוודאים שממשקי הרשת הנוספים שהוקצו גלויים בתוך ה-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.
יוצרים
ResourceClaimTemplateשמפנה אלnetdev.google.comDeviceClass. במניפסט הבא מתבצעת בקשה לכל מכשירי הרשת שזמינים בצומת ושאינם 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החלת המניפסט:
kubectl apply -f all-netdev-template.yamlפורסים את עומס העבודה ומפנים אל
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.
-
החלת המניפסט:
kubectl apply -f netdev-pod.yamlמוודאים שממשקי הרשת הנוספים שהוקצו גלויים בתוך ה-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