בדף הזה מתואר האופרטור הייעודי של פונקציית הרשת Kubernetes שמגיע עם Google Distributed Cloud במודל מחובר. האופרטור הזה מטמיע קבוצה של CustomResourceDefinitions (CRD) שמאפשרים ל-Distributed Cloud המחובר להריץ עומסי עבודה עם ביצועים גבוהים.
האופרטור Network Function מאפשר לבצע את הפעולות הבאות:
- שליחת בקשת מידע על מכשירי רשת קיימים בצומת.
- שאילתה של כתובת ה-IP ומצב הקישור הפיזי של כל מכשיר רשת בצומת.
- הקצאת ממשקי רשת נוספים בצומת.
- הגדרה של תכונות מערכת ברמה נמוכה במכונה הפיזית של הצומת שנדרשות לתמיכה בעומסי עבודה עם ביצועים גבוהים.
- משתמשים בווירטואליזציה של קלט/פלט עם שורש יחיד (SR-IOV) בממשקי רשת של PCI Express כדי להפוך אותם לווירטואליים לממשקים וירטואליים מרובים. לאחר מכן, תוכלו להגדיר את עומסי העבודה המחוברים של Distributed Cloud כך שישתמשו בממשקי הרשת הווירטואליים האלה.
התמיכה המחוברת ב-Distributed Cloud ב-SR-IOV מבוססת על הפרויקטים הבאים בקוד פתוח:
פרופילים של מפעילי פונקציות רשת
Distributed Cloud במודל מחובר מספק את פרופילי הפונקציונליות הבאים של מפעיל פונקציות רשת בכל גורם צורה של Distributed Cloud במודל מחובר:
מתלים מחוברים של Distributed Cloud תומכים בפרופיל המלא של פונקציית הרשת (NF) עם התכונות הבאות:
פונקציות אוטומציה של רשתות מאפשרות לבצע אוטומציה של הגדרת הרשת של ה-Pod של עומס העבודה. לדוגמה, הגדרת קישור בין רשתות שכנות (peering) של BGP וממשקי רשת משניים.
פונקציות ייצוא המצב מאפשרות לייצא את מצבי הרשת של המארח למשתמש, כולל הגדרות ומצב של ממשק הרשת.
פונקציות ההגדרה של הצומת מאפשרות לכם לשפר את הביצועים של הצומת כך שיתאימו לצרכים העסקיים שלכם, כולל בידוד CPU, דף ענק, ליבת זמן אמת, פרמטרים של
kubeletו-sysctl.פונקציות ניהול צריכת החשמל מאפשרות לכם לנהל את צריכת החשמל בצומת, כולל מצבי P ומצבי C של מעבדים מבודדים.
פונקציות Webhook מאפשרות לאמת את קלט המשתמשים.
פונקציות שונות כוללות את כלי האוטומציה SR-IOV שקובע באופן אוטומטי את האופרטור SR-IOV.
שרתים מחוברים של Distributed Cloud תומכים בפרופיל הפונקציונליות של האופרטור של פונקציית הרשת שעברה אופטימיזציה לביצועים, עם התכונות הבאות:
פונקציות אוטומציה של רשתות מאפשרות לבצע אוטומציה של הגדרת הרשת של ה-Pod של עומס העבודה. לדוגמה, הגדרת קישור בין רשתות שכנות (peering) של BGP וממשקי רשת משניים.
פונקציות ייצוא המצב מאפשרות לייצא את מצבי הרשת של המארח למשתמש, כולל הגדרות ומצב של ממשק הרשת.
פונקציות Webhook מאפשרות לאמת את קלט המשתמשים.
דרישות מוקדמות
מפעיל פונקציית הרשת מאחזר את תצורת הרשת מ-Distributed Cloud Edge Network API.
כדי לאפשר זאת, צריך להקצות לחשבון השירות של מפעיל פונקציית הרשת את התפקיד Edge Network Viewer (roles/edgenetwork.viewer) באמצעות הפקודה הבאה:
gcloud projects add-iam-policy-binding ZONE_PROJECT_ID \ --role roles/edgenetwork.viewer \ --member "serviceAccount:CLUSTER_PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"
מחליפים את מה שכתוב בשדות הבאים:
-
ZONE_PROJECT_IDבמזהה של Google Cloud הפרויקט שמכיל את המשאבים של Distributed Cloud Edge Network API. -
CLUSTER_PROJECT_IDבמזהה של Google Cloud הפרויקט שמכיל את אשכול היעד המחובר ל-Distributed Cloud.
משאבים של מפעילי פונקציות רשת
אופרטור של פונקציית רשת במודל מחובר של Distributed Cloud מטמיע את ה-CRD הבאים של Kubernetes:
-
Network. מגדיר רשת וירטואלית שקבוצות ה-Pod יכולות להשתמש בה כדי לתקשר עם משאבים פנימיים וחיצוניים. לפני שמציינים את ה-VLAN במשאב הזה, צריך ליצור את ה-VLAN המתאים באמצעות Distributed Cloud Edge Network API. הוראות מפורטות מופיעות במאמר בנושא יצירת רשת משנה. -
NetworkInterfaceState. מאפשרת לגלות את מצבי ממשק הרשת ולשאול את ממשק הרשת לגבי מצב הקישור וכתובת ה-IP. -
NodeSystemConfigUpdate. מאפשרת להגדיר תכונות מערכת ברמה נמוכה, כמו אפשרויות ליבה ודגלים שלKubelet. -
SriovNetworkNodePolicy. בוחר קבוצה של ממשקי רשת וירטואליים של SR-IOV ומפעיל את הקבוצה כמשאב Kubernetes. אפשר להשתמש במשאב הזה במשאבNetworkAttachmentDefinition. -
SriovNetworkNodeState. מאפשרת לשלוח שאילתה לגבי מצב ההקצאה של משאבSriovNetworkNodePolicyבצומת של Distributed Cloud. -
NetworkAttachmentDefinition. מאפשרת לכם לצרף תרמילי Distributed Cloud לרשת לוגית או פיזית אחת או יותר בצומת המחובר של Distributed Cloud. לפני שמציינים את ה-VLAN במשאב הזה, צריך ליצור את ה-VLAN המתאים באמצעות Distributed Cloud Edge Network API. הוראות מפורטות מופיעות במאמר בנושא יצירת רשת משנה.
מפעיל פונקציית הרשת מאפשר גם להגדיר ממשקי רשת משניים שלא משתמשים בפונקציות וירטואליות של SR-IOV.
משאב Network
משאב Network מגדיר רשת וירטואלית בתוך מתלה שמחובר ל-Distributed Cloud, שפודים בתוך אשכול שמחובר ל-Distributed Cloud יכולים להשתמש בו כדי לתקשר עם משאבים פנימיים וחיצוניים.
משאב Network מספק את הפרמטרים הבאים שאפשר להגדיר עבור ממשק הרשת שנחשף כשדות שאפשר לכתוב בהם:
-
spec.type: מציין את שכבת התעבורה ברשת עבור הרשת הזו. הערך החוקי היחיד הואL2. צריך לציין גם ערךnodeInterfaceMatcher.interfaceName. -
spec.nodeInterfaceMatcher.interfaceName: השם של ממשק הרשת הפיזי בצומת היעד של Distributed Cloud במודל מחובר, שרוצים להשתמש בו עם הרשת הזו. -
spec.gateway4: כתובת ה-IP של שער הרשת עבור הרשת הזו. -
spec.l2NetworkConfig.prefixLength4: מציין את טווח ה-CIDR של הרשת הזו. -
annotations.networking.gke.io/gdce-per-node-ipam-size: מציין את הגודל של מסכה של רשת משנה עבור צומת בודד. אם לא מציינים ערך, גודל מסכה של רשת משנה מוגדר לערך של השדהcluster-cidr-config-per-node-mask-sizeב-ConfigMapnf-operator-defaultsבמרחב השמותnf-operator. -
annotations.networking.gke.io/gke-gateway-clusterip-cidr: מציין חסימת CIDR לגישה לאשכולות דרך Connect Gateway. המשתנה הזה משמש אתCoreDNSבממשקי רשת משניים. -
annotations.networking.gke.io/gke-gateway-pod-cidr: מציין חסימת CIDR עבור Pod שאפשר להקצות בממשקי רשת משניים. -
annotations.networking.gke.io/gdce-vlan-id: מציין את מזהה ה-VLAN של הרשת הזו. -
annotations.networking.gke.io/gdce-vlan-mtu: (אופציונלי) מציין את ערך ה-MTU של הרשת הזו. אם לא מציינים ערך, הערך של MTU מועבר בירושה מהממשק ברמת ההורה. -
annotations.networking.gke.io/gdce-lb-service-vip-cidr: מציין את טווח כתובות ה-IP הווירטואליות של שירות איזון העומסים. הערך יכול להיות בלוק CIDR או טווח כתובות מפורש. ההערה הזו היא חובה עבור איזון עומסים בשכבה 3 ואופציונלית עבור איזון עומסים בשכבה 2.
בדוגמה הבאה אפשר לראות את מבנה המשאב:
apiVersion: networking.gke.io/v1
kind: Network
metadata:
name: vlan200-network
annotations:
networking.gke.io/gdce-vlan-id: 200
networking.gke.io/gdce-vlan-mtu: 1500
networking.gke.io/gdce-lb-service-vip-cidrs: "10.1.1.0/24"
spec:
type: L2
nodeInterfaceMatcher:
interfaceName: gdcenet0.200
gateway4: 10.53.0.1
כדי לציין כמה טווחים של כתובות IP וירטואליות לשירות איזון העומסים, משתמשים בהערה networking.gke.io/gdce-lb-service-vip-cidrs. אפשר לספק את הערכים של ההערה הזו כרשימה מופרדת בפסיקים או כמטען ייעודי (payload) בפורמט JSON.
לדוגמה:
[
{
"name": "test-oam-3",
"addresses": ["10.235.128.133-10.235.128.133"],
"autoAssign": false
}
,
{
"name": "test-oam-4",
"addresses": ["10.235.128.134-10.235.128.134"],
"autoAssign": false
},
{
"name": "test-oam-5",
"addresses": ["10.235.128.135-10.235.128.135"],
"autoAssign": false
}
]
אם בוחרים להשתמש במטען ייעודי (payload) בפורמט JSON, מומלץ להשתמש בפורמט JSON המצומצם. לדוגמה:
apiVersion: networking.gke.io/v1
kind: Network
metadata:
annotations:
networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"test-oam-3","addresses":["10.235.128.133-10.235.128.133"],"autoAssign":false},{"name":"test-oam-4","addresses":["10.235.128.134-10.235.128.134"],"autoAssign":false},{"name":"test-oam-5","addresses":["10.235.128.135-10.235.128.135"],"autoAssign":false}]'
networking.gke.io/gdce-vlan-id: "81"
name: test-network-vlan81
spec:
IPAMMode: Internal
dnsConfig:
nameservers:
- 8.8.8.8
gateway4: 192.168.81.1
l2NetworkConfig:
prefixLength4: 24
nodeInterfaceMatcher:
interfaceName: gdcenet0.81
type: L2
חשוב לזכור שאם לא מציינים את השדה autoAssign, ברירת המחדל שלו היא false.
משאב NetworkInterfaceState
המשאב NetworkInterfaceState הוא משאב לקריאה בלבד שמאפשר לכם לגלות ממשקי רשת פיזיים בצומת ולאסוף נתונים סטטיסטיים בזמן הריצה על תעבורת הרשת שעוברת דרך הממשקים האלה.
Distributed Cloud יוצר NetworkInterfaceState משאב לכל צומת באשכול.
ההגדרה שמוגדרת כברירת מחדל במכונות שמחוברות ל-Distributed Cloud כוללת ממשק רשת מאוגד בכרטיס הבת של הרשת לבחירת מתלים (rNDC) שנקרא gdcenet0. הממשק הזה מאגד את ממשקי הרשת eno1np0 ו-eno2np1. כל אחד מהם מחובר למתג ToR של Distributed Cloud.
המשאב NetworkInterfaceState מספק את הקטגוריות הבאות של מידע על ממשק הרשת, שמוצגות כשדות סטטוס לקריאה בלבד.
מידע כללי:
-
status.interfaces.ifname: השם של ממשק הרשת של היעד. status.lastReportTime: השעה והתאריך של דוח הסטטוס האחרון של ממשק היעד.
פרטי ההגדרה של כתובת ה-IP:
-
status.interfaces.interfaceinfo.address: כתובת ה-IP שהוקצתה לממשק היעד. -
status.interfaces.interfaceinfo.dns: כתובת ה-IP של שרת ה-DNS שהוקצתה לממשק היעד. -
status.interfaces.interfaceinfo.gateway: כתובת ה-IP של שער הרשת שמשרת את ממשק היעד. -
status.interfaces.interfaceinfo.prefixlen: אורך קידומת ה-IP.
מידע על החומרה:
-
status.interfaces.linkinfo.broadcast: כתובת ה-MAC של השידור של ממשק היעד. -
status.interfaces.linkinfo.businfo: הנתיב של מכשיר PCIe בפורמטbus:slot.function. -
status.interfaces.linkinfo.flags: הסימונים של הממשק, לדוגמה,BROADCAST. -
status.interfaces.linkinfo.macAddress: כתובת ה-MAC של שידור יחיד של ממשק היעד. -
status.interfaces.linkinfo.mtu: ערך ה-MTU של ממשק היעד.
נתוני קבלה:
-
status.interfaces.statistics.rx.bytes: המספר הכולל של הבייטים שהתקבלו בממשק היעד. -
status.interfaces.statistics.rx.dropped: המספר הכולל של חבילות הנתונים שהופלו על ידי ממשק היעד. -
status.interfaces.statistics.rx.errors: סך השגיאות בקבלת חבילות הנתונים בממשק היעד. -
status.interfaces.statistics.rx.multicast: המספר הכולל של חבילות הנתונים של שידור מרובה משתתפים שהתקבלו בממשק היעד. -
status.interfaces.statistics.rx.overErrors: המספר הכולל של חבילות הנתונים שהתקבלו מעבר לשגיאות בממשק היעד. -
status.interfaces.statistics.rx.packets: המספר הכולל של חבילות הנתונים שהתקבלו בממשק היעד.
נתונים סטטיסטיים של הפצה:
-
status.interfaces.statistics.tx.bytes: המספר הכולל של הבייטים שמועברים על ידי ממשק היעד. -
status.interfaces.statistics.tx.carrierErrors: סך השגיאות של הספק שנתקלו בהן בממשק היעד. -
status.interfaces.statistics.tx.collisions: המספר הכולל של התנגשויות חבילות הנתונים שהממשק של היעד נתקל בהן. -
status.interfaces.statistics.tx.dropped: המספר הכולל של חבילות הנתונים שהופלו על ידי ממשק היעד. -
status.interfaces.statistics.tx.errors: סך שגיאות השידור בממשק היעד. -
status.interfaces.statistics.tx.packets: המספר הכולל של חבילות הנתונים שמועברות על ידי ממשק היעד.
בדוגמה הבאה אפשר לראות את מבנה המשאב:
apiVersion: networking.gke.io/v1
kind: NetworkInterfaceState
metadata:
name: MyNode1
nodeName: MyNode1
status:
interfaces:
- ifname: eno1np0
linkinfo:
businfo: 0000:1a:00.0
flags: up|broadcast|multicast
macAddress: ba:16:03:9e:9c:87
mtu: 9000
statistics:
rx:
bytes: 1098522811
errors: 2
multicast: 190926
packets: 4988200
tx:
bytes: 62157709961
packets: 169847139
- ifname: eno2np1
linkinfo:
businfo: 0000:1a:00.1
flags: up|broadcast|multicast
macAddress: ba:16:03:9e:9c:87
mtu: 9000
statistics:
rx:
bytes: 33061895405
multicast: 110203
packets: 110447356
tx:
bytes: 2370516278
packets: 11324730
- ifname: enp95s0f0np0
interfaceinfo:
- address: fe80::63f:72ff:fec4:2bf4
prefixlen: 64
linkinfo:
businfo: 0000:5f:00.0
flags: up|broadcast|multicast
macAddress: 04:3f:72:c4:2b:f4
mtu: 9000
statistics:
rx:
bytes: 37858381
multicast: 205645
packets: 205645
tx:
bytes: 1207334
packets: 6542
- ifname: enp95s0f1np1
interfaceinfo:
- address: fe80::63f:72ff:fec4:2bf5
prefixlen: 64
linkinfo:
businfo: 0000:5f:00.1
flags: up|broadcast|multicast
macAddress: 04:3f:72:c4:2b:f5
mtu: 9000
statistics:
rx:
bytes: 37852406
multicast: 205607
packets: 205607
tx:
bytes: 1207872
packets: 6545
- ifname: enp134s0f0np0
interfaceinfo:
- address: fe80::63f:72ff:fec4:2b6c
prefixlen: 64
linkinfo:
businfo: 0000:86:00.0
flags: up|broadcast|multicast
macAddress: 04:3f:72:c4:2b:6c
mtu: 9000
statistics:
rx:
bytes: 37988773
multicast: 205584
packets: 205584
tx:
bytes: 1212385
packets: 6546
- ifname: enp134s0f1np1
interfaceinfo:
- address: fe80::63f:72ff:fec4:2b6d
prefixlen: 64
linkinfo:
businfo: 0000:86:00.1
flags: up|broadcast|multicast
macAddress: 04:3f:72:c4:2b:6d
mtu: 9000
statistics:
rx:
bytes: 37980702
multicast: 205548
packets: 205548
tx:
bytes: 1212297
packets: 6548
- ifname: gdcenet0
interfaceinfo:
- address: 208.117.254.36
prefixlen: 28
- address: fe80::b816:3ff:fe9e:9c87
prefixlen: 64
linkinfo:
flags: up|broadcast|multicast
macAddress: ba:16:03:9e:9c:87
mtu: 9000
statistics:
rx:
bytes: 34160422968
errors: 2
multicast: 301129
packets: 115435591
tx:
bytes: 64528301111
packets: 181171964
.. <remaining interfaces omitted>
lastReportTime: "2022-03-30T07:35:44Z"
משאב NodeSystemConfigUpdate
המשאב NodeSystemConfigUpdate מאפשר לכם לבצע שינויים בהגדרות של מערכת ההפעלה של הצומת, וגם לשנות את הדגלים Kubelet. כדי שהשינויים ייכנסו לתוקף, צריך להפעיל מחדש את הצומת, למעט שינויים ב-sysctl. המשאב הזה לא זמין בפריסות של שרתים מקושרים ב-Distributed Cloud.
כשמפעילים את המשאב הזה, צריך לציין את צמתי היעד בשדה nodeSelector. בשדה nodeSelector צריך לכלול את כל צמדי מפתח/ערך לכל צומת יעד. אם מציינים יותר מצומת יעד אחד בשדה הזה, צמתי היעד מתעדכנים אחד בכל פעם.
שימו לב: השדה nodeName הוצא משימוש. השימוש בפקודה הזו יגרום להפעלה מחדש מיידית של צמתי היעד, כולל צמתי מישור הבקרה המקומיים, ועלול לעצור עומסי עבודה קריטיים.
משאב NodeSystemConfigUpdate מספק את שדות ההגדרה הבאים שספציפיים ל-Distributed Cloud במודל מחובר:
-
spec.containerRuntimeDNSConfig.ip: מציין רשימה של כתובות IP עבור מאגרי תמונות פרטיים.
spec.containerRuntimeDNSConfig: מציין רשימה של רשומות DNS בהתאמה אישית שמשמשות את סביבת זמן הריצה של הקונטיינר בכל צומת מחובר של Distributed Cloud. כל רשומה כוללת את השדות הבאים:-
ip: מציינת את כתובת ה-IPv4 של היעד, -
domain: מציין את הדומיין המתאים, -
interface: מציין את ממשק היציאה מהרשת שדרכו אפשר להגיע לכתובת ה-IP שצוינה בשדהip. אפשר לציין ממשק שמוגדר באמצעות המשאבים הבאים:CustomNetworkInterfaceConfig,Network(באמצעות הערה),NetworkAttachmentDefinition(באמצעות הערה).
-
spec.kubeletConfig.cpuManagerPolicy: מציין את המדיניות של Kubernetes CPUManager. הערכים התקינים הםNoneו-Static.
spec.kubeletConfig.topologyManagerPolicy: מציין את מדיניותTopologyManagerשל Kubernetes. הערכים התקפים הםNone,BestEffort,Restrictedו-SingleNumaMode.
spec.osConfig.cgroupConfig.noKernelMemory: לא כולל זיכרון במרחב ליבה בחישוב השימוש בזיכרון של ה-Pod. הערכים התקינים הםtrueו-false.
spec.osConfig.hugePagesConfig: מציין את ההגדרה של דפים ענקיים לכל צומת NUMA. הערכים התקינים הם2MBו-1GB. מספר הדפים הענקיים המבוקש מתחלק באופן שווה בין שני צמתי ה-NUMA במערכת. לדוגמה, אם מקצים 16 דפים גדולים בגודל של 1 GB כל אחד, כל צומת מקבל הקצאה מראש של 8 GB.
spec.osConfig.isolatedCpusPerSocket: מציין את מספר המעבדים המבודדים לכל שקע. חובה אם הערך שלcpuManagerPolicyהואStatic. המספר המקסימלי של מעבדים מבודדים צריך להיות קטן מ-80% ממספר המעבדים הכולל בצומת.
spec.osConfig.cpuIsolationPolicy: מציין את מדיניות הבידוד של המעבד. המדיניותDefaultמבודדת רק משימות שלsystemdממעבדים ששמורים לעומסי עבודה. המדיניותKernelמסמנת את המעבדים כ-isolcpusומגדירה את הדגליםrcu_nocb,nohz_fullו-rcu_nocb_pollבכל מעבד. המדיניותKernelOptimizedמסמנת את המעבדים כ-isolcpusומגדירה את הסימוניםrcu_nocbו-rcu_nocb_pollבכל מעבד, אבל לא את הסימוןnohz_full.
spec.sysctls.NodeLevel: מציין את הפרמטרים שלsysctlsשאפשר להגדיר באופן גלובלי בצומת באמצעות האופרטור Network Function. הפרמטרים שניתנים להגדרה הם:fs.inotify.max_user_instancesfs.inotify.max_user_watcheskernel.sched_rt_runtime_uskernel.core_patternnet.ipv4.tcp_wmemnet.ipv4.tcp_rmemnet.ipv4.tcp_slow_start_after_idlenet.ipv4.udp_rmem_minnet.ipv4.udp_wmem_minnet.ipv4.tcp_rmemnet.ipv4.tcp_wmemnet.core.rmem_maxnet.core.wmem_maxnet.core.rmem_defaultnet.core.wmem_defaultnet.netfilter.nf_conntrack_tcp_timeout_unacknowledgednet.netfilter.nf_conntrack_tcp_timeout_max_retransnet.sctp.auth_enablenet.sctp.sctp_memnet.ipv4.udp_memnet.ipv4.tcp_memnet.ipv4.tcp_slow_start_after_idlenet.sctp.auth_enablevm.max_map_count
אפשר גם להגדיר את ההיקף של פרמטרים בטוחים ולא בטוחים של
sysctlsלפוד או למרחב שמות ספציפיים באמצעות תוסף Container Networking Interface (CNI) שלtuning.
במשאב NodeSystemConfigUpdate מופיעים שדות הסטטוס הכלליים הבאים לקריאה בלבד:
status.lastReportTime: הפעם האחרונה שבה דווח על הסטטוס של ממשק היעד.status.conditions.lastTransitionTime: הפעם האחרונה שבה השתנה התנאי של הממשק.-
status.conditions.observedGeneration: מציין את הערך.metadata.generationשעליו התבסס התנאי הראשוני. -
status.conditions.message: הודעה אינפורמטיבית שמתארת את השינוי במצב הממשק. -
status.conditions.reason: מזהה פרוגרמטי שמציין את הסיבה לשינוי האחרון במצב הממשק. status.conditions.status: תיאור הסטטוס של התנאי. הערכים התקפים הםTrue,Falseו-Unknown.-
status.conditions.type: סוג התנאי ב-camelCase.
בדוגמה הבאה אפשר לראות את מבנה המשאב:
apiVersion: networking.gke.io/v1
kind: NodeSystemConfigUpdate
metadata:
name: node-pool-1-config
namespace: default
spec:
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
networking.gke.io/worker-network-sriov.capable: true
sysctls:
nodeLevel:
"net.ipv4.udp_mem" : "12348035 16464042 24696060"
kubeletConfig:
topologyManagerPolicy: BestEffort
cpuManagerPolicy: Static
osConfig:
hugePagesConfig:
"TWO_MB": 0
"ONE_GB": 16
isolatedCpusPerSocket:
"0": 10
"1": 10
משאב SriovNetworkNodePolicy
המשאב SriovNetworkNodePolicy מאפשר להקצות קבוצה של פונקציות וירטואליות (VF) של SR-IOV במכונה פיזית שמחוברת לענן מבוזר, וליצור מופע של הקבוצה הזו כמשאב Kubernetes. אחר כך תוכלו להשתמש במשאב הזה במשאב NetworkAttachmentDefinition. המשאב הזה לא זמין בפריסות של שרתים מחוברים ב-Distributed Cloud
אפשר לבחור כל פונקציה וירטואלית לפי ספק ה-PCIe ומזהה המכשיר, לפי כתובות המכשיר ב-PCIe או לפי שם המכשיר שמופיע ברשימה ב-Linux. מפעיל הרשת SR-IOV מגדיר כל ממשק רשת פיזי כדי להקצות את הפונקציות הווירטואליות של היעד. הפעולה הזו כוללת עדכון של הקושחה של ממשק הרשת, הגדרה של מנהל ההתקן של ליבת Linux והפעלה מחדש של המכונה המחוברת ל-Distributed Cloud, אם יש צורך בכך.
כדי לגלות את ממשקי הרשת שזמינים בצומת, אפשר לחפש את NetworkInterfaceState המשאבים בצומת הזה במרחב השמות nf-operator.
בדוגמה הבאה אפשר לראות את מבנה המשאב:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: mlnx6-p2-sriov-en2
namespace: sriov-network-operator
spec:
deviceType: netdevice
isRdma: true
mtu: 9000
nicSelector:
pfNames:
- enp134s0f1np1
nodeSelector:
edgecontainer.googleapis.com/network-sriov.capable: "true"
numVfs: 31
priority: 99
resourceName: mlnx6_p2_sriov_en2
בדוגמה הקודמת נוצרות עד 31 פונקציות וירטואליות מהיציאה השנייה בממשק הרשת שנקרא enp134s0f1np1 עם ערך MTU של 9000 (הערך המקסימלי המותר). משתמשים בתווית לבחירת צומת edgecontainer.googleapis.com/network-sriov.capable, שמופיעה בכל הצמתים המחוברים ל-Distributed Cloud שתומכים ב-SR-IOV.
מידע על השימוש במשאב הזה זמין במאמר SriovNetworkNodeState.
משאב SriovNetworkNodeState
המשאב SriovNetworkNodeState read-only מאפשר לכם לשלוח שאילתה לגבי מצב ההקצאה של המשאב SriovNetworkNodePolicy בצומת מחובר של Distributed Cloud. היא מחזירה את ההגדרה המלאה של משאב SriovNetworkNodePolicy בצומת, וגם רשימה של פונקציות וירטואליות פעילות בצומת. השדה status.syncStatus מציין אם כל המשאבים SriovNetworkNodePolicy שהוגדרו לצומת SriovNetworkNodePolicy הוחלו בצורה תקינה. המשאב הזה לא זמין בפריסות של שרתים מקושרים ב-Distributed Cloud
בדוגמה הבאה אפשר לראות את מבנה המשאב:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
name: MyNode1
namespace: sriov-network-operator
spec:
dpConfigVersion: "1969684"
interfaces:
- mtu: 9000
name: enp134s0f1np1
numVfs: 31
pciAddress: 0000:86:00.1
vfGroups:
- deviceType: netdevice
mtu: 9000
policyName: mlnx6-p2-sriov-en2
resourceName: mlnx6_p2_sriov_en2
vfRange: 0-30
status:
Status:
Interfaces:
Device ID: 1015
Driver: mlx5_core
Link Speed: 25000 Mb/s
Link Type: ETH
Mac: ba:16:03:9e:9c:87
Mtu: 9000
Name: eno1np0
Pci Address: 0000:1a:00.0
Vendor: 15b3
Device ID: 1015
Driver: mlx5_core
Link Speed: 25000 Mb/s
Link Type: ETH
Mac: ba:16:03:9e:9c:87
Mtu: 9000
Name: eno2np1
Pci Address: 0000:1a:00.1
Vendor: 15b3
Vfs:
- Vfs:
- deviceID: 101e
driver: mlx5_core
mac: c2:80:29:b5:63:55
mtu: 9000
name: enp134s0f1v0
pciAddress: 0000:86:04.1
vendor: 15b3
vfID: 0
- deviceID: 101e
driver: mlx5_core
mac: 7e:36:0c:82:d4:20
mtu: 9000
name: enp134s0f1v1
pciAddress: 0000:86:04.2
vendor: 15b3
vfID: 1
.. <omitted 29 other VFs here>
syncStatus: Succeeded
מידע על השימוש במשאב הזה זמין במאמר SriovNetworkNodeState.
משאב NetworkAttachmentDefinition
המשאב NetworkAttachmentDefinition מאפשר לכם לצרף פודים של Distributed Cloud לרשת לוגית או פיזית אחת או יותר בצומת המחובר של Distributed Cloud. הוא מבוסס על מסגרת Multus-CNI ועל הפלאגינים הבאים:
אפשר להשתמש בהערה כדי להפנות לשם של משאב SriovNetworkNodePolicy מתאים. כשיוצרים את ההערה הזו, צריך לבצע את הפעולות הבאות:
- משתמשים במקש
k8s.v1.cni.cncf.io/resourceName. - משתמשים בקידומת
gke.io/בערך שלה, ואחריה בשם של משאב היעדSriovNetworkNodePolicy.
משתמשים בהערה networking.gke.io/gdce-vlan-id כדי לציין את מזהה ה-VLAN של רשת היעד. חובה להוסיף את ההערה הזו.
בדוגמאות הבאות אפשר לראות את מבנה המשאב. לרשתות IPv4.
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: sriov-net1
namespace: mynamespace
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p2_sriov_en2
networking.gke.io/gdce-vlan-id: 225
spec:
config: '{
"type": "sriov",
"cniVersion": "0.3.1",
"name": "sriov-network",
"ipam": {
"type": "host-local",
"subnet": "10.56.217.0/24",
"routes": [{
"dst": "0.0.0.0/0"
}],
"gateway": "10.56.217.1"
}
}'
לרשתות IPv6:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: sriov-210-den102
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_p0_sriov_en
networking.gke.io/gdce-vlan-id: 225
spec:
config: '{
"type": "sriov",
"cniVersion": "0.3.1",
"name": "sriov-210-den102",
"vlan": 210,
"ipam": {
"type": "host-local",
"rangeStart": "2001:4860:1025:102:ffff:0220::2",
"rangeEnd": "2001:4860:1025:102:ffff:0220::F",
"subnet": "2001:4860:1025:102:ffff:0220::/96",
"routes": [{
"dst": "::/0"
}],
"gateway": "2001:4860:1025:102:ffff:0220::1"
}
}'
הגדרת ממשק משני בתרמיל באמצעות SR-IOV VFs
אחרי שמגדירים משאב SriovNetworkNodePolicy ומשאב NetworkAttachmentDefinition תואם, אפשר להגדיר ממשק רשת משני ב-pod של Distributed Cloud באמצעות פונקציות וירטואליות של SR-IOV.
כדי לעשות זאת, מוסיפים הערה להגדרת ה-pod של Distributed Cloud באופן הבא:
- מקש:
k8s.v1.cni.cncf.io/networks - ערך:
nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...
בדוגמה הבאה אפשר לראות איך ההערה הזו נראית:
apiVersion: v1
kind: pod
metadata:
name: sriovpod
annotations:
k8s.v1.cni.cncf.io/networks: mynamespace/sriov-net1
spec:
containers:
- name: sleeppodsriov
command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
image: alpine
securityContext:
capabilities:
add:
- NET_ADMIN
הגדרת ממשק משני בתרמיל באמצעות מנהל ההתקן MacVLAN
Distributed Cloud connected תומך גם ביצירת ממשק רשת משני ב-Pod באמצעות מנהל ההתקן MacVLAN. רק בממשק gdcenet0 יש תמיכה בהגדרה הזו, ורק בפודים שמריצים עומסי עבודה מבוססי-קונטיינרים.
כדי להגדיר ממשק לשימוש במנהל ההתקן MacVLAN:
מגדירים משאב
NetworkAttachmentDefinitionכמו בדוגמאות הבאות. לרשתות IPv4:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: macvlan-b400-1 annotations: networking.gke.io/gdce-vlan-id: 400 spec: config: '{ "type": "macvlan", "master": "gdcenet0.400", "ipam": { "type": "static", "addresses": [ { "address": "192.168.100.20/27", "gateway": "192.168.100.1" } ] ... } }'לרשתות IPv6:
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: macvlan-bond0-210-den402 annotations: networking.gke.io/gdce-vlan-id spec: config: '{ "type": "macvlan", "cniVersion": "0.3.1", "name": "bond0-210", "master": "bond0.210", "ipam": { "type": "host-local", "rangeStart": "2001:4860:1025:102:0001:0210::2", "rangeEnd": "2001:4860:1025:102:0001:0210::F", "subnet": "2001:4860:1025:102:0001:0210::/96", "routes": [{ "dst": "::/0" }], "gateway": "2001:4860:1025:102:0001:0210::1" } }'מוסיפים הערה להגדרת ה-pod של Distributed Cloud באופן הבא. לרשתות IPv4:
apiVersion: v1 kind: pod metadata: name: macvlan-testpod1 annotations: k8s.v1.cni.cncf.io/networks: macvlan-b400-1לרשתות IPv6:
apiVersion: v1 kind: Pod metadata: name: vlan210-1 namespace: default annotations: k8s.v1.cni.cncf.io/networks: default/macvlan-bond0-210-den402
הגדרה של ממשק משני בפוד באמצעות רשתות מרובות ב-Distributed Cloud
Distributed Cloud connected תומך ביצירת ממשק רשת משני בתרמיל באמצעות התכונה multi-network. כדי לעשות זאת, צריך לבצע את השלבים הבאים:
מגדירים
Networkמשאב. לדוגמה:apiVersion: networking.gke.io/v1 kind: Network metadata: name: my-network-410 annotations: networking.gke.io/gdce-vlan-id: "410" networking.gke.io/gdce-lb-service-vip-cidrs: '[{"name":"myPool","addresses":["10.100.63.130-10.100.63.135"],"avoidBuggyIPs":false,"autoAssign":true}]' spec: type: L2 nodeInterfaceMatcher: interfaceName: gdcenet0.410 gateway4: 10.100.63.129 l2NetworkConfig: prefixLength4: 27ההערה
networking.gke.io/gdce-lb-service-vip-cidrsמציינת מאגר אחד או יותר של כתובות IP לרשת הווירטואלית הזו. החצי הראשון של ה-CIDR שאתם מציינים כאן חייב לכלול כתובות IP וירטואליות של שירות (SVIP). ב-Distributed Cloud במודל מחובר, הדרישה הזו נאכפת באמצעות בדיקות של webhook באופן הבא:- טווח כתובות ה-SVIP חייב להיות בתוך טווח ה-CIDR של ה-VLAN המתאים, ו
- טווח הכתובות של SVIP יכול לכלול רק עד המחצית הראשונה של טווח ה-CIDR של ה-VLAN.
מוסיפים הערה להגדרת ה-pod של Distributed Cloud באופן הבא:
apiVersion: v1 kind: pod metadata: name: myPod annotations: networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"pod-network"}, {"interfaceName":"eth1","network":"my-network-410"}]' networking.gke.io/default-interface: eth1ההערה הזו מגדירה את הממשק
eth0כראשי ואת הממשקeth1כמשני, עם איזון עומסים בשכבה 2 באמצעות MetalLB.
הגדרת הממשק המשני כמו שמתואר בקטע הזה גורמת ליצירה אוטומטית של המשאבים המותאמים אישית הבאים:
- משאב
IPAddressPool, שמאפשר הקצאה אוטומטית של כתובות SVIP לפודים. לדוגמה:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: test-410-pool
namespace: kube-system
annotations:
networking.gke.io/network:my-network-410
…
spec:
addresses:
- 10.100.63.130-10.100.63.135
autoAssign: true
L2Advertisementמשאב שמאפשר פרסום של כתובות ה-SVIP שצוינו. לדוגמה:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2advertise-410
namespace: kube-system
spec:
ipAddressPools:
- test-410-pool
interfaces:
- gdcenet0.410
## מה השלב הבא