Auf dieser Seite wird der spezielle Kubernetes-Operator für Netzwerkfunktionen beschrieben, der in Google Distributed Cloud Connected enthalten ist. Dieser Operator implementiert eine Reihe von CustomResourceDefinitions (CRDs), die es Distributed Cloud Connected ermöglichen, leistungsstarke Arbeitslasten auszuführen.
Mit dem Network Function-Operator haben Sie folgende Möglichkeiten:
- Vorhandene Netzwerkgeräte auf einem Knoten abfragen.
- Fragen Sie den Status der IP-Adresse und der physischen Verbindung für jedes Netzwerkgerät auf einem Knoten ab.
- Stellen Sie zusätzliche Netzwerkschnittstellen auf einem Knoten bereit.
- Konfigurieren Sie die erforderlichen Systemfunktionen auf niedriger Ebene auf der physischen Maschine des Knotens, um Hochleistungs-Arbeitslasten zu unterstützen.
Betreiberprofile für Netzwerkfunktionen
Distributed Cloud Connected bietet die folgenden Funktionen für Netzwerkfunktionsbetreiber:
Mit Netzwerkautomatisierungsfunktionen können Sie die Konfiguration des Pod-Netzwerks Ihrer Arbeitslast automatisieren.
Mit Funktionen zum Exportieren des Status können Sie Hostnetzwerkstatus für den Nutzer exportieren, einschließlich der Konfiguration und des Status der Netzwerkschnittstelle.
Mit Webhook-Funktionen können Sie Nutzereingaben validieren.
Vorbereitung
Der Network Function-Operator ruft die Netzwerkkonfiguration über die Distributed Cloud Edge Network API ab.
Dazu müssen Sie dem Dienstkonto des Netzwerkfunktionsoperators mit dem folgenden Befehl die Rolle „Edge Network Viewer“ (roles/edgenetwork.viewer) zuweisen:
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]"
Ersetzen Sie Folgendes:
ZONE_PROJECT_IDdurch die ID des Google Cloud Projekts, das die Distributed Cloud Edge Network API-Ressourcen enthält.CLUSTER_PROJECT_IDdurch die ID des Google Cloud Projekts, das den verbundenen Zielcluster von Distributed Cloud enthält.
Ressourcen für den Betrieb von Netzwerkfunktionen
Der Operator für verbundene Netzwerkfunktionen von Distributed Cloud implementiert die folgenden Kubernetes-CRDs:
Network: Definiert ein virtuelles Netzwerk, das Pods für die Kommunikation mit internen und externen Ressourcen verwenden können. Sie müssen das entsprechende VLAN mit der Distributed Cloud Edge Network API erstellen, bevor Sie es in dieser Ressource angeben. Eine Anleitung finden Sie unter Subnetzwerk erstellen.NetworkInterfaceState: Ermöglicht die Ermittlung von Netzwerkschnittstellenstatus und das Abfragen einer Netzwerkschnittstelle nach dem Linkstatus und der IP-Adresse.NodeSystemConfigUpdate: Ermöglicht die Konfiguration von Low-Level-Systemfunktionen wie Kernel-Optionen undKubelet-Flags.NetworkAttachmentDefinition: Hiermit können Sie Distributed Cloud-Pods an ein oder mehrere logische oder physische Netzwerke auf Ihrem mit Distributed Cloud verbundenen Knoten anhängen. Sie müssen das entsprechende VLAN mit der Distributed Cloud Edge Network API erstellen, bevor Sie es in dieser Ressource angeben. Eine Anleitung finden Sie unter Subnetzwerk erstellen.
Mit dem Network Function-Operator können Sie auch sekundäre Netzwerkschnittstellen definieren.
Network-Ressource
Mit der Network-Ressource wird ein virtuelles Netzwerk in Ihrer mit Distributed Cloud verbundenen Bereitstellung definiert, das Pods in Ihrem mit Distributed Cloud verbundenen Cluster verwenden können, um mit internen und externen Ressourcen zu kommunizieren.
Die Network-Ressource bietet die folgenden konfigurierbaren Parameter für die Netzwerkschnittstelle, die als beschreibbare Felder verfügbar sind:
spec.type: Gibt die Netzwerktransportschicht für dieses Netzwerk an. Der einzige gültige Wert istL2. Sie müssen auch einennodeInterfaceMatcher.interfaceName-Wert angeben.spec.nodeInterfaceMatcher.interfaceName: Der Name der physischen Netzwerkschnittstelle auf dem Zielknoten von Distributed Cloud Connected, die mit diesem Netzwerk verwendet werden soll.spec.gateway4: die IP-Adresse des Netzwerk-Gateways für dieses Netzwerk.spec.l2NetworkConfig.prefixLength4: Gibt den CIDR-Bereich für dieses Netzwerk an.annotations.networking.gke.io/gdce-per-node-ipam-size: gibt die Größe der Subnetzmaske für einen einzelnen Knoten an. Wenn diese Angabe fehlt, wird die Größe der Subnetzmaske auf den Wert des Feldscluster-cidr-config-per-node-mask-sizein der ConfigMapnf-operator-defaultsim Namespacenf-operatorfestgelegt.annotations.networking.gke.io/gke-gateway-clusterip-cidr: Gibt einen CIDR-Block für den Zugriff auf Cluster über das Connect-Gateway an. Dies wird vonCoreDNSauf sekundären Netzwerkschnittstellen verwendet.annotations.networking.gke.io/gke-gateway-pod-cidr: Gibt einen CIDR-Block für einen Pod an, der auf sekundären Netzwerkschnittstellen zugewiesen werden kann.annotations.networking.gke.io/gdce-vlan-id: Gibt die VLAN-ID für dieses Netzwerk an.annotations.networking.gke.io/gdce-vlan-mtu: (optional) Gibt den MTU-Wert für dieses Netzwerk an. Wird kein Wert angegeben, wird der MTU-Wert von der übergeordneten Schnittstelle übernommen.annotations.networking.gke.io/gdce-lb-service-vip-cidr: Gibt den Bereich der virtuellen IP-Adressen für den Load-Balancing-Dienst an. Der Wert kann ein CIDR-Block oder ein expliziter Adressbereich sein. Diese Anmerkung ist für Layer 3-Load-Balancing obligatorisch und für Layer 2-Load-Balancing optional.
Das folgende Beispiel veranschaulicht die Struktur der Ressource:
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
Wenn Sie mehrere Bereiche virtueller IP-Adressen für den Load-Balancing-Dienst angeben möchten, verwenden Sie die Annotation networking.gke.io/gdce-lb-service-vip-cidrs. Sie können die Werte für diese Annotation entweder als durch Kommas getrennte Liste oder als JSON-Nutzlast angeben.
Beispiel:
[
{
"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
}
]
Wenn Sie eine JSON-Nutzlast verwenden, empfehlen wir das komprimierte JSON-Format. Beispiel:
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
Wenn das Feld autoAssign weggelassen wird, wird standardmäßig false verwendet.
NetworkInterfaceState-Ressource
Die NetworkInterfaceState-Ressource ist schreibgeschützt. Mit ihr können Sie physische Netzwerkschnittstellen auf dem Knoten ermitteln und Laufzeitstatistiken zum Netzwerkverkehr erfassen, der über diese Schnittstellen fließt.
Distributed Cloud erstellt für jeden Knoten in einem Cluster eine NetworkInterfaceState-Ressource.
Die Standardkonfiguration von mit Distributed Cloud verbundenen Maschinen umfasst eine gebundene Netzwerkschnittstelle namens uplink0. Diese Schnittstelle fasst die Netzwerkschnittstellen eno1np0 und eno2np1 zusammen. Jeder ist mit einem Distributed Cloud-ToR-Switch verbunden.
Die NetworkInterfaceState-Ressource enthält die folgenden Kategorien von Informationen zur Netzwerkschnittstelle, die als schreibgeschützte Statusfelder verfügbar sind.
Allgemeine Informationen:
status.interfaces.ifname: Der Name der Zielnetzwerkschnittstelle.status.lastReportTime: Die Uhrzeit und das Datum des letzten Statusberichts für die Ziel-Schnittstelle.
Informationen zur Konfiguration von IP-Adressen:
status.interfaces.interfaceinfo.address: die IP-Adresse, die der Ziel-Schnittstelle zugewiesen ist.status.interfaces.interfaceinfo.dns: die IP-Adresse des DNS-Servers, der der Ziel-Schnittstelle zugewiesen ist.status.interfaces.interfaceinfo.gateway: die IP-Adresse des Netzwerk-Gateways, das die Zielschnittstelle bedient.status.interfaces.interfaceinfo.prefixlen: die Länge des IP-Präfixes.
Hardwareinformationen:
status.interfaces.linkinfo.broadcast: die Broadcast-MAC-Adresse der Ziel-Schnittstelle.status.interfaces.linkinfo.businfo: Der PCIe-Gerätepfad im Formatbus:slot.function.status.interfaces.linkinfo.flags: die Schnittstellen-Flags, z. B.BROADCAST.status.interfaces.linkinfo.macAddress: die Unicast-MAC-Adresse der Ziel-Schnittstelle.status.interfaces.linkinfo.mtu: Der MTU-Wert für die Ziel-Schnittstelle.
Statistiken zu erhaltenen Präsentationen:
status.interfaces.statistics.rx.bytes: Die Gesamtzahl der Byte, die von der Ziel-Schnittstelle empfangen wurden.status.interfaces.statistics.rx.dropped: Die Gesamtzahl der Pakete, die von der Ziel-Schnittstelle verworfen wurden.status.interfaces.statistics.rx.errors: Die Gesamtzahl der Paketempfangsfehler für die Ziel-Schnittstelle.status.interfaces.statistics.rx.multicast: die Gesamtzahl der Multicast-Pakete, die von der Ziel-Schnittstelle empfangen wurden.status.interfaces.statistics.rx.overErrors: Die Gesamtzahl der empfangenen Pakete über Fehler für die Ziel-Schnittstelle.status.interfaces.statistics.rx.packets: Die Gesamtzahl der Pakete, die von der Ziel-Schnittstelle empfangen wurden.
Übertragungsstatistiken:
status.interfaces.statistics.tx.bytes: Die Gesamtzahl der von der Ziel-Schnittstelle übertragenen Byte.status.interfaces.statistics.tx.carrierErrors: die Gesamtzahl der von der Zielschnittstelle erkannten Carrier-Fehler.status.interfaces.statistics.tx.collisions: Die Gesamtzahl der Paketkollisionen, die an der Ziel-Schnittstelle aufgetreten sind.status.interfaces.statistics.tx.dropped: Die Gesamtzahl der Pakete, die von der Ziel-Schnittstelle verworfen wurden.status.interfaces.statistics.tx.errors: Die Gesamtzahl der Übertragungsfehler für die Ziel-Schnittstelle.status.interfaces.statistics.tx.packets: Die Gesamtzahl der vom Zielinterface übertragenen Pakete.
Das folgende Beispiel veranschaulicht die Struktur der Ressource:
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"
Sekundäre Schnittstelle für einen Pod mit Distributed Cloud Multi-Networking konfigurieren
Distributed Cloud Connected unterstützt das Erstellen einer sekundären Netzwerkschnittstelle auf einem Pod mithilfe der Multi-Netzwerk-Funktion. Führen Sie dazu die folgenden Schritte aus:
Network-Ressource konfigurieren Beispiel: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: 27Die Annotation
networking.gke.io/gdce-lb-service-vip-cidrsgibt einen oder mehrere IP-Adresspools für dieses virtuelle Netzwerk an. Die erste Hälfte des hier angegebenen CIDR muss virtuelle Dienst-IP-Adressen (Service Virtual IP, SVIP) enthalten. Distributed Cloud Connected erzwingt diese Anforderung durch Webhook-Prüfungen:- Der SVIP-Adressbereich muss sich im entsprechenden VLAN-CIDR-Bereich befinden.
- Der SVIP-Adressbereich kann nur bis zur ersten Hälfte des VLAN-CIDR-Bereichs reichen.
Fügen Sie der Pod-Definition für Distributed Cloud eine Annotation wie folgt hinzu:
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: eth1Mit dieser Annotation wird die
eth0-Schnittstelle als primäre und dieeth1-Schnittstelle als sekundäre Schnittstelle mit Layer 2-Load-Balancing mit MetalLB konfiguriert.
Wenn Sie Ihre sekundäre Schnittstelle wie in diesem Abschnitt beschrieben konfigurieren, werden die folgenden benutzerdefinierten Ressourcen automatisch erstellt:
- Eine
IPAddressPool-Ressource, die die automatische Zuweisung von SVIP-Adressen zu Pods ermöglicht. Beispiel:
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
- Eine
L2Advertisement-Ressource, die die Werbung für die angegebenen SVIP-Adressen ermöglicht. Beispiel:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2advertise-410
namespace: kube-system
spec:
ipAddressPools:
- test-410-pool
interfaces:
- gdcenet0.410
## Weitere Informationen