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

במאמר הזה מוסבר איך מטמיעים מודל רשת במצב שטוח עם תמיכה בפרוטוקול Border Gateway Protocol‏ (BGP). כשמטמיעים מודל רשת עם תמיכה ב-BGP, ‏ BGP מוודא באופן דינמי שפודים בדומיינים שונים של שכבה 2 יכולים לתקשר זה עם זה. רישות במצב שטוח עם 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 peering מופעלים מכתובות IP צפות שאתם מציינים במשאב המותאם אישית NetworkGatewayGroup.

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

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

    המניפסט הבא FlatIPMode הוא עבור רשת IPv4 single-stack, flat-mode עם 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, אפשר לעדכן חלק מהגדרות התצורה. משתמשים בקובץ kubeconfig של אשכול האדמין כשמבצעים עדכונים נוספים במשאבים שקשורים ל-BGP (‏NetworkGatewayGroup, ‏FlatIPMode ו-BGPPeer). לאחר מכן, אשכול האדמין מבצע התאמה של השינויים לאשכול המשתמש. אם עורכים את המשאבים האלה ישירות באשכול המשתמשים, אשכול האדמין ידרוס את השינויים בפעולות הבאות של סנכרון.

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

בקטעים הבאים מופיעות דוגמאות להגדרת אשכולות עבור וריאציות שונות של מודל רשת במצב שטוח עם 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)

בדוגמה הבאה של קובץ תצורה לאשכול מוצגות ההגדרות להגדרת אשכול עם תמיכה בשני פרוטוקולי אינטרנט (IPv4 ו-IPv6) עם רשת במצב שטוח באמצעות 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.