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

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

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

  • שליחת בקשת מידע על מכשירי רשת קיימים בצומת.
  • שאילתה של כתובת ה-IP ומצב הקישור הפיזי של כל מכשיר רשת בצומת.
  • הקצאת ממשקי רשת נוספים בצומת.
  • הגדרה של תכונות מערכת ברמה נמוכה במכונה הפיזית של הצומת שנדרשות לתמיכה בעומסי עבודה עם ביצועים גבוהים.

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

‫Distributed Cloud במודל מחובר מספק את הפונקציות הבאות של Network Function operator:

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

  • פונקציות ייצוא המצב מאפשרות לייצא את מצבי הרשת של המארח למשתמש, כולל הגדרות ומצב של ממשק הרשת.

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

מפעיל פונקציית הרשת מאפשר גם להגדיר ממשקי רשת משניים.

משאב 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 ב-ConfigMap‏ nf-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 משאב לכל צומת באשכול.

הגדרת ברירת המחדל של מכונות Google Distributed Cloud במודל מחובר כוללת ממשק רשת מאוגד בשם uplink0. הממשק הזה מאגד את ממשקי הרשת 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"

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

‫Distributed Cloud connected תומך ביצירת ממשק רשת משני בתרמיל באמצעות התכונה multi-network. כדי לעשות זאת, צריך לבצע את השלבים הבאים:

  1. מגדירים 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 שאתם מציינים כאן צריך להיות קבוצת משנה של החצי הראשון של ה-CIDR של ה-VLAN ברשת. ב-Distributed Cloud במודל מחובר, הדרישה הזו נאכפת באמצעות בדיקות של webhook באופן הבא:

    • טווח כתובות ה-IP הווירטואליות של השירות (SVIP) צריך להיות בתוך טווח ה-CIDR של ה-VLAN המתאים.
    • טווח הכתובות של ה-SVIP יכול לכלול רק עד מחצית מטווח ה-CIDR של ה-VLAN.
  2. מוסיפים הערה להגדרת ה-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
    

    כשמספקים את האנוטציה הזו למשאב Network, מתבצעת הגדרה אוטומטית של איזון עומסים בשכבה 2 באמצעות MetalLB. ההערה הזו מגדירה את הממשק 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

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