Cette page décrit l'opérateur Kubernetes de fonction réseau spécialisé fourni avec Google Distributed Cloud Connected. Cet opérateur implémente un ensemble de CustomResourceDefinitions (CRD) qui permettent à Distributed Cloud Connected d'exécuter des charges de travail hautes performances.
L'opérateur de fonction réseau vous permet d'effectuer les opérations suivantes :
- Interroge un nœud pour connaître les appareils réseau existants.
- Interrogez l'adresse IP et l'état de la liaison physique pour chaque périphérique réseau d'un nœud.
- Provisionnez des interfaces réseau supplémentaires sur un nœud.
- Configurez les fonctionnalités système de bas niveau sur la machine physique du nœud requises pour prendre en charge les charges de travail hautes performances.
Profils d'opérateur de fonction réseau
Distributed Cloud Connected fournit les fonctionnalités suivantes pour l'opérateur de fonctions réseau :
Les fonctions d'automatisation du réseau vous permettent d'automatiser la configuration de la mise en réseau des pods de votre charge de travail.
Les fonctions d'exportation d'état vous permettent d'exporter les états du réseau hôte vers l'utilisateur, y compris la configuration et l'état de l'interface réseau.
Les fonctions Webhook vous permettent de valider les entrées utilisateur.
Prérequis
L'opérateur de fonction réseau récupère la configuration réseau à partir de l'API Distributed Cloud Edge Network.
Pour ce faire, vous devez attribuer le rôle Lecteur de réseau Edge (roles/edgenetwork.viewer) au compte de service de l'opérateur de fonctions réseau à l'aide de la commande suivante :
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]"
Remplacez les éléments suivants :
ZONE_PROJECT_IDpar l'ID du projet Google Cloud qui contient les ressources de l'API Distributed Cloud Edge Network.- Remplacez
CLUSTER_PROJECT_IDpar l'ID du projet Google Cloud qui contient le cluster connecté Distributed Cloud cible.
Ressources pour les opérateurs de fonctions réseau
L'opérateur de fonction réseau connectée Distributed Cloud implémente les CRD Kubernetes suivants :
Network: définit un réseau virtuel que les pods peuvent utiliser pour communiquer avec des ressources internes et externes. Vous devez créer le VLAN correspondant à l'aide de l'API Distributed Cloud Edge Network avant de le spécifier dans cette ressource. Pour obtenir des instructions, consultez Créer un sous-réseau.NetworkInterfaceState: permet de découvrir les états des interfaces réseau et d'interroger une interface réseau pour connaître l'état de la liaison et l'adresse IP.NodeSystemConfigUpdate: permet de configurer des fonctionnalités système de bas niveau telles que les options du noyau et les indicateursKubelet.NetworkAttachmentDefinition: vous permet d'associer des pods Distributed Cloud à un ou plusieurs réseaux logiques ou physiques sur votre nœud Distributed Cloud connecté. Vous devez créer le VLAN correspondant à l'aide de l'API Distributed Cloud Edge Network avant de le spécifier dans cette ressource. Pour obtenir des instructions, consultez Créer un sous-réseau.
L'opérateur de fonction réseau vous permet également de définir des interfaces réseau secondaires.
Ressource Network
La ressource Network définit un réseau virtuel au sein de votre déploiement Distributed Cloud connecté. Les pods de votre cluster Distributed Cloud connecté peuvent l'utiliser pour communiquer avec des ressources internes et externes.
La ressource Network fournit les paramètres configurables suivants pour l'interface réseau exposée en tant que champs accessibles en écriture :
spec.type: spécifie la couche de transport réseau pour ce réseau. La seule valeur valide estL2. Vous devez également spécifier une valeurnodeInterfaceMatcher.interfaceName.spec.nodeInterfaceMatcher.interfaceName: nom de l'interface réseau physique sur le nœud Distributed Cloud connecté cible à utiliser avec ce réseau.spec.gateway4: adresse IP de la passerelle réseau pour ce réseau.spec.l2NetworkConfig.prefixLength4: spécifie la plage CIDR pour ce réseau.annotations.networking.gke.io/gdce-per-node-ipam-size: spécifie la taille du masque de sous-réseau pour un nœud individuel. Si cette valeur est omise, la taille du masque de sous-réseau est définie sur la valeur du champcluster-cidr-config-per-node-mask-sizedans le fichier ConfigMapnf-operator-defaultsde l'espace de nomsnf-operator.annotations.networking.gke.io/gke-gateway-clusterip-cidr: spécifie un bloc CIDR pour accéder aux clusters via la passerelle Connect. Utilisé parCoreDNSsur les interfaces réseau secondaires.annotations.networking.gke.io/gke-gateway-pod-cidr: spécifie un bloc CIDR pour un pod pouvant être alloué sur des interfaces réseau secondaires.annotations.networking.gke.io/gdce-vlan-id: spécifie l'ID de VLAN pour ce réseau.annotations.networking.gke.io/gdce-vlan-mtu: (facultatif) spécifie la valeur MTU pour ce réseau. Si elle est omise, elle hérite de la valeur MTU de l'interface parente.annotations.networking.gke.io/gdce-lb-service-vip-cidr: spécifie la plage d'adresses IP virtuelles pour le service d'équilibrage de charge. La valeur peut être un bloc CIDR ou une valeur de plage d'adresses explicite. Cette annotation est obligatoire pour l'équilibrage de charge de couche 3 et facultative pour l'équilibrage de charge de couche 2.
L'exemple suivant illustre la structure de la 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
Pour spécifier plusieurs plages d'adresses IP virtuelles pour le service d'équilibrage de charge, utilisez l'annotation networking.gke.io/gdce-lb-service-vip-cidrs. Vous pouvez fournir les valeurs de cette annotation sous forme de liste séparée par des virgules ou de charge utile JSON.
Exemple :
[
{
"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
}
]
Si vous choisissez d'utiliser une charge utile JSON, nous vous recommandons d'utiliser le format JSON condensé. Exemple :
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
N'oubliez pas que le champ autoAssign est défini par défaut sur false s'il est omis.
Ressource NetworkInterfaceState
La ressource NetworkInterfaceState est une ressource en lecture seule qui vous permet de découvrir les interfaces réseau physiques sur le nœud et de collecter des statistiques d'exécution sur le trafic réseau qui transite par ces interfaces.
Distributed Cloud crée une ressource NetworkInterfaceState pour chaque nœud d'un cluster.
La configuration par défaut des machines Distributed Cloud connectées inclut une interface réseau agrégée nommée uplink0. Cette interface lie les interfaces réseau eno1np0 et eno2np1. Chacune d'elles est connectée à un commutateur ToR Distributed Cloud, respectivement.
La ressource NetworkInterfaceState fournit les catégories suivantes d'informations sur l'interface réseau, qui sont exposées sous forme de champs d'état en lecture seule.
Informations générales :
status.interfaces.ifname: nom de l'interface réseau cible.status.lastReportTime: date et heure du dernier rapport d'état pour l'interface cible.
Informations sur la configuration de l'adresse IP :
status.interfaces.interfaceinfo.address: adresse IP attribuée à l'interface cible.status.interfaces.interfaceinfo.dns: adresse IP du serveur DNS attribuée à l'interface cible.status.interfaces.interfaceinfo.gateway: adresse IP de la passerelle réseau desservant l'interface cible.status.interfaces.interfaceinfo.prefixlen: longueur du préfixe IP.
Informations sur le matériel :
status.interfaces.linkinfo.broadcast: adresse MAC de diffusion de l'interface cible.status.interfaces.linkinfo.businfo: chemin d'accès à l'appareil PCIe au formatbus:slot.function.status.interfaces.linkinfo.flags: indicateurs d'interface (par exemple,BROADCAST).status.interfaces.linkinfo.macAddress: adresse MAC Unicast de l'interface cible.status.interfaces.linkinfo.mtu: valeur MTU de l'interface cible.
Statistiques de réception :
status.interfaces.statistics.rx.bytes: nombre total d'octets reçus par l'interface cible.status.interfaces.statistics.rx.dropped: nombre total de paquets supprimés par l'interface cible.status.interfaces.statistics.rx.errors: nombre total d'erreurs de réception de paquets pour l'interface cible.status.interfaces.statistics.rx.multicast: nombre total de paquets multicast reçus par l'interface cible.status.interfaces.statistics.rx.overErrors: nombre total d'erreurs de réception de paquets pour l'interface cible.status.interfaces.statistics.rx.packets: nombre total de paquets reçus par l'interface cible.
Statistiques de transmission :
status.interfaces.statistics.tx.bytes: nombre total d'octets transmis par l'interface cible.status.interfaces.statistics.tx.carrierErrors: nombre total d'erreurs de transporteur rencontrées par l'interface cible.status.interfaces.statistics.tx.collisions: nombre total de collisions de paquets rencontrées par l'interface cible.status.interfaces.statistics.tx.dropped: nombre total de paquets supprimés par l'interface cible.status.interfaces.statistics.tx.errors: nombre total d'erreurs de transmission pour l'interface cible.status.interfaces.statistics.tx.packets: nombre total de paquets transmis par l'interface cible.
L'exemple suivant illustre la structure de la 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"
Configurer une interface secondaire sur un pod à l'aide du multiréseau Distributed Cloud
Distributed Cloud Connected permet de créer une interface réseau secondaire sur un pod à l'aide de sa fonctionnalité multiréseau. Pour ce faire, procédez comme suit :
Configurez une ressource
Network. Exemple :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: 27L'annotation
networking.gke.io/gdce-lb-service-vip-cidrsspécifie un ou plusieurs pools d'adresses IP pour ce réseau virtuel. La première moitié du CIDR que vous spécifiez ici doit inclure les adresses IP virtuelles de service (SVIP). Distributed Cloud connecté applique cette exigence par le biais de vérifications de webhook comme suit :- La plage d'adresses IP virtuelles de service doit être comprise dans la plage CIDR du VLAN correspondant.
- La plage d'adresses IP SVIP ne peut s'étendre que sur la première moitié de la plage CIDR du VLAN.
Ajoutez une annotation à la définition de votre pod Distributed Cloud comme suit :
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: eth1Cette annotation configure l'interface
eth0comme principale et l'interfaceeth1comme secondaire avec l'équilibrage de charge de couche 2 avec MetalLB.
La configuration de votre interface secondaire, comme décrit dans cette section, entraîne la création automatique des ressources personnalisées suivantes :
- Une ressource
IPAddressPool, qui permet l'attribution automatique d'adresses SVIP aux pods. Exemple :
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
- Ressource
L2Advertisementqui permet de diffuser des annonces pour les adresses SVIP spécifiées. Exemple :
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2advertise-410
namespace: kube-system
spec:
ipAddressPools:
- test-410-pool
interfaces:
- gdcenet0.410
## Étapes suivantes