הגדרת מספר מקסימלי של Pods לכל צומת

בדף הזה מוסבר איך לבצע אופטימיזציה של משאבי האשכול כדי להבטיח קיבולת תזמון מספקת ל-Pods, על ידי הגדרת המספר המקסימלי של Pods לכל צומת באשכולות Standard ב-Google Kubernetes Engine ‏ (GKE). בדף הזה מוסבר איך הקשר בין Pods, גדלים של בלוקי CIDR ומספר הצמתים משפיע על האופן שבו GKE מתזמן Pods ומקצה כתובות IP באשכול. הדף הזה כולל גם פרטים על ההגבלות וערכי ברירת המחדל של מספר הפודים המקסימלי לכל צומת.

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

לפני שאתם קוראים את הדף הזה, כדאי שתכירו את ההבדלים בין אשכולות GKE Standard לבין אשכולות Autopilot ואת מודל הרשת של Kubernetes.

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

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

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

הגבלות

  • אפשר להגדיר את מספר ה-Pods המקסימלי לכל צומת רק באשכול המותאם ל-VPC.
  • יצירת הצמתים מוגבלת לפי מספר הכתובות הזמינות בטווח הכתובות של ה-Pod. בודקים את טבלת התכנון של טווח כתובות ה-IP כדי לראות את גדלי ברירת המחדל, המינימום והמקסימום של טווח כתובות ה-Pod. אפשר גם להוסיף כתובות IP נוספות של Pod באמצעות CIDR של כמה Pod לא רציפים.
  • כל אשכול צריך ליצור פודים של kube-system, כמו kube-proxy, במרחב השמות kube-system. כשמפחיתים את המספר המקסימלי של Pods לכל צומת, חשוב לזכור להביא בחשבון גם את ה-Pods של עומס העבודה וגם את ה-Pods של המערכת. כדי להציג את רשימת ה-Pods של המערכת באשכול, מריצים את הפקודה הבאה:

    kubectl get pods --namespace kube-system
    

הגדרת המספר המקסימלי של Pods לכל צומת

אפשר להגדיר את המספר המקסימלי של Pods לכל צומת באשכול Standard כשיוצרים אשכול או כשיוצרים מאגר צמתים. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את האשכול או את מאגר הצמתים. במערכות Autopilot, המספר המקסימלי של הצמתים מוגדר מראש ואי אפשר לשנות אותו.

עם זאת, אם נגמרות לכם כתובות ה-IP של ה-Pod, אתם יכולים ליצור טווחים נוספים של כתובות IP של Pod באמצעות CIDR רב-Pod לא רציף.

אפשר להגדיר את הגודל של טווח כתובות ה-Pod כשיוצרים אשכול באמצעות ה-CLI של gcloud או מסוף Google Cloud .

gcloud

כדי להגדיר את ברירת המחדל של מספר הפודים המקסימלי לכל צומת באמצעות ה-CLI של gcloud, מריצים את הפקודה הבאה:

gcloud container clusters create CLUSTER_NAME \
    --enable-ip-alias \
    --cluster-ipv4-cidr=10.0.0.0/21 \
    --services-ipv4-cidr=10.4.0.0/19 \
    --create-subnetwork=name='SUBNET_NAME',range=10.5.32.0/27 \
    --default-max-pods-per-node=MAXIMUM_PODS \
    --location=COMPUTE_LOCATION

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

  • ‫CLUSTER_NAME: השם של האשכול החדש.
  • ‫SUBNET_NAME: השם של רשת המשנה החדשה של האשכול.
  • ‫MAXIMUM_PODS: מספר ברירת המחדל המקסימלי של פודים לכל צומת באשכול, אפשר להגדיר עד 512. אם לא מציינים ערך, Kubernetes מקצה את ערך ברירת המחדל 110.
  • ‫COMPUTE_LOCATION: המיקום של Compute Engine של האשכול החדש.

המסוף

  1. נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .

    מעבר אל יצירת אשכול Kubernetes

  2. מגדירים את האשכול החדש.

  3. בחלונית הניווט, בקטע Cluster, לוחצים על Networking.

  4. מוודאים שתיבת הסימון Enable VPC-native traffic routing (uses alias IP) (הפעלת ניתוב תעבורה מקורי ב-VPC (שימוש בכתובת IP של כינוי)) מסומנת.

  5. בחלונית הניווט, בקטע Node pools (מאגרי צמתים), לוחצים על Networking (רשת).

  6. בשדה Maximum pods per node (מספר הפודים המקסימלי לכל צומת) מגדירים את הערך 110. ‫GKE משתמש בערך הזה כדי לשנות את הגודל של טווח כתובות ה-IP שמוקצה לצמתים.

  7. לוחצים על יצירה.

כשמגדירים את המספר המקסימלי של Pods לכל צומת באשכול, Kubernetes משתמש בערך הזה כדי להקצות טווח CIDR לצמתים. אתם יכולים לחשב את המספר המקסימלי של הצמתים באשכול על סמך טווח כתובות ה-IP המשני של האשכול עבור Pods וטווח ה-CIDR שהוקצה לצומת.

לדוגמה, אם הגדרתם את מספר ברירת המחדל המקסימלי של קבוצות ה-Pod ל-110 ואת טווח כתובות ה-IP המשני של קבוצות ה-Pod ל-/21, ‏ Kubernetes מקצה טווח CIDR של /24 לצמתים באשכול. הקצאת טווח ה-CIDR מאפשרת עד 2(24-21) = 23 = 8 צמתים באשכול.

באופן דומה, אם מגדירים את ברירת המחדל של מספר קבוצות ה-Pod המקסימלי ל-8 ואת טווח כתובות ה-IP המשני של האשכול לקבוצות ה-Pod ל-/21, מערכת Kubernetes מקצה טווח CIDR של /28 לצמתים. הקצאת טווח ה-CIDR מאפשרת עד 2(28-21) = 27 = 128 צמתים באשכול.

הגדרת המספר המקסימלי של Pods במאגר צמתים חדש באשכול קיים

אפשר גם לציין את המספר המקסימלי של Pods לכל צומת כשיוצרים מאגר צמתים באשכול Standard קיים. יצירת מאגר צמתים חדש מאפשרת לכם לבצע אופטימיזציה של הקצאת כתובות IP, גם באשכולות קיימים שבהם לא הוגדר מספר ברירת מחדל מקסימלי של Pods לכל צומת ברמת האשכול.

הגדרת המספר המקסימלי של ה-Pods ברמת מאגר הצמתים מבטלת את ברירת המחדל המקסימלית ברמת האשכול. אם לא מגדירים מספר מקסימלי של Pods לכל צומת כשיוצרים את מאגר הצמתים, חל המספר המקסימלי ברמת האשכול.

gcloud

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --max-pods-per-node=MAXIMUM_PODS

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

  • ‫POOL_NAME: השם של מאגר הצמתים החדש.
  • ‫CLUSTER_NAME: שם האשכול שבו רוצים ליצור את מאגר הצמתים.
  • ‫MAXIMUM_PODS: המספר המקסימלי של Pods במאגר הצמתים.

המסוף

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    מעבר אל Google Kubernetes Engine

  2. ברשימת האשכולות, לוחצים על שם האשכול שרוצים לשנות.

  3. לוחצים על הכרטיסייה Nodes.

  4. לוחצים על יצירת מאגר צמתים בניהול המשתמש.

  5. בחלונית הניווט, לוחצים על Networking.

  6. בשדה Maximum pods per node (מספר הפודים המקסימלי לכל צומת), מזינים ערך. מערכת GKE משתמשת בערך הזה כדי להתאים את הגודל של טווח כתובות ה-IP שהוקצה לצמתים.

טווחים משניים של Pods ומספר Pods מקסימלי לכל צומת

כשמגדירים את המספר המקסימלי של פודים לכל צומת, משפיעים באופן עקיף על הגודל הנדרש של טווח המשנה של הפוד. ב-GKE נדרש בלוק CIDR מינימלי של ‎ /24 לכל מאגר צמתים. אם תנסו לציין טווח משני של Pod שקטן מ-‎ /24 כשאתם יוצרים מאגר צמתים, תופיע השגיאה הבאה:

Pod secondary range 'Pod' must have a CIDR block of at least /24

אם אתם צריכים טווח קטן יותר מ-‎ /24 עבור האשכול כולו, אתם יכולים לציין את זה ברמת האשכול באמצעות הארגומנט ‎--cluster-ipv4-cidr עם Google Cloud CLI. מידע נוסף זמין במאמר בנושא יצירת אשכול עם טווח CIDR ספציפי. אפשר גם להשתמש ב-discontiguous multi-Pod CIDR כדי להוסיף לאשכול עוד טווחי כתובות IP של Pod.

כל אשכול צריך ליצור פודים של kube-system, כמו kube-proxy, במרחב השמות kube-system. כשמגדירים את המספר המקסימלי של פודים לכל צומת, צריך לזכור לקחת בחשבון גם את הפודים של עומס העבודה וגם את הפודים של המערכת.

מידע על מספר ה-Pods המקסימלי שמוגדר כברירת מחדל לכל צומת

כברירת מחדל, GKE מאפשר עד 110 פודים לכל צומת באשכולות רגילים, אבל אפשר להגדיר אשכולות רגילים כך שיאפשרו עד 512 פודים לכל צומת. באשכולות Autopilot, המספר המקסימלי של Pods לכל צומת נבחר מטווח שבין 8 ל-256, על סמך צפיפות ה-Pods הצפויה של עומס העבודה. ‫Kubernetes מקצה לכל צומת טווח של כתובות IP, בלוק CIDR, כדי שלכל Pod תהיה כתובת IP ייחודית. הגודל של בלוק ה-CIDR תואם למספר המקסימלי של פודים לכל צומת.

טווחים של CIDR של Pod באשכולות רגילים

כברירת מחדל, המספר המקסימלי של Pods לכל צומת באשכולות Standard הוא 110, ו-Kubernetes מקצה בלוק CIDR של ‎ /24 (‏256 כתובות) לכל אחד מהצמתים. ב-Kubernetes יש יותר מפי שניים כתובות IP זמינות ממספר ה-Pods המקסימלי שאפשר ליצור בצומת. כך אפשר לצמצם את השימוש החוזר בכתובות IP כשמוסיפים ומסירים Pods מצומת.

אומנם יש מגבלה קשיחה של 512 פודים לכל צומת, אבל אפשר להקטין את מספר הפודים בצומת. הגודל של בלוק ה-CIDR שמוקצה לצומת תלוי בערך המקסימלי של הפודים לכל צומת. הבלוק תמיד מכיל לפחות פי שניים כתובות ממספר ה-Pods המקסימלי לכל צומת.

בטבלה הבאה מפורטים הגודל של בלוק ה-CIDR ומספר כתובות ה-IP הזמינות ש-Kubernetes מקצה לצמתים, בהתאם למספר המקסימלי של Pods לכל צומת:

מספר הפודים המקסימלי לכל צומת טווח CIDR לכל צומת מספר כתובות ה-IP
8 /28 16
9 – 16 /27 32
‫17 – 32 /26 64
‫33 – 64 /25 128
‫65 – 128 /24 256
‫129 עד 256 /23 512
‫257 – 512 /22 1024

שיקולים לגבי גודל האשכול לטווח כתובות IP משני ל-Pods

כשיוצרים אשכול, אי אפשר לשנות את הגודל של טווח כתובות ה-IP המשני של ה-Pods. חשוב לתכנן בקפידה את גודל הטווח הזה כדי שיתאים לצרכים הנוכחיים והעתידיים של עומסי העבודה. אם אין מספיק מקום לכתובות IP לפודים, יכול להיות שיהיו כשלים בתזמון והאשכול לא יוכל לגדול.

אם אתם לא בטוחים מה הגודל הנדרש, מומלץ להתחיל עם טווח גדול יותר, כמו /21, שהוא ברירת המחדל עבור אשכולות שנוצרו באמצעות Google Cloud CLI. טווח גדול יותר מספק מספיק כתובות IP לאשכול בגודל בינוני, ומאפשר גמישות לצמיחה עתידית. אם נגמרות לכם כתובות ה-IP של הפודים, אתם יכולים להשתמש בCIDR של כמה פודים לא רציפים כדי להוסיף עוד טווחי כתובות IP של פודים.

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

כדי לחשב את המספר המקסימלי של Pods שהאשכול יכול לתמוך בהם, צריך לספק ערכי קלט למספר ה-Pods לכל צומת ולטווחים של טווח CIDR. ‫GKE משתמש בנתונים האלה כדי לקבוע את הגודל של טווחי הכתובות של הצמתים וה-Pods.

ערכים שהמשתמשים ציינו

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

  • ‫Q: המספר המקסימלי של פודים לכל צומת.
    • באשכולות במצב Autopilot, הערך של Q קבוע (כרגע 32).
    • ב-Standard clusters, אפשר להגדיר Q.
  • ‫DS: אורך הקידומת של רשת המשנה של ה-Pod. לדוגמה, לטווח CIDR של /17, אורך הקידומת הוא 17.
  • ‫S: אורך הקידומת של רשת המשנה הראשית. לדוגמה, לטווח CIDR של /24, אורך הקידומת הוא 24.

ערכים מחושבים

מערכת GKE מחשבת את הערכים הבאים על סמך הקלט שלכם.

  • ‫M: גודל מסכת הרשת לטווח ה-Pod של כל צומת.

    $$ M = 31 - \lceil{log_2(Q)}\rceil $$

    משתמשים בפונקציית התקרה (\( \lceil \rceil \)) כדי לעגל כלפי מעלה למספר השלם הקרוב ביותר.

  • ‫HM: מספר הביטים של המארח למסכת הרשת של טווח ה-Pod של הצומת.

    $$ HM = 32 - M $$
  • ‫HD: מספר הביטים של המארח עבור מסכת הרשת של תת-הרשת של ה-CIDR Pod שנבחרה.

    $$ HD = 32 - DS $$
  • ‫MN: המספר המקסימלי של צמתים שאפשר לתמוך בהם ברשת המשנה של ה-Pod.

    $$ MN = 2^{(HD - HM)} $$
  • ‫MP: המספר המקסימלי של ה-Pods שרשת המשנה של ה-Pods יכולה לתמוך בהם.

    $$ MP = MN * Q $$
  • ‫N: מספר כתובות ה-IP שניתן להשתמש בהן בטווח הראשי.

    $$ N = 2^{(32 - S)} - 4 $$

הערות חשובות:

  • אפשר להשתמש בכל כתובות ה-IP בטווח המשני בשביל Pods.
  • החישובים האלה מספקים את הערכים המקסימליים התיאורטיים. גורמים אחרים יכולים להשפיע על הביצועים בעולם האמיתי.

לדוגמה:

נניח שאתם יוצרים אשכול GKE Autopilot עם המאפיינים הבאים:

  • ‫CIDR של תת-רשת Pod של /17 (DS = 17).
  • עד 32 פודים לכל צומת (Q = 32).

מחשבים את המספר המקסימלי של Pods:

  1. \( M = 31 - \lceil{log_2(32)}\rceil = 26 \)
  2. \( HM = 32 - 26 = 6 \)
  3. \( HD = 32 - 17 = 15 \)
  4. \( MN = 2^{(15 - 6)} = 512 \)
  5. \( MP = 512 * 32 = 16384 \)

האשכול הזה יכול לתמוך ב-512 צמתים ו-16,384 פודים לכל היותר.

הפחתת המספר המקסימלי של Pods

הקטנת המספר המקסימלי של Pods לכל צומת מאפשרת לאשכול להכיל יותר צמתים, כי כל צומת דורש חלק קטן יותר ממרחב כתובות ה-IP הכולל. לחלופין, אפשר לתמוך באותו מספר של צמתים באשכול על ידי ציון מרחב קטן יותר של כתובות IP לפודים בזמן יצירת האשכול.

הפחתת המספר המקסימלי של Pods לכל צומת מאפשרת גם ליצור אשכולות קטנים יותר שדורשים פחות כתובות IP. לדוגמה, אם יש שמונה רצפי מודעות לכל צומת, לכל צומת מוקצה CIDR מסוג ‎ /28. טווח כתובות ה-IP האלה, בתוספת תת-הרשת והטווחים המשניים שאתם מגדירים, קובעים את מספר כתובות ה-IP שנדרשות ליצירת אשכול מוצלחת.

אפשר להגדיר את המספר המקסימלי של Pods לכל צומת בזמן יצירת האשכול ובזמן יצירת מאגר הצמתים.

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