מפעיל של פונקציית רשת

בדף הזה מתואר אופרטור Kubernetes מיוחד של פונקציית רשת ש-Google Distributed Cloud נשלח איתו. האופרטור הזה מטמיע קבוצה של CustomResourceDefinitions ‏ (CRD) שמאפשרים ל-Distributed Cloud להריץ עומסי עבודה עם ביצועים גבוהים.

הפונקציונליות של Network Function operator ו-SR-IOV לא זמינה ב-Distributed Cloud Servers.

האופרטור Network Function מאפשר לבצע את הפעולות הבאות:

  • שליחת בקשת מידע על מכשירי רשת קיימים בצומת.
  • שאילתה של כתובת ה-IP ומצב הקישור הפיזי של כל מכשיר רשת בצומת.
  • הקצאת ממשקי רשת נוספים בצומת.
  • הגדרה של תכונות מערכת ברמה נמוכה במכונה הפיזית של הצומת שנדרשות לתמיכה בעומסי עבודה עם ביצועים גבוהים.
  • משתמשים בווירטואליזציה של קלט/פלט עם שורש יחיד (SR-IOV) בממשקי רשת של PCI Express כדי להפוך אותם לווירטואליים לממשקים וירטואליים מרובים. לאחר מכן תוכלו להגדיר את עומסי העבודה ב-Distributed Cloud כך שישתמשו בממשקי הרשת הווירטואליים האלה.

התמיכה של Distributed Cloud ב-SR-IOV מבוססת על הפרויקטים הבאים בקוד פתוח:

דרישות מוקדמות

מפעיל פונקציית הרשת מאחזר את תצורת הרשת מ-Distributed Cloud Edge Network API. כדי לאפשר זאת, צריך להקצות לחשבון השירות של מפעיל פונקציית הרשת את התפקיד Edge Network Viewer ‏(roles/edgenetwork.viewer) באמצעות הפקודה הבאה:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --role roles/edgenetwork.viewer \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[nf-operator/nf-angautomator-sa]"

מחליפים את PROJECT_ID במזהה של פרויקט היעד. Google Cloud

משאבים של מפעילי פונקציות רשת

אופרטור הפונקציה של Distributed Cloud Network מטמיע את ה-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 Pods לרשת לוגית או פיזית אחת או יותר בצומת Distributed Cloud. צריך ליצור את ה-VLAN המתאים לפני שמציינים אותו במשאב הזה. לפני שמציינים את ה-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 של הרשת הזו.

בדוגמה הבאה אפשר לראות את מבנה המשאב:

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
spec:
  type: L2
  nodeInterfaceMatcher:
    interfaceName: gdcenet0.200
  gateway4: 10.53.0.1

משאב 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.

כשמפעילים את המשאב הזה, צריך לציין את צמתי היעד בשדה nodeSelector. בשדה nodeSelector צריך לכלול את כל צמדי מפתח/ערך לכל צומת יעד. אם מציינים יותר מצומת יעד אחד בשדה הזה, צמתי היעד מתעדכנים אחד בכל פעם. השדה הזה מחליף את השדה nodeName.

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

משאב NodeSystemConfigUpdate מספק את שדות ההגדרה הבאים שספציפיים ל-Distributed Cloud:

  • spec.containerRuntimeDNSConfig.ip: מציין רשימה של כתובות IP עבור מאגרי תמונות פרטיים.
  • spec.containerRuntimeDNSConfig: מציין רשימה של רשומות DNS בהתאמה אישית שמשמשות את סביבת זמן הריצה של הקונטיינר בכל צומת של Distributed Cloud. כל רשומה כוללת את השדות הבאים:

    • ip: מציינת את כתובת ה-IPv4 של היעד,
    • domain: מציין את הדומיין המתאים,
    • interface: מציין את ממשק היציאה מהרשת שדרכו אפשר להגיע לכתובת ה-IP שצוינה בשדה ip. אפשר לציין ממשק שמוגדר באמצעות המשאבים הבאים: CustomNetworkInterfaceConfig,‏ Network (באמצעות הערה), NetworkAttachmentDefinition (באמצעות הערה). זו תכונה בגרסת טרום-השקה (Preview).
  • spec.kubeletConfig.cpuManagerPolicy: מציין את המדיניות של Kubernetes CPUManager. הערכים התקינים הם None ו-Static.

  • spec.kubeletConfig.topologyManagerPolicy: מציין את המדיניות של Kubernetes TopologyManager. הערכים התקפים הם None,‏ BestEffort,‏ Restricted ו-SingleNumaMode.

  • spec.osConfig.hugePagesConfig: מציין את ההגדרה של דפים ענקיים לכל צומת NUMA. הערכים התקינים הם 2MB ו-1GB. מספר הדפים הענקיים שנדרשים מתחלק באופן שווה בין שני צמתי ה-NUMA במערכת. לדוגמה, אם מקצים 16 דפים גדולים בגודל של 1 GB כל אחד, כל צומת מקבל הקצאה מראש של 8 GB.

  • spec.osConfig.isolatedCpusPerSocket: מציין את מספר המעבדים המבודדים לכל שקע. חובה אם הערך של cpuManagerPolicy הוא Static.

  • spec.osConfig.cpuIsolationPolicy: מציין את מדיניות הבידוד של המעבד. המדיניות Default מבודדת רק משימות systemd ממעבדים ששמורים לעומסי עבודה. המדיניות Kernel מסמנת את המעבדים כ-isolcpus ומגדירה את הדגלים rcu_nocb, nohz_full ו-rcu_nocb_poll בכל מעבד.

  • spec.sysctls.NodeLevel: מציין את הפרמטרים של sysctls שאפשר להגדיר באופן גלובלי בצומת באמצעות האופרטור Network Function. הפרמטרים שניתנים להגדרה הם:

    • fs.inotify.max_user_instances
    • fs.inotify.max_user_watches
    • kernel.sched_rt_runtime_us
    • kernel.core_pattern
    • net.ipv4.tcp_wmem
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_slow_start_after_idle
    • net.ipv4.udp_rmem_min
    • net.ipv4.udp_wmem_min
    • net.ipv4.tcp_rmem
    • net.ipv4.tcp_wmem
    • net.core.rmem_max
    • net.core.wmem_max
    • net.core.rmem_default
    • net.core.wmem_default
    • net.netfilter.nf_conntrack_tcp_timeout_unacknowledged
    • net.netfilter.nf_conntrack_tcp_timeout_max_retrans
    • net.sctp.auth_enable
    • net.sctp.sctp_mem
    • net.ipv4.udp_mem
    • net.ipv4.tcp_mem
    • net.ipv4.tcp_slow_start_after_idle
    • net.sctp.auth_enable
    • vm.max_map_count

    אפשר גם להגדיר את הפרמטרים sysctls הבטוחים והלא בטוחים כך שיחולו על Pod או על מרחב שמות ספציפיים באמצעות התוסף tuning Container Networking Interface (CNI).

במשאב 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 במכונה פיזית של Distributed Cloud וליצור מופע של הקבוצה הזו כמשאב Kubernetes. אחר כך תוכלו להשתמש במשאב הזה במשאב NetworkAttachmentDefinition.

אפשר לבחור כל פונקציה וירטואלית לפי ספק ה-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 מאפשר לשלוח שאילתה לגבי מצב ההקצאה של המשאב SriovNetworkNodePolicy בצומת של Distributed Cloud. היא מחזירה את ההגדרה המלאה של משאב SriovNetworkNodePolicy בצומת, וגם רשימה של פונקציות וירטואליות פעילות בצומת. השדה status.syncStatus מציין אם כל המשאבים SriovNetworkNodePolicy שהוגדרו לצומת SriovNetworkNodePolicy הוחלו בצורה תקינה.

בדוגמה הבאה אפשר לראות את מבנה המשאב:

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 Pods לרשת לוגית או פיזית אחת או יותר בצומת Distributed Cloud. הוא מבוסס על מסגרת Multus-CNI ועל הפלאגין SRIOV-CNI.

אפשר להשתמש בהערה כדי להפנות לשם של משאב SriovNetworkNodePolicy מתאים. כשיוצרים את ההערה הזו, צריך לבצע את הפעולות הבאות:

  • משתמשים במקש k8s.v1.cni.cncf.io/resourceName.
  • משתמשים בקידומת gke.io/ בערך שלה, ואחריה בשם של משאב היעד SriovNetworkNodePolicy.

בדוגמה הבאה אפשר לראות את מבנה המשאב:

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

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"
  }
}'

שדרוג משאבי NetworkAttachmentDefinition ל-Distributed Cloud 1.4.0

ב-Distributed Cloud גרסה 1.4.0, הממשק bond0 מוחלף בממשק חדש בשם gdcenet0. ממשק gdcenet0 מאפשר לכם להשתמש בכרטיס ממשק הרשת (NIC) של המארח בכל מכונה של Distributed Cloud במתקן שלכם לעומסי העבודה, תוך שמירה על הפרדה מוחלטת בין התנועה ברשת של מישור הניהול והבקרה של Distributed Cloud. כדי להשתמש בפונקציונליות הזו, צריך לבצע את השלבים שמפורטים בקטע הזה כדי להגדיר מחדש את משאבי NetworkAttachmentDefinition, ואז לפעול לפי ההוראות במאמר הגדרת רשתות ב-Distributed Cloud כדי להקצות את הרשתות ותתי-הרשתות המתאימות.

לכל אשכול של Distributed Cloud שבו פרסתם משאב אחד או יותר של NetworkAttachmentDefinition, חלים כללי ההעברה הבאים:

  • לכל משאב חדש מסוג NetworkAttachmentDefinition, משתמשים בערך gdcenet0 במקום בערך bond0 בשדה master. אם מחילים משאב שמשתמש בערך bond0 או בערך ריק בשדה הזה, Distributed Cloud מחליף את הערך ב-gdcenet0, ואז מאחסן את המשאב ומחיל אותו על האשכול.
  • לכל משאב NetworkAttachmentDefinition קיים, מחליפים את bond0 ב-gdcenet0 כערך של השדה master, ואז מחילים מחדש את המשאב על האשכול כדי לשחזר את קישוריות הרשת המלאה ל-Pods המושפעים.

מידע על השימוש במשאב הזה זמין במאמר NetworkAttachmentDefinition.

הגדרת ממשק משני ב-Pod באמצעות SR-IOV VFs

אחרי שמגדירים משאב SriovNetworkNodePolicy ומשאב NetworkAttachmentDefinition תואם, אפשר להגדיר ממשק רשת משני ב-Distributed Cloud Pod באמצעות פונקציות וירטואליות של 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

הגדרת ממשק משני ב-Pod באמצעות מנהל ההתקן MacVLAN

ב-Distributed Cloud יש גם תמיכה ביצירת ממשק רשת משני ב-Pod באמצעות מנהל ההתקן MacVLAN. רק בממשק gdcenet0 אפשר להגדיר את ההגדרה הזו, ורק ב-Pods שמריצים עומסי עבודה מבוססי-קונטיינרים.

כדי להגדיר ממשק לשימוש במנהל ההתקן MacVLAN:

  1. מגדירים משאב NetworkAttachmentDefinition כמו בדוגמה הבאה:

     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"
           }
         ]
       ...
       }
     }'
    
  2. מוסיפים הערה להגדרת Distributed Cloud Pod באופן הבא:

     apiVersion: v1
     kind: Pod
     metadata:
       name: macvlan-testpod1
       annotations:
         k8s.v1.cni.cncf.io/networks: macvlan-b400-1
    

הגדרה של ממשק משני ב-Pod באמצעות רשתות מרובות ב-Distributed Cloud

ב-Distributed Cloud אפשר ליצור ממשק רשת משני ב-Pod באמצעות התכונה 'רשתות מרובות'. כדי לעשות זאת, צריך לבצע את השלבים הבאים:

  1. מגדירים Network משאב. לדוגמה:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vlan200-network
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: vlan200-interface
      gateway4: 10.53.0.1
    
  2. מוסיפים הערה להגדרת ה-Pod של Distributed Cloud באופן הבא:

    apiVersion: v1
    kind: Pod
    metadata:
      name: myPod
      annotations:
        networking.gke.io/interfaces: [{"interfaceName":"eth1","network":"vlan200-network"}]
        networking.gke.io/default-interface: eth1
    ...
    
    

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