הגדרת סוכן להסוואת כתובת IP באשכולות רגילים

בדף הזה מוסבר איך להגדיר אשכולות שנוצרו במצב רגיל של 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-agent DaemonSet.
  • בודקים את המשאב ip-masq-agent ConfigMap.

בודקים את ip-masq-agent DaemonSet

כדי לבדוק אם ה-DaemonSet‏ ip-masq-agent פועל באשכול, משתמשים ב-Google Cloud CLI או במסוף Google Cloud .

gcloud

  1. מקבלים את פרטי הכניסה לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    מחליפים את CLUSTER_NAME בשם האשכול.

  2. מחפשים את ip-masq-agent במרחב השמות kube-system:

    kubectl get daemonsets/ip-masq-agent -n kube-system
    

    אם קבוצת ה-DaemonSet קיימת, הפלט ייראה כך:ip-masq-agent

    NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    ip-masq-agent   3         3         3       3            3           <none>          13d
    

    אם ip-masq-agent DaemonSet לא קיים, הפלט ייראה כך:

    Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
    
  3. בודקים אם ip-masq-agent DaemonSet מריץ את הגרסה האחרונה:

    kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'
    

    הפקודה הזו צריכה להחזיר את אותו קובץ אימג' של קונטיינר כפי שצוין במאמר פריסת ה-DaemonSet של ip-masq-agent.

המסוף

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

    כניסה לדף Workloads

  2. בקטע סינון, מבצעים את הפעולות הבאות:

    1. לוחצים על כדי לנקות את המסנן Is system object: False.
    2. מסננים את המאפיינים הבאים:
      • Name (שם): ip-masq-agent.
      • אשכול: שם האשכול.

    אם ip-masq-agent DaemonSet קיים, אפשר לראות את הרשומה של DaemonSet בטבלה. אם ip-masq-agent DaemonSet לא קיים, לא מוצגות שורות.

כדי ליצור את 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

  1. מקבלים את פרטי הכניסה לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    מחליפים את CLUSTER_NAME בשם האשכול.

  2. מתארים את ip-masq-agent ConfigMap במרחב השמות kube-system:

    kubectl describe configmaps/ip-masq-agent -n kube-system
    

    אם ip-masq-agent ConfigMap קיים, הפלט דומה לזה:

    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
    

המסוף

  1. עוברים לדף Configuration במסוף Google Cloud .

    מעבר אל 'הגדרה'

  2. בקטע סינון, מבצעים את הפעולות הבאות:

    1. לוחצים על כדי לנקות את המסנן Is system object: False.
    2. מסננים את המאפיינים הבאים:
      • Name (שם): ip-masq-agent.
      • אשכול: שם האשכול.

    אם ip-masq-agent ConfigMap קיים, תוכלו לראות את הרשומה של ConfigMap בטבלה. אם ip-masq-agent ConfigMap לא קיים, לא מוצגות שורות.

אם באשכול כבר יש 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 הקיים במקום זאת.

  1. יוצרים קובץ תצורה באמצעות התבנית הבאה ושומרים אותו באופן מקומי. אפשר להשתמש בכל שם שרוצים עבור העותק המקומי של קובץ התצורה.

    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-agent Pod בודק את התוכן של ip-masq-agent ConfigMap וכותב את השינויים לקובץ /etc/config/ip-masq-agent המקומי שלו. ברירת המחדל היא 60.

    • UNIT_OF_TIME: יחידת הזמן של resyncInterval. הערכים התקינים כוללים s (לשניות) או ms (למילישניות). ברירת המחדל היא s.

    מגדירים את masqLinkLocal לערך False (ברירת המחדל) אלא אם צריך להפעיל הסוואה לחבילות שנשלחות לכתובות IPv4 מקומיות. מידע נוסף זמין במאמר Masquerading to link-local destinations (הסוואה של כתובות IP כדי להגיע ליעדים מקומיים).

  2. יוצרים את משאב ה-ConfigMap:

    kubectl create configmap ip-masq-agent \
       --namespace=kube-system \
       --from-file=config=LOCAL_CONFIG_FILE_PATH
    

    מחליפים את LOCAL_CONFIG_FILE_PATH בנתיב לקובץ התצורה שיצרתם בשלב הקודם.

  3. מתארים את ip-masq-agent ConfigMap במרחב השמות 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 DeamonSet.

עריכה של ip-masq-agent ConfigMap קיים

כדי לשנות את התוכן של ip-masq-agent ConfigMap קיים, פועלים לפי השלבים הבאים:

  1. פותחים את ConfigMap בכלי לעריכת טקסט:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. עורכים את התוכן של קובץ ה-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-agent Pod בודק את התוכן של ip-masq-agent ConfigMap וכותב את השינויים לקובץ /etc/config/ip-masq-agent המקומי שלו. ברירת המחדל היא 60.

    • UNIT_OF_TIME: יחידת הזמן של resyncInterval. הערכים התקינים כוללים s (לשניות) או ms (למילישניות). ברירת המחדל היא s.

    מגדירים את masqLinkLocal לערך False (ברירת המחדל) אלא אם צריך להפעיל הסוואה לחבילות שנשלחות לכתובות IPv4 מקומיות. מידע נוסף זמין במאמר Masquerading to link-local destinations (הסוואה של כתובות IP כדי להגיע ליעדים מקומיים).

  3. מתארים את ip-masq-agent ConfigMap במרחב השמות 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.

  1. שומרים את המניפסט הבא כקובץ 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 של הקונטיינר.

    אם צריך לערוך את קובץ המניפסט הזה, כדאי לשים לב לתנאים הבאים:

    • אפשר לבחור כל שם לנפח, אבל הוא חייב להיות זהה לvolumeMount name של הקונטיינר.

    • השם של ConfigMap צריך להיות זהה לשם של configMap ההפניה ב-config-volume Volume ב-Pod.

    • השם של השרשרת (--masq-chain) חייב להיות IP-MASQ. אחרת, GKE לא מבטל את כללי ברירת המחדל של מיסוך כתובות ה-IP.

    • רכיבי ה-Pod של DaemonSet קוראים מהקובץ ip-masq-agent. התוכן של הקובץ ip-masq-agent הוא הערך של המפתח config ב-ConfigMap.

    • אם אתם משתמשים בטווחי כתובות IP שמורות שלא מוסתרות כברירת מחדל, צריך לבטל את ההערה בשורה - --nomasq-all-reserved-ranges בקטע arg.

  2. פורסים את 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 של ה-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:

  1. פותחים את ip-masq-agent ConfigMap:

    kubectl edit configmap ip-masq-agent --namespace=kube-system
    
  2. בודקים את הרשימה nonMasqueradeCIDRs ב-ConfigMap. צריך לכלול את הרשימה nonMasqueradeCIDRs באופן מלא. לדוגמה:

    ...
    nonMasqueradeCIDRs:
      - 35.100.0.0/16
    ...
    
  3. אם הרשימה חסרה או לא מלאה, מוסיפים או משנים את nonMasqueradeCIDRs הרשימה כך שתכלול את טווחי כתובות ה-IP של היעד שרוצים לשמור עבורם את כתובות ה-IP של ה-Pod של המקור. הרשימה הזו צריכה לכלול גם את הכתובות שרוצים להשתמש בהן ב-Cloud NAT.

    אם לא רוצים שתנועה חיצונית תשתמש ב-SNAT, צריך להגדיר את השדה nonMasqueradeCIDRs לערך 0.0.0.0/0. לדוגמה:

    ...
    nonMasqueradeCIDRs:
      - 0.0.0.0/0
    ...
    

    כשהתעבורה לא משתמשת ב-SNAT, כל המנות שנשלחות מ-Pods שומרות על כתובת ה-IP של ה-Pod ככתובת ה-IP של המקור, ללא קשר ליעד.

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

    kubectl get nodes -o wide
    

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