Opérateur de fonction réseau

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.
  • Utilisez la virtualisation des entrées/sorties à racine unique (SR-IOV) sur les interfaces réseau PCI Express pour les virtualiser en plusieurs interfaces virtuelles. Vous pouvez ensuite configurer vos charges de travail connectées Distributed Cloud pour qu'elles utilisent ces interfaces réseau virtuelles.

La prise en charge de SR-IOV connectée au Distributed Cloud est basée sur les projets Open Source suivants :

Profils d'opérateur de fonction réseau

Distributed Cloud connecté fournit les profils de fonctionnalité d'opérateur de fonction réseau suivants sur chaque facteur de forme Distributed Cloud connecté :

  • Les racks connectés Distributed Cloud sont compatibles avec le profil complet de fonctionnalités de l'opérateur de fonctions réseau, y compris les fonctionnalités suivantes :

    • 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. par exemple, la configuration de l'appairage BGP et des interfaces réseau secondaires.

    • 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 de configuration des nœuds vous permettent d'affiner les performances d'un nœud pour répondre aux besoins de votre entreprise, y compris l'isolation du processeur, les pages énormes, le noyau en temps réel, les paramètres kubelet et sysctl.

    • Les fonctions de gestion de l'alimentation vous permettent de gérer la consommation d'énergie sur un nœud, y compris les états P et les états C des processeurs isolés.

    • Les fonctions Webhook vous permettent de valider les entrées utilisateur.

    • Les fonctions Divers incluent l'outil d'automatisation SR-IOV qui configure automatiquement l'opérateur SR-IOV.

  • Les serveurs connectés Distributed Cloud sont compatibles avec le profil de fonctionnalité de l'opérateur de fonction réseau optimisé pour les performances, qui inclut les fonctionnalités suivantes :

    • 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. par exemple, la configuration de l'appairage BGP et des interfaces réseau secondaires.

    • 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_ID par l'ID du projet Google Cloud qui contient les ressources de l'API Distributed Cloud Edge Network.
  • Remplacez CLUSTER_PROJECT_ID par 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 indicateurs Kubelet.
  • SriovNetworkNodePolicy : sélectionne un groupe d'interfaces réseau virtualisées SR-IOV et instancie le groupe en tant que ressource Kubernetes. Vous pouvez utiliser cette ressource dans une ressource NetworkAttachmentDefinition.
  • SriovNetworkNodeState : vous permet d'interroger l'état de provisionnement de la ressource SriovNetworkNodePolicy sur un nœud Distributed Cloud.
  • 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 qui n'utilisent pas de fonctions virtuelles SR-IOV.

Ressource Network

La ressource Network définit un réseau virtuel dans le rack connecté Distributed Cloud que les pods de votre cluster connecté Distributed Cloud peuvent 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 est L2. Vous devez également spécifier une valeur nodeInterfaceMatcher.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 champ cluster-cidr-config-per-node-mask-size dans le fichier ConfigMap nf-operator-defaults de l'espace de noms nf-operator.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr : spécifie un bloc CIDR pour accéder aux clusters via la passerelle Connect. Utilisé par CoreDNS sur 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 connectées Distributed Cloud inclut une interface réseau agrégée sur la carte fille réseau de sélection du rack (rNDC, Rack Select Network Daughter Card) nommée gdcenet0. 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 format bus: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"

Ressource NodeSystemConfigUpdate

La ressource NodeSystemConfigUpdate vous permet de modifier la configuration du système d'exploitation du nœud et les indicateurs Kubelet. Les modifications autres que celles apportées à sysctl nécessitent le redémarrage d'un nœud. Cette ressource n'est pas disponible sur les déploiements de serveurs connectés Distributed Cloud.

Lorsque vous instanciez cette ressource, vous devez spécifier les nœuds cibles dans le champ nodeSelector. Vous devez inclure toutes les paires clé/valeur pour chaque nœud cible dans le champ nodeSelector. Lorsque vous spécifiez plusieurs nœuds cibles dans ce champ, ils sont mis à jour un par un.

ATTENTION : Le champ nodeName est obsolète. Son utilisation immédiate redémarre les nœuds cibles, y compris les nœuds du plan de contrôle local, ce qui peut interrompre les charges de travail critiques.

La ressource NodeSystemConfigUpdate fournit les champs de configuration suivants spécifiques à Distributed Cloud connected :

  • spec.containerRuntimeDNSConfig.ip : spécifie une liste d'adresses IP pour les registres d'images privées.
  • spec.containerRuntimeDNSConfig : spécifie une liste d'entrées DNS personnalisées utilisées par l'environnement d'exécution de conteneurs sur chaque nœud Distributed Cloud connecté. Chaque entrée se compose des champs suivants :

    • ip : spécifie l'adresse IPv4 cible.
    • domain : spécifie le domaine correspondant.
    • interface : spécifie l'interface de sortie réseau par laquelle l'adresse IP spécifiée dans le champ ip est accessible. Vous pouvez spécifier une interface définie par les ressources suivantes : CustomNetworkInterfaceConfig, Network (par annotation), NetworkAttachmentDefinition (par annotation).
  • spec.kubeletConfig.cpuManagerPolicy : spécifie la règle Kubernetes CPUManager. Les valeurs valides sont None et Static.

  • spec.kubeletConfig.topologyManagerPolicy : spécifie la règle TopologyManager de Kubernetes. Les valeurs valides sont None, BestEffort, Restricted et SingleNumaMode.

  • spec.osConfig.cgroupConfig.noKernelMemory : exclut la mémoire de l'espace du noyau du calcul de l'utilisation de la mémoire du pod. Les valeurs valides sont true et false.

  • spec.osConfig.hugePagesConfig : spécifie la configuration des pages énormes par nœud NUMA. Les valeurs valides sont 2MB et 1GB. Le nombre de pages énormes demandées est réparti de manière égale entre les deux nœuds NUMA du système. Par exemple, si vous allouez 16 pages énormes de 1 Go chacune, chaque nœud reçoit une pré-allocation de 8 Go.

  • spec.osConfig.isolatedCpusPerSocket : spécifie le nombre de processeurs isolés par socket. Obligatoire si cpuManagerPolicy est défini sur Static. Le nombre maximal de processeurs isolés doit être inférieur à 80 % du nombre total de processeurs du nœud.

  • spec.osConfig.cpuIsolationPolicy : spécifie la stratégie d'isolation du processeur. La règle Default isole uniquement les tâches systemd des processeurs réservés aux charges de travail. La règle Kernel marque les processeurs comme isolcpus et définit les indicateurs rcu_nocb, nohz_full et rcu_nocb_poll sur chaque processeur. La règle KernelOptimized marque les processeurs comme isolcpus et définit les indicateurs rcu_nocb et rcu_nocb_poll sur chaque processeur, mais pas l'indicateur nohz_full.

  • spec.sysctls.NodeLevel : spécifie les paramètres sysctls que vous pouvez configurer globalement sur un nœud à l'aide de l'opérateur de fonction réseau. Les paramètres configurables sont les suivants :

    • 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

    Vous pouvez également définir des paramètres sysctls sécurisés et non sécurisés pour un pod ou un espace de noms spécifique à l'aide du plug-in CNI (Container Networking Interface) tuning.

La ressource NodeSystemConfigUpdate fournit les champs d'état généraux en lecture seule suivants :

  • status.lastReportTime : date et heure de la dernière mise à jour de l'état de l'interface cible.
  • status.conditions.lastTransitionTime : date et heure de la dernière modification de l'état de l'interface.
  • status.conditions.observedGeneration : indique la valeur .metadata.generation sur laquelle la condition initiale était basée.
  • status.conditions.message : message informatif décrivant le changement d'état de l'interface.
  • status.conditions.reason : identifiant programmatique indiquant la raison de la dernière modification de l'état de l'interface.
  • status.conditions.status : descripteur d'état de la condition. Les valeurs valides sont True, False et Unknown.
  • status.conditions.type : type de condition au format camelCase.

L'exemple suivant illustre la structure de la ressource :

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

Ressource SriovNetworkNodePolicy

La ressource SriovNetworkNodePolicy vous permet d'allouer un groupe de fonctions virtuelles (VF) SR-IOV sur une machine physique connectée à Distributed Cloud et d'instancier ce groupe en tant que ressource Kubernetes. Vous pouvez ensuite utiliser cette ressource dans une ressource NetworkAttachmentDefinition. Cette ressource n'est pas disponible pour les déploiements de serveurs Distributed Cloud connectés.

Vous pouvez sélectionner chaque VF cible en fonction de son ID de fournisseur et d'appareil PCIe, de ses adresses d'appareil PCIe ou de son nom d'appareil énuméré Linux. L'opérateur réseau SR-IOV configure chaque interface réseau physique pour provisionner les VF cibles. Cela inclut la mise à jour du micrologiciel de l'interface réseau, la configuration du pilote du noyau Linux et le redémarrage de la machine connectée Distributed Cloud, si nécessaire.

Pour découvrir les interfaces réseau disponibles sur votre nœud, vous pouvez rechercher les ressources NetworkInterfaceState sur ce nœud dans l'espace de noms nf-operator.

L'exemple suivant illustre la structure de la ressource :

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

L'exemple précédent crée un maximum de 31 VF à partir du deuxième port de l'interface réseau nommée enp134s0f1np1 avec une valeur MTU de 9000 (la valeur maximale autorisée). Utilisez le libellé du sélecteur de nœuds edgecontainer.googleapis.com/network-sriov.capable, qui est présent sur tous les nœuds connectés Distributed Cloud compatibles avec SR-IOV.

Pour en savoir plus sur l'utilisation de cette ressource, consultez SriovNetworkNodeState.

Ressource SriovNetworkNodeState

La ressource en lecture seule SriovNetworkNodeState vous permet d'interroger l'état de provisionnement de la ressource SriovNetworkNodePolicy sur un nœud connecté Distributed Cloud. Il renvoie la configuration complète de la ressource SriovNetworkNodePolicy sur le nœud, ainsi qu'une liste des VF actifs sur le nœud. Le champ status.syncStatus indique si toutes les ressources SriovNetworkNodePolicy définies pour le nœud ont été correctement appliquées. Cette ressource n'est pas disponible sur les déploiements de serveurs connectés Distributed Cloud.

L'exemple suivant illustre la structure de la ressource :

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

Pour en savoir plus sur l'utilisation de cette ressource, consultez SriovNetworkNodeState.

Ressource NetworkAttachmentDefinition

La ressource NetworkAttachmentDefinition vous permet d'associer des pods Distributed Cloud à un ou plusieurs réseaux logiques ou physiques sur votre nœud connecté Distributed Cloud. Il s'appuie sur le framework Multus-CNI et les plug-ins suivants :

Utilisez une annotation pour référencer le nom de la ressource SriovNetworkNodePolicy appropriée. Lorsque vous créez cette annotation, procédez comme suit :

  • Utilisez la clé k8s.v1.cni.cncf.io/resourceName.
  • Utilisez le préfixe gke.io/ dans sa valeur, suivi du nom de la ressource SriovNetworkNodePolicy cible.

Utilisez l'annotation networking.gke.io/gdce-vlan-id pour spécifier l'ID de VLAN du réseau cible. Cette annotation est obligatoire.

Les exemples suivants illustrent la structure de la ressource. Pour la mise en réseau 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"
  }
}'

Pour la mise en réseau 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"
  }
}'

Configurer une interface secondaire sur un pod à l'aide de VF SR-IOV

Après avoir configuré une ressource SriovNetworkNodePolicy et une ressource NetworkAttachmentDefinition correspondante, vous pouvez configurer une interface réseau secondaire sur un pod Distributed Cloud à l'aide de fonctions virtuelles SR-IOV.

Pour ce faire, ajoutez une annotation à la définition de votre pod Distributed Cloud comme suit :

  • Clé : k8s.v1.cni.cncf.io/networks
  • Valeur : nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...

L'exemple suivant illustre cette annotation :

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

Configurer une interface secondaire sur un pod à l'aide du pilote MacVLAN

Distributed Cloud Connected permet également de créer une interface réseau secondaire sur un pod à l'aide du pilote MacVLAN. Seule l'interface gdcenet0 est compatible avec cette configuration, et uniquement sur les pods qui exécutent des charges de travail conteneurisées.

Pour configurer une interface afin qu'elle utilise le pilote MacVLAN :

  1. Configurez une ressource NetworkAttachmentDefinition comme indiqué dans les exemples suivants. Pour la mise en réseau 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"
           }
         ]
       ...
       }
     }'
    

    Pour la mise en réseau 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"
       }
     }'
    
  2. Ajoutez une annotation à la définition de votre pod Distributed Cloud comme suit. Pour la mise en réseau IPv4 :

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

    Pour la mise en réseau IPv6 :

     apiVersion: v1
     kind: Pod
     metadata:
       name: vlan210-1
       namespace: default
       annotations:
         k8s.v1.cni.cncf.io/networks: default/macvlan-bond0-210-den402
    

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 :

  1. 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: 27
    

    L'annotation networking.gke.io/gdce-lb-service-vip-cidrs spé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.
  2. 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: eth1
    

    Cette annotation configure l'interface eth0 comme principale et l'interface eth1 comme 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 L2Advertisement qui 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