באשכולות של Google Kubernetes Engine (GKE) עם רשתות וירטואליות פרטיות (VPC), צמתים ללא כתובות IP חיצוניות משפרים את האבטחה. הצמתים האלה משתמשים ב-Cloud NAT לחיבורים יוצאים לאינטרנט. אובדן מנות יכול לקרות אם מכונת VM של צומת ממצה את כתובות ה-IP והיציאות שהוקצו לה ב-Cloud NAT, בדרך כלל בעומס גבוה של תעבורה יוצאת, וזה משבש את התעבורה היוצאת.
במאמר הזה מוסבר איך לרשום ביומן ולעקוב אחרי מנות שהושמטו, לבדוק את ההגדרה של Cloud NAT וליישם אמצעים להפחתת אובדן מנות בעתיד.
המידע הזה חשוב לאדמינים ולמפעילים של פלטפורמות ולאדמינים של רשתות שמנהלים אשכולות GKE עם צמתים ללא גישה לאינטרנט, ומסתמכים על Cloud NAT לקישוריות חיצונית. מידע נוסף על התפקידים הנפוצים ומשימות לדוגמה שאליהם אנחנו מתייחסים בGoogle Cloud תוכן זמין במאמר תפקידי משתמשים נפוצים ומשימות ב-GKE.
אבחון של אובדן מנות
בקטעים הבאים מוסבר איך לרשום ביומן מנות שהושמטו באמצעות Cloud Logging, ואיך לאבחן את הסיבה להשמטת מנות באמצעות Cloud Monitoring.
רישום ביומן של מנות שאבדו
אפשר לרשום ביומן מנות שהושמטו באמצעות השאילתה הבאה ב-Cloud Logging:
resource.type="nat_gateway" resource.labels.region=REGION resource.labels.gateway_name=GATEWAY_NAME jsonPayload.allocation_status="DROPPED"
מחליפים את מה שכתוב בשדות הבאים:
-
REGION: שם האזור שבו נמצא האשכול. -
GATEWAY_NAME: השם של שער Cloud NAT.
הפקודה הזו מחזירה רשימה של כל החבילות שהושמטו על ידי שער Cloud NAT, אבל לא מציינת את הסיבה לכך.
מעקב אחרי הסיבות לאובדן מנות
כדי לזהות את הסיבות לאובדן מנות, שולחים שאילתה אל הכלי למעקב אחרי מדדים ב-Cloud Monitoring. יכולות להיות שלוש סיבות לאובדן מנות:
OUT_OF_RESOURCESENDPOINT_INDEPENDENT_CONFLICTNAT_ALLOCATION_FAILED
כדי לזהות מנות שהושמטו בגלל קודי השגיאה OUT_OF_RESOURCES או ENDPOINT_ALLOCATION_FAILED, משתמשים בשאילתה הבאה:
fetch nat_gateway
metric 'router.googleapis.com/nat/dropped_sent_packets_count'
filter (resource.gateway_name == GATEWAY_NAME)
align rate(1m)
every 1m
group_by [metric.reason],
[value_dropped_sent_packets_count_aggregate:
aggregate(value.dropped_sent_packets_count)]
אם מזהים מנות שנפלו בגלל הסיבות האלה, אפשר לעיין במאמרים Packets dropped with reason: out of resources ו-Packets dropped with reason: endpoint independent conflict לקבלת עצות לפתרון בעיות.
כדי לזהות מנות שנשמטו בגלל קוד השגיאה NAT_ALLOCATION_FAILED, משתמשים בשאילתה הבאה:
fetch nat_gateway
metric 'router.googleapis.com/nat/nat_allocation_failed'
group_by 1m,
[value_nat_allocation_failed_count_true:
count_true(value.nat_allocation_failed)]
every 1m
אם זיהיתם מנות שנפלו בגלל הסיבה הזו, כדאי לעיין במאמר צריך להקצות עוד כתובות IP.
בדיקת ההגדרה של Cloud NAT
אם השאילתות הקודמות מחזירות תוצאות ריקות, ואין אפשרות ליצור קשר בין רכיבי ה-Pod של GKE לכתובות IP חיצוניות, אפשר להשתמש בטבלה הבאה כדי לפתור בעיות בהגדרה:
| Configuration | פתרון בעיות |
| Cloud NAT מוגדר כך שיחול רק על טווח כתובות ה-IP הראשי של תת-הרשת. |
כש-Cloud NAT מוגדר רק לטווח הכתובות הראשי של תת-הרשת, לחבילות שנשלחות מהאשכול לכתובות IP חיצוניות צריכה להיות כתובת IP של צומת מקור. בהגדרת Cloud NAT הזו:
|
| Cloud NAT מוגדר כך שהוא חל רק על טווח כתובות ה-IP המשני של רשת המשנה שמשמש לכתובות IP של Pod. |
כש-Cloud NAT מוגדר רק לטווח כתובות ה-IP המשני של רשת המשנה שמשמש את כתובות ה-IP של ה-Pod באשכול, לחבילות שנשלחות מהאשכול לכתובות IP חיצוניות צריכה להיות כתובת IP של Pod כמקור. בהגדרת Cloud NAT הזו:
|
הפחתת אובדן מנות
אחרי שתאבחנו את הסיבה לאובדן המנות, כדאי להשתמש בהמלצות הבאות כדי לצמצם את הסיכוי שהבעיה תחזור בעתיד:
מגדירים את שער Cloud NAT לשימוש בהקצאת יציאות דינמית ומגדילים את המספר המקסימלי של יציאות לכל מכונה וירטואלית.
אם משתמשים בהקצאת יציאות סטטית, צריך להגדיל את מספר היציאות המינימלי לכל מכונה וירטואלית.
צריך להקטין את קצב החבילות היוצאות של האפליקציה. כשבאפליקציה נוצרים כמה חיבורים יוצאים לאותה כתובת IP יעד ולאותו יציאה, היא יכולה לנצל במהירות את כל החיבורים ש-Cloud NAT יכול ליצור ליעד הזה באמצעות מספר כתובות המקור של NAT שהוקצו וטפלי המקור של היציאה.
לפרטים על השימוש בכתובות מקוריות של NAT ובמספרי יציאות מקוריות ב-Cloud NAT כדי ליצור חיבורים, כולל מגבלות על מספר החיבורים בו-זמנית ליעד, אפשר לעיין במאמר יציאות וחיבורים.
כדי להקטין את קצב החיבורים היוצאים מהאפליקציה, כדאי לעשות שימוש חוזר בחיבורים פתוחים. שיטות נפוצות לשימוש חוזר בחיבורים כוללות איגום חיבורים, ריבוב חיבורים באמצעות פרוטוקולים כמו HTTP/2 או יצירת חיבורים קבועים שנעשה בהם שימוש חוזר לכמה בקשות. מידע נוסף זמין במאמר בנושא יציאות וחיבורים.
המאמרים הבאים
אם לא מצאתם פתרון לבעיה שלכם במסמכים, תוכלו להיעזר בקבלת תמיכה, כולל עצות בנושאים הבאים:
- פתיחת בקשת תמיכה באמצעות פנייה אל Cloud Customer Care.
- קבלת תמיכה מהקהילה על ידי פרסום שאלות ב-StackOverflow ושימוש בתג
google-kubernetes-engineכדי לחפש בעיות דומות. אפשר גם להצטרף לערוץ Slack#kubernetes-engineכדי לקבל תמיכה נוספת מהקהילה. - פתיחת דיווחים על בעיות או בקשות להוספת תכונות באמצעות הכלי הציבורי למעקב אחר בעיות.