בדף הזה מוסבר איך להגדיר אשכולות שנוצרו במצב רגיל של Google Kubernetes Engine (GKE) כדי לבצע הסוואת כתובות IP באמצעות ip-masq-agent. מידע נוסף על הסתרת כתובות IP ב-GKE במצב Autopilot זמין במאמר שימוש במדיניות NAT ליציאה כדי להגדיר הסתרת כתובות IP באשכולות Autopilot.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם אשכול קיים מסוג Standard. אם אתם צריכים כזה, צרו אשכול רגיל.
בדיקת הסטטוס של ip-masq-agent
בקטע הזה מוסבר איך:
- בודקים אם באשכול יש
ip-masq-agentDaemonSet. - בודקים את המשאב
ip-masq-agentConfigMap.
בודקים את ip-masq-agent DaemonSet
כדי לבדוק אם ה-DaemonSet ip-masq-agent פועל באשכול, משתמשים ב-Google Cloud CLI או במסוף Google Cloud .
gcloud
מקבלים את פרטי הכניסה לאשכול:
gcloud container clusters get-credentials CLUSTER_NAMEמחליפים את
CLUSTER_NAMEבשם האשכול.מחפשים את
ip-masq-agentבמרחב השמותkube-system:kubectl get daemonsets/ip-masq-agent -n kube-systemאם קבוצת ה-DaemonSet קיימת, הפלט ייראה כך:
ip-masq-agentNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13dאם
ip-masq-agentDaemonSet לא קיים, הפלט ייראה כך:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not foundבודקים אם
ip-masq-agentDaemonSet מריץ את הגרסה האחרונה:kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'הפקודה הזו צריכה להחזיר את אותו קובץ אימג' של קונטיינר כפי שצוין במאמר פריסת ה-DaemonSet של ip-masq-agent.
המסוף
נכנסים לדף Workloads במסוף Google Cloud .
בקטע סינון, מבצעים את הפעולות הבאות:
- לוחצים על כדי לנקות את המסנן Is system object: False.
- מסננים את המאפיינים הבאים:
- Name (שם):
ip-masq-agent. - אשכול: שם האשכול.
- Name (שם):
אם
ip-masq-agentDaemonSet קיים, אפשר לראות את הרשומה של DaemonSet בטבלה. אםip-masq-agentDaemonSet לא קיים, לא מוצגות שורות.
כדי ליצור את ip-masq-agent ConfigMap ולפרוס את ip-masq-agent DaemonSet, אפשר לעיין במאמר הגדרה ופריסה של ip-masq-agent.
בדיקת ה-ConfigMap ip-masq-agent
כדי לבדוק אם ה-ConfigMap ip-masq-agent פועל באשכול, משתמשים ב-Google Cloud CLI או במסוף Google Cloud .
gcloud
מקבלים את פרטי הכניסה לאשכול:
gcloud container clusters get-credentials CLUSTER_NAMEמחליפים את
CLUSTER_NAMEבשם האשכול.מתארים את
ip-masq-agentConfigMap במרחב השמותkube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemאם
ip-masq-agentConfigMap קיים, הפלט דומה לזה:Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>אם קובץ ה-ConfigMap של
ip-masq-agentלא קיים, הפלט ייראה כך:Error from server (NotFound): configmaps "ip-masq-agent" not found
המסוף
עוברים לדף Configuration במסוף Google Cloud .
בקטע סינון, מבצעים את הפעולות הבאות:
- לוחצים על כדי לנקות את המסנן Is system object: False.
- מסננים את המאפיינים הבאים:
- Name (שם):
ip-masq-agent. - אשכול: שם האשכול.
- Name (שם):
אם
ip-masq-agentConfigMap קיים, תוכלו לראות את הרשומה של ConfigMap בטבלה. אםip-masq-agentConfigMap לא קיים, לא מוצגות שורות.
אם באשכול כבר יש ip-masq-agent ConfigMap, אפשר להגדיר ולפרוס אותו.
הגדרה ופריסה של ip-masq-agent
בקטע הזה מוסבר איך ליצור או לערוך את ip-masq-agentConfigMap ואיך לפרוס או למחוק את ip-masq-agentDaemonSet. כדי לדעת אילו משימות צריך לבצע, קודם צריך לבדוק אם ב-cluster כבר יש את ip-masq-agent ConfigMap ואת ip-masq-agent DaemonSet.
יצירת ConfigMap של ip-masq-agent
בשלבים הבאים נסביר איך ליצור את ConfigMap ip-masq-agent. אם ל-ConfigMap של ip-masq-agent כבר יש את ip-masq-agent, עורכים את ה-ConfigMap הקיים במקום זאת.
יוצרים קובץ תצורה באמצעות התבנית הבאה ושומרים אותו באופן מקומי. אפשר להשתמש בכל שם שרוצים עבור העותק המקומי של קובץ התצורה.
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIMEמחליפים את מה שכתוב בשדות הבאים:
CIDR_1ו-CIDR_2: טווחי כתובות ה-IP בפורמט CIDR. כשמנות נשלחות ליעדים האלה, האשכול לא מסווה את כתובות ה-IP של מקורות ושומר על כתובות ה-IP של ה-Pod המקורי. אם אתם צריכים יותר משני CIDR, מוסיפים עוד רשומות לרשימהnonMasqueradeCIDRsבאותו פורמט. לפחות, המאפייןnonMasqueradeCIDRsצריך לכלול את טווחי כתובות ה-IP של הצומת וה-Pod של האשכול.
SYNC_INTERVAL: כמות הזמן שעוברת עד שכלip-masq-agentPod בודק את התוכן שלip-masq-agentConfigMap וכותב את השינויים לקובץ/etc/config/ip-masq-agentהמקומי שלו. ברירת המחדל היא60.
UNIT_OF_TIME: יחידת הזמן של resyncInterval. הערכים התקינים כולליםs(לשניות) אוms(למילישניות). ברירת המחדל היאs.
מגדירים את
masqLinkLocalלערך False (ברירת המחדל) אלא אם צריך להפעיל הסוואה לחבילות שנשלחות לכתובות IPv4 מקומיות. מידע נוסף זמין במאמר Masquerading to link-local destinations (הסוואה של כתובות IP כדי להגיע ליעדים מקומיים).יוצרים את משאב ה-ConfigMap:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATHמחליפים את
LOCAL_CONFIG_FILE_PATHבנתיב לקובץ התצורה שיצרתם בשלב הקודם.מתארים את
ip-masq-agentConfigMap במרחב השמותkube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemהפלט אמור להיראות כך:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>הפלט הזה כולל את הפרמטר
configעם שינויי ההגדרה. עכשיו אפשר לפרוס אתip-masq-agentDeamonSet.
עריכה של ip-masq-agent ConfigMap קיים
כדי לשנות את התוכן של ip-masq-agent ConfigMap קיים, פועלים לפי השלבים הבאים:
פותחים את ConfigMap בכלי לעריכת טקסט:
kubectl edit configmap ip-masq-agent --namespace=kube-systemעורכים את התוכן של קובץ ה-ConfigMap:
apiVersion: v1 data: config: | nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME kind: ConfigMap metadata: name: ip-masq-agent namespace: kube-systemמחליפים את מה שכתוב בשדות הבאים:
CIDR_1ו-CIDR_2: טווחי כתובות ה-IP בפורמט CIDR. כשמנות נשלחות ליעדים האלה, האשכול לא מסווה את כתובות ה-IP של מקורות ושומר על כתובות ה-IP של ה-Pod המקורי. אם אתם צריכים יותר משני CIDR, מוסיפים עוד ערכים לרשימהnonMasqueradeCIDRsבאותו פורמט. לכל הפחות, המאפייןnonMasqueradeCIDRsצריך לכלול את טווחי כתובות ה-IP של הצומת ושל ה-Pod באשכול.
SYNC_INTERVAL: כמות הזמן שעוברת עד שכלip-masq-agentPod בודק את התוכן שלip-masq-agentConfigMap וכותב את השינויים לקובץ/etc/config/ip-masq-agentהמקומי שלו. ברירת המחדל היא60.
UNIT_OF_TIME: יחידת הזמן של resyncInterval. הערכים התקינים כולליםs(לשניות) אוms(למילישניות). ברירת המחדל היאs.
מגדירים את
masqLinkLocalלערך False (ברירת המחדל) אלא אם צריך להפעיל הסוואה לחבילות שנשלחות לכתובות IPv4 מקומיות. מידע נוסף זמין במאמר Masquerading to link-local destinations (הסוואה של כתובות IP כדי להגיע ליעדים מקומיים).מתארים את
ip-masq-agentConfigMap במרחב השמותkube-system:kubectl describe configmaps/ip-masq-agent -n kube-systemהפלט אמור להיראות כך:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>הפלט הזה כולל את הפרמטר
configשתואם לערך ההגדרה מהקובץ שיצרתם.
פריסה של ip-masq-agent DaemonSet
אחרי שיוצרים או עורכים את ip-masq-agent ConfigMap, פורסים את ip-masq-agent DaemonSet.
שומרים את המניפסט הבא כקובץ YAML:
apiVersion: apps/v1 kind: DaemonSet metadata: name: ip-masq-agent namespace: kube-system spec: selector: matchLabels: k8s-app: ip-masq-agent template: metadata: labels: k8s-app: ip-masq-agent spec: hostNetwork: true containers: - name: ip-masq-agent image: gke.gcr.io/ip-masq-agent:v2.12.6-gke.15@sha256:c51e89bdc5073fdbaaff8bf42b32765f7f1eb0fec7d6189de5f14c48ac489448 args: - --v=2 - --logtostderr=false - --log_file=/dev/stdout - --log_file_max_size=0 # The masq-chain must be IP-MASQ - --masq-chain=IP-MASQ # To non-masquerade reserved IP ranges by default, # uncomment the following line. # - --nomasq-all-reserved-ranges # Must be set to false when using Dataplane V2. - --random-fully=false securityContext: privileged: false capabilities: drop: ["ALL"] add: ["NET_ADMIN", "NET_RAW"] allowPrivilegeEscalation: false seccompProfile: type: RuntimeDefault volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: ip-masq-agent optional: true items: - key: config path: ip-masq-agent tolerations: - effect: NoSchedule operator: Exists - effect: NoExecute operator: Exists - key: "CriticalAddonsOnly" operator: "Exists"
המניפסט הזה יוצר נפח אחסון בשם
config-volumeשמוטמע כמו שצוין ב-volumeMount של הקונטיינר.אם צריך לערוך את קובץ המניפסט הזה, כדאי לשים לב לתנאים הבאים:
אפשר לבחור כל שם לנפח, אבל הוא חייב להיות זהה ל
volumeMountname של הקונטיינר.השם של ConfigMap צריך להיות זהה לשם של
configMapההפניה ב-config-volumeVolume ב-Pod.השם של השרשרת (
--masq-chain) חייב להיותIP-MASQ. אחרת, GKE לא מבטל את כללי ברירת המחדל של מיסוך כתובות ה-IP.רכיבי ה-Pod של DaemonSet קוראים מהקובץ
ip-masq-agent. התוכן של הקובץip-masq-agentהוא הערך של המפתחconfigב-ConfigMap.אם אתם משתמשים בטווחי כתובות IP שמורות שלא מוסתרות כברירת מחדל, צריך לבטל את ההערה בשורה
- --nomasq-all-reserved-rangesבקטעarg.
פורסים את DaemonSet:
kubectl apply -f LOCAL_FILE_PATHמחליפים את
LOCAL_FILE_PATHבנתיב לקובץ שיצרתם בשלב הקודם.
אפשר לעדכן באופן ידני את ip-masq-agent DaemonSet שיצרתם. מידע נוסף זמין במאמר בנושא עדכון DaemonSet.
מחיקת ip-masq-agent
בקטע הזה מוסבר איך למחוק את ip-masq-agent DaemonSet ואת ip-masq-agent ConfigMap. מחיקת ip-masq-agent לא מבטלת את הגדרות הסתרת ה-IP הקיימות בצמתים.
מחיקת ip-masq-agent DaemonSet
אם יצרתם את ip-masq-agent DaemonSet באופן ידני, אתם יכולים למחוק אותו באמצעות הפקודה הבאה:
kubectl delete daemonsets ip-masq-agent -n kube-system
מחיקת ip-masq-agent ConfigMap
כדי למחוק לחלוטין את ip-masq-agent ConfigMap, מריצים את הפקודה הבאה:
kubectl delete configmap ip-masq-agent -n kube-system
פתרון בעיות
בקטעים הבאים מפורטות הנחיות לפתרון בעיות.
פתרון בעיות כלליות
השלבים הבאים יעזרו לכם לאבחן בעיות שקשורות להסוואת כתובת IP:
- בודקים מה הסטטוס של
ip-masq-agent. אם לא מוגדר ConfigMap, התעבורה לכל יעדי ברירת המחדל לא מוסתרת וכתובת ה-IP של ה-Pod נשמרת. תעבורה ליעדים אחרים שומרת על כתובת ה-IP של הצומת. - מאשרים את גרסת התמונה של
ip-masq-agentשצוינה ב-DaemonSet. אם הגרסה שלip-masq-agentDaemonSet לא עדכנית, פועלים לפי שלבי הפריסה כדי לעדכן את DaemonSet. - מריצים את הפקודה
sudo iptables -t nat -L IP-MASQבצומת המושפע כדי לבדוק אם שרשרת ה-IP-MASQ מאוכלסת בצורה נכונה בטבלאות ה-IP של NAT. אם ה-nonMasqueradeCIDRsשמוגדר ב-ConfigMap לא מופיע בטבלאות של כתובות ה-IP של NAT, צריך לוודא שאין שגיאות הקלדה בקובץ התצורה ששימש ליצירת ה-ConfigMap. - מוודאים שביעד יש הרשאה לטווח כתובות ה-IP של הצומת ושל ה-Pod.
- אם אי אפשר לגשת לתעבורה מהצומת או מה-Pod, מריצים בדיקת קישוריות.
בעיה: כתובת ה-IP של ה-Pod משתנה לכתובת ה-IP של הצומת
כשמשתמשים בסוכן של הסוואת כתובת IP, יכול להיות שתשימו לב שכתובת ה-IP של המקור של ה-Pod משתמשת באופן לא צפוי בכתובת ה-IP של הצומת כשה-Pods מתקשרים עם יעדים חיצוניים.
הבעיה נגרמת בגלל רשימה חסרה או לא מלאה של תרגום מותאם אישית של כתובת רשת מקור (SNAT). כשמשתמשים בסוכן להסוואת כתובות IP, נעשה שימוש ב-SNAT שמוגדר כברירת מחדל באשכול אם ה-ConfigMap חסר או אם הוא לא מכיל רשימה של nonMasqueradeCIDRs. כשחבילת נתונים יוצאת מ-Pod, ה-SNAT שמוגדר כברירת מחדל משנה את כתובת ה-IP של המקור מכתובת ה-IP של ה-Pod לכתובת ה-IP הפנימית של הצומת. מידע נוסף על SNAT זמין במאמר בנושא סוכן להסתרת כתובת IP.
כדי לפתור את הבעיה, מגדירים רשימת SNAT בהתאמה אישית על ידי הגדרת רשימת nonMasqueradeCIDRs ב-ConfigMap ip-masq-agent:
פותחים את
ip-masq-agentConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-systemבודקים את הרשימה
nonMasqueradeCIDRsב-ConfigMap. צריך לכלול את הרשימהnonMasqueradeCIDRsבאופן מלא. לדוגמה:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...אם הרשימה חסרה או לא מלאה, מוסיפים או משנים את
nonMasqueradeCIDRsהרשימה כך שתכלול את טווחי כתובות ה-IP של היעד שרוצים לשמור עבורם את כתובות ה-IP של ה-Pod של המקור. הרשימה הזו צריכה לכלול גם את הכתובות שרוצים להשתמש בהן ב-Cloud NAT.אם לא רוצים שתנועה חיצונית תשתמש ב-SNAT, צריך להגדיר את השדה
nonMasqueradeCIDRsלערך0.0.0.0/0. לדוגמה:... nonMasqueradeCIDRs: - 0.0.0.0/0 ...כשהתעבורה לא משתמשת ב-SNAT, כל המנות שנשלחות מ-Pods שומרות על כתובת ה-IP של ה-Pod ככתובת ה-IP של המקור, ללא קשר ליעד.
בודקים את כתובת ה-IP של המקור של חבילות יוצאות מה-Pods. כדי לבדוק את הכתובת הזו, צריך לתעד את החבילות. אם זה לא אפשרי, אפשר לבדוק את כתובת ה-IP של הצומת, שאמורה להיות כתובת ה-IP של המקור של מנות יוצאות שחלות על SNAT, באמצעות הפקודה הבאה:
kubectl get nodes -o wide
המאמרים הבאים
- איך משתמשים במדיניות Egress NAT כדי להגדיר הסוואה של כתובות IP באשכולות של Autopilot
- איך יוצרים אשכול המותאם ל-VPC
- סקירה כללית על רשת GKE
- מידע נוסף על הגדרת רשתות מורשות