הסבר על המשאב המותאם אישית ClusterCIDRConfig

סקירה כללית

‫ClusterCIDRConfig הוא משאב מותאם אישית להקצאת CIDR שמאפשר להקצות באופן דינמי טווחים נוספים של כתובות IP עבור Pods.

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

ל-Kubernetes NodeIPAM הנוכחי יש את המגבלות הבאות:

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

  • אם מגדילים את גודל האשכול, קשה להוסיף עוד כתובות IP.

  • ה-CIDR של האשכול הוא טווח גדול. יכול להיות שיהיה קשה למצוא בלוק רציף של כתובות IP שעונה על הצרכים של האשכול.

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

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

  • כמה חסימות CIDR של כתובות IP לא רציפות ל-CIDR של האשכול ברמת פירוט גבוהה יותר

  • התאמה של צמתים לחסימות CIDR

  • גדלים שונים של בלוקים שמוקצים לצמתים

ב-Google Distributed Cloud נעשה שימוש בפונקציונליות של ClusterCIDRConfig בתכונות הבאות:

Cluster.spec.clusterNetwork.pods.cidrBlocks הוא שדה אופציונלי שלא מוגדר כברירת מחדל. חובה להגדיר את המאפיין הזה אם לא הגדרתם אותו לאף אחת מהתכונות שמופיעות ברשימה הקודמת. לדוגמה, צריך לציין את הערך הזה כשיוצרים את האשכולות במצב IPv4 island, כי הוא משמש כ-CIDR מקורי לניתוב.

בטבלה הבאה מפורטת ההתנהגות של השדה Cluster.spec.clusterNetwork.pods.cidrBlocks של ClusterCIDRConfig במצבי רשת שונים.

מצב הרשת ערך ClusterCIDRConfig
אי IPv4 (ברירת מחדל) (שדה חובה) מציינים Cluster.spec.clusterNetwork.pods.cidrBlocks.
‫IPv4 Flat (ברירת מחדל) המערכת מתעלמת לחלוטין מהערכים Cluster.spec.clusterNetwork.pods.cidrBlocks, ואפשר לדלג עליהם. המשתמשים צריכים להגדיר במפורש ClusterCIDRConfigs (לכל צומת, לכל מאגר צמתים או לכל אשכול).
מערך כפול (IPv4 Island, ‏ IPv4 Flat)

מציינים את ה-CIDR של IPv4.

אל תציינו CIDR של IPv6 ב-Cluster.spec.clusterNetwork.pods.cidrBlocks.

מציינים ClusterCIDRConfigs עם CIDR של IPv4 ו-IPv6. ה-CIDR של IPv4 שמוגדר בכל ClusterCIDRConfigs חייב להיות זהה ל-CIDR של IPv4 מ-Cluster.spec.clusterNetwork.pods.cidrBlocks, כולל הערך PerNodeMask של IPv4. מידע נוסף על ClusterCIDRConfig ודוגמאות לשימוש בו זמין במאמר דוגמאות: Dualstack (אי IPv4, שטוח IPv6)

Dual-stack (שטוח IPv4, שטוח IPv6) אפשר לדלג על Cluster.spec.clusterNetwork.pods.cidrBlocks כי המערכת מתעלמת מהן לחלוטין. צריך להגדיר באופן מפורש ClusterCIDRConfigs (לכל צומת, לכל מאגר צמתים או לכל אשכול) עם CIDR של IPv4 ו-IPv6.

הגדרת משאב מותאם אישית של מקצה כתובות CIDR‏ ClusterCIDRConfig

ClusterCIDRConfig

כשמגדירים את משאב ההקצאה המותאם אישית של CIDR‏ ClusterCIDRConfig, כדאי לקחת בחשבון את הנקודות הבאות:

  • הקצאת CIDR של Pod מ-ClusterCIDRConfig מסוים לצומת מבוססת על בוררי תוויות. זה דומה למנגנון nodeSelector שמשמש לתזמון של Pod בצומת.

  • צריך להגדיר את ClusterCIDRConfig במהלך תהליך יצירת האשכול בקובץ ה-YAML של הגדרת האשכול. אחרי שמציינים את ClusterCIDRConfigs, אי אפשר לשנות את הערכים מאוחר יותר.

  • אפשר לציין כמה ClusterCIDRConfigs עם CIDR חופפים.

  • אם לא נמצא ClusterCIDRConfig תואם לצומת, הצומת יישאר במצב NotReady עד שייווצר ClusterCIDRConfig עם תוויות תואמות.

  • אם ל-ClusterCIDRConfig עם ההתאמה הטובה ביותר אין עוד CIDR זמינים להקצאה, נבחר ה-CIDR הבא הכי מתאים, וה-CIDR של ה-Pod מוקצה מתוך ה-CIDR הזמינים.

  • במקרה של מודל dual-stack, אם רוצים להקצות ל-Nodes כתובות CIDR של Pod מסוג dual-stack, צריך לבצע את הפעולות הבאות:

    • מגדירים גם IPv4 וגם IPv6 CIDR ב-ClusterCIDRConfig.

    • אם מוגדרים כמה ClusterCIDRConfig, צריך לוודא שלכולם יש DualStack CIDRs.

    • מוודאים שלשני ה-CIDR של IPv4 ו-IPv6 שהוגדרו יש מספר שווה של כתובות IP שניתנות להקצאה לכל צומת.

    לדוגמה, 32 - spec.IPv4.PerNodeMaskSize == 128 - spec.IPv6.PerNodeMaskSize

    spec.IPv4.PerNodeMaskSize = 24

    spec.IPv6.PerNodeMaskSize = 120

    לכן, 32 - 24 == 128 - 120, כי ההפרש הוא 8.

  • יכול להיות שכמה ClusterCIDRConfigs יתאימו לתוויות מ-nodeSelector לתוויות של הצומת.

כללי הקצאה של ClusterCIDRConfig

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

  1. בוחרים את ClusterCIDRConfig שה-NodeSelector שלו תואם למספר התוויות הגדול ביותר ב-Node. לדוגמה, המערכת תבחר ב-{'node.kubernetes.io/instance-type':'medium', 'rack': 'rack1'} (Match Count: 2) לפני {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1).

  2. בוחרים את ClusterCIDRConfig עם הכי פחות כתובות CIDR של Pod שניתנות להקצאה. לדוגמה, {CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR) נבחר לפני {CIDR: "192.168.0.0/20", PerNodeMaskSize: "22"} (4 possible Pod CIDRs).

  3. בוחרים את ClusterCIDRConfig שבו ל-PerNodeMaskSize יש הכי מעט כתובות IP. לדוגמה, הערך 27 (2^(32-27)= 32 כתובות IP) נבחר לפני הערך 25 (2^(32-25)=128 כתובות IP).

  4. בוחרים את ClusterCIDRConfig שתווית NodeSelector התואמת שלו כוללת ערך אלפאנומרי נמוך יותר. לדוגמה, {'kubernetes.io/hostname': 'node-1'} נבחר על פני {'node.kubernetes.io/instance-type':'medium'}.

  5. בוחרים את ClusterCIDRConfig שכתובת ה-IP שלו ב-CIDR היא בעלת ערך נמוך יותר. לא משנה אם ההגדרה היא הגדרת IPv4 או הגדרת DualStack, רק ה-CIDR של IPv4 מושווים. לדוגמה, {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}.

תצורות לדוגמה

בקטע הזה מפורטות דוגמאות להגדרות של Cluster ו-ClusterCIDRConfig לכל מצבי הרשת.