במאמר הזה מוסבר איך מטמיעים מודל רשת במצב שטוח עם תמיכה בפרוטוקול Border Gateway Protocol (BGP). כשמטמיעים מודל רשת עם תמיכה ב-BGP, BGP מוודא באופן דינמי שפודים בדומיינים שונים של שכבה 2 יכולים לתקשר זה עם זה. רישות במצב שטוח עם BGP נקרא לפעמים IP שטוח דינמי.
מידע נוסף על מודלים של רשת במצב שטוח זמין במאמר מצב שטוח לעומת מצב איים במודלים של רשת.
איך מטמיעים רשת במצב שטוח שמשתמשת ב-BGP
כשיוצרים אשכול חדש, מופעלת רשת במצב שטוח עם BGP. אי אפשר להפעיל את התכונה הזו באשכול קיים. אחרי שמפעילים את התכונה הזו, אפשר לבצע שינויים בחלק מהגדרות התצורה.
כדי להטמיע אשכול במודל רשת במצב שטוח עם תמיכה ב-BGP:
עורכים את קובץ התצורה של האשכול:
- מגדירים את השדה
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מניפסט לקובץ התצורה של האשכול (לכל צומת, לכל מאגר צמתים או לכל האשכול).- מגדירים את השדה
מוסיפים מניפסט
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.מוסיפים מניפסט
FlatIPModeלקובץ התצורה של האשכול:השם של משאב
FlatIPModeחייב להיותdefault, ומרחב השמות הוא מרחב השמות של האשכול. הערךpeerSelectorflatip-peer: "true"תואם לתוויות באובייקטים BGPPeerbgppeer1ו-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"מוסיפים מניפסט אחד או יותר של
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מוסיפים מניפסט
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: 24ClusterCIDRConfig הוא משאב בהתאמה אישית שמציין טווחי CIDR של Pod שיוקצו לצמתים באופן דינמי. ה-CNI משתמש בטווחים של CIDR של Pod שהוקצו בצומת כדי להקצות כתובות IP ל-Pods בודדים שפועלים בצומת. ה-
ClusterCIDRConfigמשמש גם לרשתות עם פרוטוקול כפול. מידע נוסף עלClusterCIDRConfigהמשאב בהתאמה אישית ClusterCIDRConfig, כולל דוגמאות לשימוש,יוצרים את האשכול:
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, הקטע הזה כולל הוראות לבדיקת ההגדרה:
בודקים אם נוצר אובייקט
FlatIPModesבמרחב השמות של האשכול באשכול הניהול:kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIGהתגובה אמורה להיראות כך:
NAMESPACE NAME AGE cluster-bm default 2d17hבודקים אם אובייקט
flatipmodes.networking.gke.ioנוצר באשכול המשתמשים:האובייקט
flatipmodes.networking.gke.ioהוא ברמת האשכול.kubectl get flatipmodes.networking.gke.io --kubeconfig USER_KUBECONFIGהתגובה אמורה להיראות כך:
NAME AGE default 2d17hכדי לראות את הסשנים הנוכחיים, מריצים את הפקודה הבאה עם המשאבים
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כדי לראות את המסלולים שמפורסמים כרגע, אפשר להשתמש במשאבי
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.