הטמעה של מודל רשת במצב שטוח עם תמיכה ב-BGP

מודל רשת במצב שטוח עם תמיכה ב-Border Gateway Protocol ‏ (BGP) מאפשר לפודים בדומיינים שונים של שכבה 2 לתקשר זה עם זה. פרוטוקול BGP מפרסם באופן דינמי נתיבים בדומיינים האלה. רשת במצב שטוח עם BGP נקראת לפעמים כתובת IP שטוחה דינמית.

למידע נוסף על מודלים של רשתות במצב שטוח, ראו מודלים של רשתות במצב שטוח לעומת מצב אי.

איך מטמיעים רשת במצב שטוח שמשתמשת ב-BGP

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

כדי להטמיע אשכול במודל רשת במצב שטוח עם תמיכה ב-BGP:

  1. עורכים את קובץ התצורה של האשכול:

    • מגדירים את השדה spec.clusterNetwork.advancedNetworking לערך true.
    • אם רוצים להפעיל רשת במצב שטוח ל-IPv4, מגדירים את השדה spec.clusterNetwork.flatIPv4 לערך true.

      לחלופין, אפשר לעיין במאמר אשכול עם מחסנית כפולה (IPv4 Island, ‏ IPv6 Dynamic Flat IP), שבו מוסבר איך להגדיר את האשכול עם רשת במצב שטוח ל-IPv6 בלבד.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: bm
      namespace: cluster-bm
    spec:
      type: user
      ...
      clusterNetwork:
        advancedNetworking: true
        flatIPv4: true
      ...
    

    כשהערך של spec.clusterNetwork.flatIPv4 הוא true, המערכת מתעלמת מהשדה spec.clusterNetwork.pods.cidrBlocks ואפשר להשמיט אותו. עם זאת, צריך להוסיף מניפסט של ClusterCIDRConfigs בקובץ התצורה של האשכול (לכל צומת, לכל מאגר צמתים ו/או לכל אשכול).

  2. מוסיפים מניפסט של NetworkGatewayGroup לקובץ התצורה של האשכול:

    מציינים את כתובות ה-IP הצפות שבהן רוצים להשתמש לקישור בין רשתות שכנות (peering) של BGP. מוודאים ששם המשאב הוא default ומרחב השמות הוא מרחב השמות של האשכול.

    ---
    apiVersion: networking.gke.io/v1
    kind: NetworkGatewayGroup
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      floatingIPs:
      - 10.0.1.100
      - 10.0.2.100
    

    המשאב המותאם אישית NetworkGatewayGroup מנהל רשימה של כתובת IP צפה אחת או יותר. סשנים של קישור שכנים ב-BGP מתחילים מכתובות IP צפות שאתם מציינים במשאב המותאם אישית NetworkGatewayGroup.

  3. מוסיפים מניפסט של FlatIPMode לקובץ התצורה של האשכול:

    השם של המשאב FlatIPMode צריך להיות default ומרחב השמות הוא מרחב השמות של האשכול. הערך peerSelector של flatip-peer: "true" תואם לתוויות באובייקטים bgppeer1 ו-bgppeer2 של BGPPeer (שמוגדרים בשלב הבא), כך ששני העמיתים משמשים לרישות במצב שטוח.

    המניפסט הבא של FlatIPMode מיועד לרשת IPv4 במצב שטוח עם מחסנית אחת ו-BGP. במאמר דוגמאות להגדרות מפורטות הגדרות חלופיות.

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. מוסיפים לקובץ התצורה של האשכול מניפסט אחד או יותר של BGPPeer:

    אתם בוחרים את השמות של המשאבים, אבל כל המשאבים של BGPPeer צריכים להיות במרחב השמות של האשכול.

    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer1
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.1.254
      sessions: 2
    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer2
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.2.254
      sessions: 2
    
  5. מוסיפים מניפסט של ClusterCIDRConfig לקובץ התצורה של האשכול:

    המשאב CusterCIDRConfig צריך להיות גם במרחב השמות של האשכול.

    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: ClusterCIDRConfig
    metadata:
      name: cluster-wide-1
      namespace: cluster-bm
    spec:
      ipv4:
        cidr: "192.168.0.0/16"
        perNodeMaskSize: 24
    

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

  6. יוצרים את האשכול:

    bmctl create cluster
    

    למידע נוסף על יצירת אשכולות, ראו סקירה כללית על יצירת אשכולות.

    אם הסביבה שלכם תומכת ב-BGP עם כמה פרוטוקולים (MP-BGP), אפשר לפרסם נתיבי IPv4 ו-IPv6 בסשנים האלה של IPv4. במאמר דוגמאות להגדרות מופיעות דוגמאות להגדרות שונות, כולל דוגמאות לשימוש ב-MP-BGP.

שינוי הגדרות הרשת במצב שטוח שמבוסס על BGP

אחרי שיוצרים את האשכול שמוגדר להשתמש במודל רשת שטוח עם BGP, אפשר לעדכן חלק מהגדרות האישיות. כשאתם מבצעים עדכונים נוספים למשאבים שקשורים ל-BGP‏ (NetworkGatewayGroup,‏ FlatIPMode ו-BGPPeer), אתם צריכים להשתמש בקובץ kubeconfig של אשכול האדמין. לאחר מכן, אשכול האדמין יתאים את השינויים לאשכול המשתמש. אם תערכו את המשאבים האלה ישירות באשכול המשתמש, אשכול האדמין יחליף את השינויים שלכם בהתאמות הבאות.

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

בקטעים הבאים מפורטות דוגמאות להגדרת אשכולות לווריאציות שונות של מודל הרשת במצב שטוח עם BGP. הדוגמאות של קובצי התצורה לא שלמות. רוב הגדרות האשכול שלא רלוונטיות לרשת במצב שטוח עם BGP הושמטו.

אשכול IPv4 עם מחסנית אחת

בדוגמה הבאה של קובץ תצורה של אשכול מוצגות ההגדרות של אשכול IPv4 עם מחסנית אחת, עם רשת במצב שטוח עם BGP:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    services:
      cidrBlocks:
      - 10.96.0.0/12
  ...
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: false
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

אשכול עם מחסנית כפולה (IPv4 Island, ‏ IPv6 Dynamic Flat IP)

בדוגמה הבאה של קובץ תצורה של אשכול מוצגות ההגדרות של אשכול עם מחסנית כפולה (IPv4/IPv6) ורשת במצב שטוח עם BGP ל-IPv6 בלבד:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: false
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ... 
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "192.168.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: false
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

אשכול עם מחסנית כפולה (IPv4 Dynamic Flat IP, IPv6 Dynamic Flat IP)

בדוגמה הבאה של קובץ תצורה של אשכול מוצגות ההגדרות של אשכול עם שני סטאקים ורשת במצב שטוח עם BGP:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ... 
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig          
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

פתרון בעיות

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

  1. בודקים אם נוצר אובייקט FlatIPModes במרחב השמות של האשכול באשכול האדמין:

    kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIG
    

    התשובה אמורה להיראות כך:

    NAMESPACE                 NAME      AGE
    cluster-bm                default   2d17h
    
  2. בודקים אם נוצר אובייקט flatipmodes.networking.gke.io באשכול המשתמש:

    האובייקט flatipmodes.networking.gke.io מוגדר ברמת האשכול.

    kubectl get flatipmodes.networking.gke.io --kubeconfig USER_KUBECONFIG
    

    התשובה אמורה להיראות כך:

    NAME      AGE
    default   2d17h
    
  3. משיגים את המשאבים של BGPSessions כדי לראות את הסשנים הנוכחיים:

    kubectl get bgpsessions -A --kubeconfig USER_KUBECONFIG
    

    התשובה אמורה להיראות כך:

    NAMESPACE     NAME                LOCAL ASN   PEER ASN   LOCAL IP       PEER IP        STATE            LAST REPORT
    kube-system   10.0.1.254-node-01  65500       65000      10.0.1.100     10.0.1.254     Established      2s
    kube-system   10.0.1.254-node-02  65500       65000      10.0.3.100     10.0.1.254     NotEstablished   2s
    kube-system   10.0.3.254-node-01  65500       65000      10.0.1.100     10.0.3.254     NotEstablished   2s
    kube-system   10.0.3.254-node-02  65500       65000      10.0.3.100     10.0.3.254     Established      2s
    
  4. משיגים את המשאבים של BGPAdvertisedRoute כדי לראות את המסלולים שמתפרסמים כרגע:

    kubectl get bgpadvertisedroutes -A --kubeconfig USER_KUBECONFIG
    

    התשובה אמורה להיות בנוסח הבא:

    NAMESPACE     NAME                     PREFIX         METRIC
    kube-system   route-via-222-22-208-240   222.2.0.0/24   
    kube-system   route-via-222-22-209-240   222.2.1.0/24   
    

    שמות המסלולים מציינים את הצעד הבא. לדוגמה, הערך route-via-222-22-208-240 בתגובה לדוגמה שלמעלה מציין שהצעד הבא של הקידומת המפורסמת 222.2.0.0/24 הוא 222.22.208.240.