בדף הזה מוסבר איך פועל מיסוך כתובות IP ב-Google Kubernetes Engine (GKE), ומוצגות אפשרויות הגדרה לתרחישים שונים.
בדף הזה מניחים שיש לכם ידע בנושא הסתרת IP ב-Kubernetes.
הסתרת IP ב-GKE
GKE יכול להשתמש בהסוואת IP כדי לשנות את כתובות ה-IP של המקור של מנות שנשלחות מ-Pods. כשמתבצעת הסוואה של כתובת IP בחבילת נתונים שמופקת על ידי Pod, GKE משנה את כתובת ה-IP של המקור של חבילת הנתונים מכתובת ה-IP של ה-Pod לכתובת ה-IP של הצומת הבסיסי. הסתרת כתובת ה-IP של המקור של מנות נתונים שימושית כשמקבל מוגדר לקבל מנות נתונים רק מכתובות ה-IP של הצמתים באשכול.
בצמתים של Linux, GKE מגדיר כללי iptables.
GKE משתמש ב-ip-masq-agent
DaemonSet
כדי להגדיר את מישור הנתונים המתאים.
ip-masq-agent לא נתמך במאגרי צמתים של Windows Server. עם זאת, צמתים של Windows מבצעים הסוואה של כתובות IP (תרגום כתובות רשת של המקור או SNAT) למנות שנשלחות ליעדים חיצוניים לאשכול, על ידי כתיבה מחדש של כתובת ה-IP של ה-Pod המקורית לכתובת ה-IP של הצומת. מערכת SNAT מדלגת על מנות שנשלחות לכתובות IP של צומת או של Pod באותו אשכול. אי אפשר להגדיר את ההתנהגות הזו בצמתי Windows.
הסתרת IP באשכולות רגילים
באשכולות רגילים, ההתנהגות של הסתרת כתובות ה-IP באשכול נקבעת לפי שלושה גורמים:
- אם פרסתם את
ip-masq-agentDaemonSet באשכול או אם GKE פרס אותו באופן אוטומטי. כדי לקרוא על התרחישים שבהם GKE פורס באופן אוטומטי אתip-masq-agentDaemonSet, אפשר לעיין במאמר מתי מתבצע פריסה אוטומטית שלip-masq-agent. - אם יצרתם רשימת
nonMasqueradeCIDRsבהתאמה אישית ב-ip-masq-agentconfigMap. - במקרים שבהם לא נפרס DaemonSet של
ip-masq-agentבאשכול, גם אם יצרתם את האשכול עם הדגל--disable-default-snat. מידע נוסף על הדגל--disable-default-snat
הטבלה הבאה מסכמת את ההגדרות של הסתרת כתובות IP באשכולות GKE רגילים:
| הגדרת אשכול | התנהגות ה-SNAT שמתקבלת |
|---|---|
ה-DaemonSet |
GKE שומר על כתובות ה-IP של פוד המקור עבור מנות שנשלחות ליעדים שצוינו ברשימה GKE משנה את כתובות ה-IP של פוד המקור לכתובות ה-IP של צומת המקור עבור מנות שנשלחות ליעדים שלא צוינו ברשימה |
ה-DaemonSet |
GKE שומר על כתובות ה-IP של פוד המקור עבור חבילות נתונים שנשלחות לקבוצה של יעדים שמוגדרים כברירת מחדל ללא הסוואה. GKE משנה את כתובות ה-IP של הפודים של המקור לכתובות ה-IP של הצמתים של המקור עבור מנות שנשלחות ליעדים מחוץ ליעדים שמוגדרים כברירת מחדל ללא הסוואה. |
|
GKE שומר על כתובות ה-IP של פוד המקור עבור חבילות נתונים שנשלחות לקבוצה של יעדים שמוגדרים כברירת מחדל ללא הסוואה. GKE משנה את כתובות ה-IP של הפודים של המקור לכתובות ה-IP של הצמתים של המקור עבור מנות שנשלחות ליעדים מחוץ ליעדים שמוגדרים כברירת מחדל ללא הסוואה. |
DaemonSet |
GKE שומר על כתובות ה-IP של המקור של ה-Pod עבור חבילות נתונים שנשלחות לכל היעדים. כדאי לעיין במאמר שמירה על כתובות IPv4 של מקורות Pod ליעדים באינטרנט כדי לקבל מידע על שיקולים חשובים בנושא ניתוב כששומרים על כתובות IPv4 של מקורות Pod וצריך לנתב חבילות נתונים לאינטרנט. |
הסתרת IP באשכולות במצב Autopilot
באשכולות Autopilot, GKE תמיד פורס ip-masq-agent DaemonSet. אפשר לשלוט בהתנהגות של הסתרת כתובות ה-IP באמצעות EgressNATPolicy, למעט מנות שנשלחות מ-Pods לטווחים של צמתים, Pods או שירותים באשכול. כדי להשתמש ב-EgressNATPolicy, אשכול Autopilot צריך לעמוד בשתי הדרישות הבאות:
- האשכול צריך להשתמש ב-GKE מגרסה 1.23.4-gke.1600 ואילך, או מגרסה 1.22.7-gke.1500 ואילך.
- האשכול צריך להיווצר כשGKE Dataplane V2 מופעל.
בטבלה הבאה מפורטות הגדרות של הסתרת כתובת IP באשכולות GKE במצב Autopilot:
| הגדרת אשכול ב-Autopilot | התנהגות ה-SNAT שמתקבלת |
|---|---|
|
האשכול כולל |
GKE שומר על כתובות ה-IP של המקור של ה-Pod עבור מנות שנשלחות ליעדים שצוינו ב- GKE משנה את כתובות ה-IP של פוד המקור לכתובות ה-IP של צומת המקור עבור מנות שנשלחות ליעדים שלא צוינו ב- |
|
האשכול לא כולל |
מדיניות ברירת המחדל
|
תצורות לדוגמה
כדי לראות דוגמאות להסוואת כתובות IP ולהגדרות לפי סוג האשכול, אפשר להרחיב את הקטעים הבאים.
הסבר על ההגדרות המתקדמות
כשה-ip-masq-agent נפרס באופן אוטומטי
באשכולות במצב Autopilot, GKE תמיד פורס DaemonSet של ip-masq-agent.
באשכולות רגילים, GKE פורס ip-masq-agentDaemonSet כשלא מגדירים את הדגל --disable-default-snat (כלומר, מגדירים אותו לערך not) והאשכול משתמש באחת משילובי ההגדרות הבאים:
האשכול לא משתמש ב-GKE Dataplane V2, ואכיפת מדיניות הרשת מופעלת.
האשכול משתמש בטווח כתובות IP של Pod שלא מתאים לטווח
10.0.0.0/8.
כדי ש-ip-masq-agent DaemonSet יהיה יעיל, צריך גם לציין את רשימת nonMasqueradeCIDRs ב-ip-masq-agent ConfigMap. מידע נוסף מופיע במאמר בנושא איך מגדירים סוכן להסתרת כתובת IP.
כש-ip-masq-agent DaemonSet קיים באשכול, GKE מעדכן ומבצע התאמה של Pod להצגה בכל צומת באשכול.
יעדים שמוגדרים כברירת מחדל ולא מוסתרים
יעדי ברירת המחדל שאינם מסוג masquerade הם:
10.0.0.0/8172.16.0.0/12192.168.0.0/16100.64.0.0/10192.0.0.0/24192.0.2.0/24192.88.99.0/24198.18.0.0/15198.51.100.0/24203.0.113.0/24240.0.0.0/4
יעדי ברירת המחדל שלא מוסתרים רלוונטיים לאשכולות עם ההגדרות הבאות:
ב-
ip-masq-agentDaemonSet של האשכול לא צוינהnonMasqueradeCIDRsרשימה ב-ip-masq-agentConfigMap. זה כולל את המקרה שבו לאשכול יש DaemonSetip-masq-agent, אבל אין לו ConfigMapip-masq-agentבכלל.ב-cluster שלכם לא מוגדר
ip-masq-agentDaemonSet, וגם הדגל--disable-default-snatלא מוגדר.
יעדי ברירת המחדל שאינם מתחזים לא רלוונטיים לאשכולות עם ההגדרות הבאות:
ב-cluster יש
ip-masq-agentDaemonSet, וציינתםnonMasqueradeCIDRsרשימה מותאמת אישית ב-ip-masq-agentConfigMap. רשימה מותאמת אישית שלnonMasqueradeCIDRsיעדים תמיד מבטלת את יעדי ברירת המחדל שלא מוסתרים, אם באשכול ישip-masq-agentDaemonSet.באשכול שלך לא מוגדר
ip-masq-agentDaemonSet, והדגל--disable-default-snatמוגדר. פרטים נוספים על ההגדרה הזו זמינים במאמר בנושא ההשפעה של הדגל--disable-default-snat.
האפקט של הדגל של --disable-default-snat
הדגל --disable-default-snat
משנה את התנהגות ברירת המחדל של SNAT ב-GKE כך שכתובות ה-IP של הפודים במקור נשמרות עבור מנות שנשלחות לכל היעדים.
GKE מיישם את התנהגות ברירת המחדל של SNAT על ידי כך שהוא לא פורס אף ip-masq-agent DaemonSet באשכול.
לדגל --disable-default-snat אין השפעה כשבאשכול יש DaemonSet של ip-masq-agent:
מכיוון שאשכולות Autopilot תמיד כוללים DaemonSet
ip-masq-agent, לדגל--disable-default-snatאין השפעה על אשכולות Autopilot.באשכולות רגילים: אם פורסים
ip-masq-agentDaemonSet או אם GKE פורס באופן אוטומטיip-masq-agentDaemonSet, לדגל--disable-default-snatאין משמעות באשכול, גם אם הוא מוגדר.--disable-default-snatכש-DaemonSet (ip-masq-agent) קיים באשכול, יעדים שלא עוברים מיסוך מוגדרים באופן מפורש ברשימהnonMasqueradeCIDRsשלip-masq-agentConfigMap או מתוך יעדי ברירת המחדל שלא עוברים מיסוך כשלא מוגדרת רשימהnonMasqueradeCIDRs.
אפשר להגדיר את הדגל --disable-default-snat על ידי עדכון של אשכול אחרי שהוא נוצר. בתנאי שלא נפרס ip-masq-agent DaemonSet באשכול, השבתת SNAT כברירת מחדל נכנסת לתוקף אחרי שהאשכול מחליף את כל הצמתים שלו – לפעמים אחרי כמה שעות. הסיבה לכך היא ש-GKE מתחשב בחלונות התחזוקה שהגדרתם כשמחליפים צמתים באשכול. אם לא הגדרתם חלון תחזוקה, תצטרכו להפעיל מחדש את הצמתים באשכול באופן ידני לפני שהדגל --disable-default-snat ישפיע.
הסוואה של כתובות לקישור מקומי
הטווח 169.254.0.0/16 משמש לכתובות IP מקומיות לקישור. הסוואה מקומית בקישור מתייחסת לשינוי של כתובת IP של מקור Pod לכתובת IP של מקור צומת עבור מנות שנשלחות ליעדים 169.254.0.0/16.
באשכולות Autopilot, כתובות ה-IP של ה-Pod המקוריות נשמרות תמיד עבור חבילות שנשלחות ליעדים 169.254.0.0/16.
כברירת מחדל, באשכולות רגילים נשמרות גם כתובות ה-IP של הפודים של המקור עבור מנות שנשלחות ליעדים 169.254.0.0/16.
אפשר להפעיל הסוואה של כתובות IP מקומיות ברשת באשכול רגיל על ידי ביצוע שני השלבים הבאים:
- מוודאים שהפרמטר
masqLinkLocalקיים ומוגדר ל-Trueב-ip-masq-agentconfigMap. אם הפרמטרmasqLinkLocalלא מופיע ב-configMapip-masq-agent, ברירת המחדל היאFalse. הוראות מפורטות זמינות במאמרים בדיקתip-masq-agentConfigMap, יצירתip-masq-agentConfigMap ועריכתip-masq-agentConfigMap קיים. - מוודאים ש-DaemonSet נפרס באשכול.
ip-masq-agentהוראות מפורטות זמינות במאמרים בדיקתip-masq-agentDaemonSet ופריסתip-masq-agentDaemonSet.
מאגרי תגים ו-Pods לאבחון עם hostNetwork: true
אלא אם מציינים כתובת IP מותאמת אישית של מקור לחבילות, פודים שפועלים עם hostNetwork: true וקונטיינרים לאבחון שולחים חבילות עם מקורות שתואמים לכתובת ה-IP של הצומת. ל-Pods שפועלים עם hostNetwork: true, GKE מקצה ל-Pod את כתובת ה-IP של הצומת. GKE לא מנהל כתובות IP עבור קונטיינרים לאבחון, כולל קונטיינרים לניפוי באגים בבעיות בצמתים באמצעות toolbox.
אשכולות Autopilot לא תומכים בהרצת Pods עם spec.hostNetwork: true. אי אפשר להריץ קונטיינרים של אבחון בצמתים של אשכול Autopilot כי אין אליהם גישה באמצעות SSH.
שמירה על מקורות כתובות ה-IPv4 של ה-Pod ליעדים באינטרנט
אם הגדרת ה-IP masquerade של האשכול היא אחת מההגדרות הבאות, GKE שומר על מקורות כתובות ה-IP של ה-Pod עבור מנות שנשלחות לכל היעדים, כולל יעדים באינטרנט:
- באשכולות רגילים עם
ip-masq-agentDaemonSet, אם הגדרתם אתnonMasqueradeCIDRsל-0.0.0.0ב-ip-masq-agentConfigMap. - באשכולות רגילים ללא
ip-masq-agentDaemonSet, אם הגדרתם את הדגל--disable-default-snat. - באשכולות של Autopilot, אם עורכים את ברירת המחדל של EgressNATPolicy כך ש-
spec.actionהואNoSNAT, ו-spec.destinationsמכילCidr: 0.0.0.0/0.
מקורות IPv4 של פודים הם כתובות IPv4 פנימיות, כלומר אי אפשר לנתב אותן באינטרנט. לכן, כששומרים על כתובות IPv4 של Pod כמקור למנות שנשלחות לאינטרנט, צריך להשתמש בטכניקה כמו אחת מהאפשרויות הבאות כדי לנתב מנות אחרי שהן יוצאות מהצמתים של האשכול:
- מוודאים שלרשת ה-VPC יש נתיב ברירת מחדל עם שער ברירת המחדל לאינטרנט כצעד הבא למעבר, ומגדירים שער Cloud NAT כדי לספק שירותי NAT ציבוריים לפחות לטווחים של כתובות IPv4 משניות של רשתות המשנה שמשמשות את ה-Pods באשכול. פרטים נוספים זמינים במאמר אינטראקציה עם GKE בסקירה הכללית של Cloud NAT.
- מגדירים את רשת ה-VPC לשימוש בנתיב ברירת מחדל מותאם אישית, שהקפיצה הבאה שלו היא מכונה וירטואלית או מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי, שבהם המכונה הווירטואלית או הקצה העורפי של מאזן העומסים הוגדרו להעברת מנות לאינטרנט בשם ה-Pods.
שחזור להתנהגות ברירת המחדל של SNAT
כדי לשחזר את התנהגות ברירת המחדל של SNAT כש-ip-masq-agent DaemonSet קיים באשכול, צריך למחוק את ip-masq-agent ConfigMap המשויך. ה-DaemonSet ip-masq-agent משחזר את התנהגות ברירת המחדל של הסתרת כתובת ה-IP בצמתים שהוא מנהל.
ip-masq-agent
כדי לשחזר את התנהגות ברירת המחדל של SNAT כש-ip-masq-agent DaemonSet לא קיים באשכול, צריך לשדרג את מאגר הצמתים (לוודא ש---disable-default-snat לא מוגדר באשכול).
השפעת מדיניות Egress NAT באשכולות Autopilot
מדיניות Egress NAT ב-GKE מאפשרת להגדיר הסוואה של כתובות IP באשכולות Autopilot. אתם יכולים להשתמש בהגדרת משאב מותאם אישית (CRD) של מדיניות GKE Egress NAT כדי לשנות את כתובות ה-IP של המקור של מנות שנשלחות מה-Pods.
מסיבות אבטחה או בגלל מיצוי של כתובות IP, אתם יכולים להשתמש בטכניקת מיסוך כדי להסתיר את כתובות ה-IP של הפודים בטווח כתובות ה-IP של הצמתים בתעבורת נתונים יוצאת לרשתות מקומיות. לדוגמה, אפשר להשתמש בטווח שאינו RFC-1918 עבור אשכולות Autopilot, ובטווח RFC-1918 עבור הצמתים. עם זאת, אם הפודים צריכים לתקשר עם רשתות מקומיות שגם משתמשות בטווח שאינו RFC-1918, יכול להיות שיהיה חפיפה בין כתובות ה-IP. כדי למנוע אובדן תנועה, אפשר להגדיר מדיניות NAT ליציאה כך שלא יפורסמו טווחי ה-Pods שאינם RFC-1918 ברשתות מקומיות. מדיניות NAT ליציאה מסווה את טווח ה-non RFC-1918 של ה-Pods כדי להשתמש בטווח ה-RFC-1918 של הצומת במקום. חשוב לוודא שטווח הצמתים לא חופף לטווח מקומי כלשהו, אחרת עלולה להיווצר לולאת תנועה.
GKE אוכף את ההתנהגות של הסתרת כתובות IP באשכולות Autopilot באמצעות התהליך הבא:
- מערכת GKE פורסת את בקר ה-Egress NAT ואת
ip-masq-agent. - יוצרים את מדיניות ה-NAT ליציאה.
- הבקר של GKE מתרגם את המדיניות ל-
ip-masq-agentConfigMap. - ה-DaemonSet
ip-masq-agentקורא את ה-ConfigMap ואז GKE אוכף את התנהגות ההסוואה של כתובות ה-IP.
מדיניות שנוצרת באופן אוטומטי
GKE תומך בשתי מדיניות NAT ליציאה שנוצרות באופן אוטומטי:
- ברירת מחדל: אפשר לערוך את המדיניות הזו.
- מנוהלות על ידי GKE: כללי המדיניות האלה קבועים ואי אפשר לערוך אותם.
מדיניות ברירת המחדל
GKE מגדיר מראש קבוצה של טווחי כתובות IP שמשמשים כברירת מחדל. כשחבילות נתונים נשלחות ליעדים האלה, האשכול לא מסווה את כתובות ה-IP של המקורות ושומר על כתובות ה-IP של הפודים המקוריים. כדי לשנות את טווחי כתובות ה-IP שמוגדרים כברירת מחדל, אפשר לעיין במאמר בנושא עריכה ופריסה של מדיניות Egress NAT.
קובץ המניפסט הבא מתאר מדיניות NAT ליציאה שמוגדרת כברירת מחדל:
Name: default
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:45Z
Generation: 2
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:45Z
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
f:destinations:
Manager: kubectl
Operation: Update
Time: 2022-03-17T01:58:13Z
Resource Version: 189346
UID: 06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.0.0.0/8
Cidr: 172.16.0.0/12
Cidr: 192.168.0.0/16
Cidr: 240.0.0.0/4
Cidr: 192.0.2.0/24
Cidr: 198.51.100.0/24
Cidr: 203.0.113.0/24
Cidr: 100.64.0.0/10
Cidr: 198.18.0.0/15
Cidr: 192.0.0.0/24
Cidr: 192.88.99.0/24
Status:
Events: <none>
טווחי ה-CIDR זהים לטווחי היעד שמוגדרים כברירת מחדל ללא הסוואה.
מנוהל על ידי מדיניות GKE
מדיניות GKE Egress NAT שומרת טווח סטטי של כתובות IP שנדרש כדי לשמור על פעולת האשכול. הטווח הסטטי הזה מכיל את טווחי כתובות ה-IP של ה-Pod, השירות והצומת של האשכול, ויכול להיות שהוא חופף למדיניות ברירת המחדל.
אפשר לזהות את המדיניות הזו באמצעות גיבוב דינמי של 8 בייט (gke-{CLUSTER_SHORT_HASH}) שמוקצה על ידי GKE. אי אפשר לערוך את המדיניות הזו.
במניפסט הבא מתוארת מדיניות שמנוהלת על ידי GKE בשם gke-bbfa6c0e-1:
Name: gke-bbfa6c0e-1
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:46Z
Generation: 1
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:destinations:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:46Z
Resource Version: 11699
UID: 0201b5de-a6f6-4926-822b-31ed7cdee2c6
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.119.128.0/17
Cidr: 10.120.0.0/22
Cidr: 10.128.0.0/20
Status:
Events: <none>
המאמרים הבאים
- איך משתמשים במדיניות Egress NAT כדי להגדיר הסוואת כתובות IP באשכולות של Autopilot
- איך מגדירים סוכן להסוואת כתובת IP באשכולות רגילים
- סקירה כללית על רשתות GKE
- מידע על הגדרת רשתות מורשות