Operatore di funzioni di rete

Questa pagina descrive l'operatore Kubernetes della funzione di rete specializzata fornito con Google Distributed Cloud connesso. Questo operatore implementa un insieme di CustomResourceDefinitions (CRD) che consentono a Distributed Cloud connesso di eseguire workload ad alte prestazioni.

L'operatore della funzione di rete e la funzionalità SR-IOV non sono disponibili sui server Distributed Cloud connesso.

L'operatore della funzione di rete consente di:

  • Eseguire il polling dei dispositivi di rete esistenti su un nodo.
  • Eseguire query sull'indirizzo IP e sullo stato del collegamento fisico per ogni dispositivo di rete su un nodo.
  • Eseguire il provisioning di interfacce di rete aggiuntive su un nodo.
  • Configurare le funzionalità di sistema di basso livello sulla macchina fisica del nodo necessarie per supportare i workload ad alte prestazioni.
  • Utilizzare la virtualizzazione di input/output a radice singola (SR-IOV) sulle interfacce di rete PCI Express per virtualizzarle in più interfacce virtuali. Puoi quindi configurare i workload Distributed Cloud connesso in modo che utilizzino queste interfacce di rete virtuali.

Il supporto di Distributed Cloud connesso per SR-IOV si basa sui seguenti progetti open source:

Prerequisiti

L'operatore della funzione di rete recupera la configurazione di rete dall'API Distributed Cloud Edge Network. Per consentirlo, devi concedere al account di servizio dell'operatore della funzione di rete il ruolo Visualizzatore rete Edge (roles/edgenetwork.viewer) utilizzando il seguente comando:

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

Sostituisci PROJECT_ID con l'ID del progetto di destinazione Google Cloud .

Risorse dell'operatore della funzione di rete

L'operatore della funzione di rete Distributed Cloud connesso implementa i seguenti CRD di Kubernetes:

  • Network. Definisce una rete virtuale che i pod possono utilizzare per comunicare con le risorse interne ed esterne. Prima di specificare la VLAN in questa risorsa, devi crearla utilizzando l'API Distributed Cloud Edge Network. Per le istruzioni, vedi Creare una rete.
  • NetworkInterfaceState. Consente di scoprire gli stati delle interfacce di rete e di eseguire query su un'interfaccia di rete per lo stato del collegamento e l'indirizzo IP.
  • NodeSystemConfigUpdate. Consente di configurare le funzionalità di sistema di basso livello, come le opzioni del kernel e i flag Kubelet.
  • SriovNetworkNodePolicy. Seleziona un gruppo di interfacce di rete virtualizzate SR-IOV e crea un'istanza del gruppo come risorsa Kubernetes. Puoi utilizzare questa risorsa in una risorsa NetworkAttachmentDefinition.
  • SriovNetworkNodeState. Consente di eseguire query sullo stato di provisioning della risorsa SriovNetworkNodePolicy su un nodo Distributed Cloud.
  • NetworkAttachmentDefinition. Consente di collegare i pod Distributed Cloud a una o più reti logiche o fisiche sul nodo Distributed Cloud connesso. Prima di specificare la VLAN in questa risorsa, devi crearla utilizzando l'API Distributed Cloud Edge Network. Per le istruzioni, vedi Creare una rete.

L'operatore della funzione di rete consente anche di definire interfacce di rete secondarie che non utilizzano le funzioni virtuali SR-IOV.

Risorsa Network

La risorsa Network definisce una rete virtuale all'interno del rack Distributed Cloud connesso che i pod all'interno del cluster Distributed Cloud connesso possono utilizzare per comunicare con le risorse interne ed esterne.

La risorsa Network fornisce i seguenti parametri configurabili per l'interfaccia di rete esposta come campi scrivibili:

  • spec.type: specifica il livello di trasporto di rete per questa rete. L'unico valore valido è L2. Devi anche specificare un valore nodeInterfaceMatcher.interfaceName.
  • spec.nodeInterfaceMatcher.interfaceName: il nome dell'interfaccia di rete fisica sul nodo Distributed Cloud connesso di destinazione da utilizzare con questa rete.
  • spec.gateway4: l'indirizzo IP del gateway di rete per questa rete.
  • spec.l2NetworkConfig.prefixLength4: specifica l'intervallo CIDR per questa rete.
  • annotations.networking.gke.io/gdce-vlan-id: specifica l'ID VLAN per questa rete.
  • annotations.networking.gke.io/gdce-vlan-mtu: (facoltativo) specifica il valore MTU per questa rete. Se omesso, eredita il valore MTU dall'interfaccia principale.
  • annotations.networking.gke.io/gdce-lb-service-vip-cidr: specifica l'intervallo di indirizzi IP virtuali per il servizio di bilanciamento del carico. Il valore può essere un blocco CIDR o un valore di intervallo di indirizzi esplicito. Questa annotazione è obbligatoria per il bilanciamento del carico di livello 3 e facoltativa per il bilanciamento del carico di livello 2.

L'esempio seguente illustra la struttura della risorsa:

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

Per specificare più intervalli di indirizzi IP virtuali per il servizio di bilanciamento del carico, utilizza l'annotazione networking.gke.io/gdce-lb-service-vip-cidrs. Puoi fornire i valori per questa annotazione come elenco separato da virgole o come payload JSON. Ad esempio:

[
  {
    "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
  }
]

Se scegli di utilizzare un payload JSON, ti consigliamo di utilizzare il formato JSON compatto. Ad esempio:

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

Tieni presente che il campo autoAssign ha come valore predefinito false se omesso.

Risorsa NetworkInterfaceState

La risorsa NetworkInterfaceState è una risorsa di sola lettura che consente di scoprire le interfacce di rete fisiche sul nodo e raccogliere statistiche di runtime sul traffico di rete che transita attraverso queste interfacce. Distributed Cloud crea una risorsa NetworkInterfaceState per ogni nodo di un cluster.

La configurazione predefinita delle macchine Distributed Cloud connesso include un'interfaccia di rete bonded sulla scheda figlia di rete di selezione rack (rNDC) denominata gdcenet0. Questa interfaccia lega le interfacce di rete eno1np0 e eno2np1. Ognuna di queste è connessa rispettivamente a uno switch ToR di Distributed Cloud.

La risorsa NetworkInterfaceState fornisce le seguenti categorie di informazioni sull'interfaccia di rete esposte come campi di stato di sola lettura.

Informazioni generali:

  • status.interfaces.ifname: il nome dell'interfaccia di rete di destinazione.
  • status.lastReportTime: la data e l'ora dell'ultimo report sullo stato dell'interfaccia di destinazione.

Informazioni sulla configurazione dell'indirizzo IP:

  • status.interfaces.interfaceinfo.address: l'indirizzo IP assegnato all'interfaccia di destinazione.
  • status.interfaces.interfaceinfo.dns: l'indirizzo IP del server DNS assegnato all'interfaccia di destinazione.
  • status.interfaces.interfaceinfo.gateway: l'indirizzo IP del gateway di rete che gestisce l'interfaccia di destinazione.
  • status.interfaces.interfaceinfo.prefixlen: la lunghezza del prefisso IP.

Informazioni sull'hardware:

  • status.interfaces.linkinfo.broadcast: l'indirizzo MAC di trasmissione dell'interfaccia di destinazione.
  • status.interfaces.linkinfo.businfo: il percorso del dispositivo PCIe nel formato bus:slot.function.
  • status.interfaces.linkinfo.flags: i flag dell'interfaccia, ad esempio BROADCAST.
  • status.interfaces.linkinfo.macAddress: l'indirizzo MAC unicast dell'interfaccia di destinazione.
  • status.interfaces.linkinfo.mtu: il valore MTU per l'interfaccia di destinazione.

Statistiche di ricezione:

  • status.interfaces.statistics.rx.bytes: il numero totale di byte ricevuti dall'interfaccia di destinazione.
  • status.interfaces.statistics.rx.dropped: il numero totale di pacchetti eliminati dall'interfaccia di destinazione.
  • status.interfaces.statistics.rx.errors: il numero totale di errori di ricezione dei pacchetti per l'interfaccia di destinazione.
  • status.interfaces.statistics.rx.multicast: il numero totale di pacchetti multicast ricevuti dall'interfaccia di destinazione.
  • status.interfaces.statistics.rx.overErrors: il numero totale di errori di ricezione dei pacchetti per l'interfaccia di destinazione.
  • status.interfaces.statistics.rx.packets: il numero totale di pacchetti ricevuti dall'interfaccia di destinazione.

Statistiche di trasmissione:

  • status.interfaces.statistics.tx.bytes: il numero totale di byte trasmessi dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.carrierErrors: il numero totale di errori di operatore riscontrati dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.collisions: il numero totale di collisioni di pacchetti riscontrate dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.dropped: il numero totale di pacchetti eliminati dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.errors: il numero totale di errori di trasmissione per l'interfaccia di destinazione.
  • status.interfaces.statistics.tx.packets: il numero totale di pacchetti trasmessi dall'interfaccia di destinazione.

L'esempio seguente illustra la struttura della risorsa:

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"

Risorsa NodeSystemConfigUpdate

La risorsa NodeSystemConfigUpdate consente di apportare modifiche alla configurazione del sistema operativo del nodo e di modificare i flag Kubelet. Le modifiche diverse da quelle di sysctl richiedono il riavvio del nodo.

Quando crei un'istanza di questa risorsa, devi specificare i nodi di destinazione nel campo nodeSelector. Devi includere tutte le coppie chiave-valore per ogni nodo di destinazione nel campo nodeSelector. Quando specifichi più nodi di destinazione in questo campo, i nodi di destinazione vengono aggiornati uno alla volta.

ATTENZIONE: il campo nodeName è stato ritirato. Se lo utilizzi, i nodi di destinazione, inclusi i nodi del control plane locale, vengono riavviati immediatamente, il che può interrompere i workload critici.

La risorsa NodeSystemConfigUpdate fornisce i seguenti campi di configurazione specifici per Distributed Cloud connesso:

  • spec.containerRuntimeDNSConfig.ip: specifica un elenco di indirizzi IP per i registri di immagini privati.
  • spec.containerRuntimeDNSConfig: specifica un elenco di voci DNS personalizzate utilizzate dall'ambiente di runtime del container su ogni nodo Distributed Cloud connesso. Ogni voce è composta dai seguenti campi:

    • ip: specifica l'indirizzo IPv4 di destinazione,
    • domain: specifica il dominio corrispondente,
    • interface: specifica l'interfaccia di traffico in uscita di rete tramite la quale è raggiungibile l'indirizzo IP specificato nel campo ip. Puoi specificare un'interfaccia definita tramite le seguenti risorse: CustomNetworkInterfaceConfig, Network (per annotazione), NetworkAttachmentDefinition, (per annotazione). Questa è una funzionalità a livello di anteprima.
  • spec.kubeletConfig.cpuManagerPolicy: specifica il criterio CPUManager di Kubernetes. I valori validi sono None e Static.

  • spec.kubeletConfig.topologyManagerPolicy: specifica il criterio TopologyManager di Kubernetes. I valori validi sono None, BestEffort, Restricted e SingleNumaMode.

  • spec.osConfig.hugePagesConfig: specifica la configurazione delle huge page per nodo NUMA. I valori validi sono 2MB e 1GB. Il numero di pagine enormi richieste viene distribuito uniformemente tra entrambi i nodi NUMA del sistema. Ad esempio, se allochi 16 pagine enormi da 1 GB ciascuna, ogni nodo riceve una pre-allocazione di 8 GB.

  • spec.osConfig.isolatedCpusPerSocket: specifica il numero di CPU isolate per socket. Obbligatorio se cpuManagerPolicy è impostato su Static. Il numero massimo di CPU isolate deve essere inferiore all'80% del numero totale di CPU nel nodo.

  • spec.osConfig.cpuIsolationPolicy: specifica il criterio di isolamento della CPU. Il criterio Default isola solo le attività systemd dalle CPU riservate ai workload. Il criterio Kernel contrassegna le CPU come isolcpus e imposta i flag rcu_nocb, nohz_full e rcu_nocb_poll su ogni CPU.

  • spec.sysctls.NodeLevel: specifica i parametri sysctls che puoi configurare a livello globale su un nodo utilizzando l'operatore della funzione di rete. I parametri configurabili sono i seguenti:

    • 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

    Puoi anche limitare l'ambito dei parametri sysctls sicuri e non sicuri a un pod o a uno spazio dei nomi specifico utilizzando il tuning Container Networking Interface (CNI) plug-in.

La risorsa NodeSystemConfigUpdate fornisce i seguenti campi di stato generali di sola lettura:

  • status.lastReportTime: l'ultima volta che è stato segnalato lo stato dell'interfaccia di destinazione.
  • status.conditions.lastTransitionTime: l'ultima volta che è cambiata la condizione dell'interfaccia.
  • status.conditions.observedGeneration: indica il valore .metadata.generation su cui si basava la condizione iniziale.
  • status.conditions.message: un messaggio informativo che descrive la modifica della condizione dell'interfaccia.
  • status.conditions.reason: un identificatore programmatico che indica il motivo dell'ultima modifica della condizione dell'interfaccia.
  • status.conditions.status: il descrittore di stato della condizione. I valori validi sono True, False e Unknown.
  • status.conditions.type: il tipo di condizione in camelCase.

L'esempio seguente illustra la struttura della risorsa:

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

Risorsa SriovNetworkNodePolicy

La risorsa SriovNetworkNodePolicy consente di allocare un gruppo di funzioni virtuali (VF) SR-IOV su una macchina fisica Distributed Cloud connesso e di creare un'istanza del gruppo come risorsa Kubernetes. Puoi quindi utilizzare questa risorsa in una risorsa NetworkAttachmentDefinition.

Puoi selezionare ogni VF di destinazione in base al fornitore PCIe e all'ID dispositivo, agli indirizzi dei dispositivi PCIe o al nome del dispositivo enumerato Linux. L'operatore di rete SR-IOV configura ogni interfaccia di rete fisica per eseguire il provisioning delle VF di destinazione. Ciò include l'aggiornamento del firmware dell'interfaccia di rete, la configurazione del driver del kernel Linux e il riavvio della macchina Distributed Cloud connesso, se necessario.

Per scoprire le interfacce di rete disponibili sul nodo, puoi cercare le NetworkInterfaceState risorse su quel nodo nello spazio dei nomi nf-operator.

L'esempio seguente illustra la struttura della risorsa:

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'esempio precedente crea un massimo di 31 VF dalla seconda porta dell'interfaccia di rete denominata enp134s0f1np1 con un valore MTU di 9000 (il valore massimo consentito). Utilizza l'etichetta del selettore di nodi edgecontainer.googleapis.com/network-sriov.capable, presente su tutti i nodi Distributed Cloud connesso in grado di supportare SR-IOV.

Per informazioni sull'utilizzo di questa risorsa, vedi SriovNetworkNodeState.

Risorsa SriovNetworkNodeState

La risorsa di sola lettura SriovNetworkNodeState consente di eseguire query sullo stato di provisioning della risorsa SriovNetworkNodePolicy su un nodo Distributed Cloud connesso. Restituisce la configurazione completa della risorsa SriovNetworkNodePolicy sul nodo, nonché un elenco di VF attive sul nodo. Il campo status.syncStatus indica se tutte le risorse SriovNetworkNodePolicy definite per il nodo sono state applicate correttamente.

L'esempio seguente illustra la struttura della risorsa:

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

Per informazioni sull'utilizzo di questa risorsa, vedi SriovNetworkNodeState.

Risorsa NetworkAttachmentDefinition

La risorsa NetworkAttachmentDefinition consente di collegare i pod Distributed Cloud a una o più reti logiche o fisiche sul nodo Distributed Cloud connesso. Utilizza il framework Multus-CNI e i seguenti plug-in:

Utilizza un'annotazione per fare riferimento al nome della risorsa SriovNetworkNodePolicy appropriata. Quando crei questa annotazione:

  • Utilizza la chiave k8s.v1.cni.cncf.io/resourceName.
  • Utilizza il prefisso gke.io/ nel valore, seguito dal nome della risorsa SriovNetworkNodePolicy di destinazione.

Utilizza l'annotazione networking.gke.io/gdce-vlan-id per specificare l'ID VLAN per la rete di destinazione. Questa annotazione è obbligatoria.

Gli esempi seguenti illustrano la struttura della risorsa. Per il networking 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"
  }
}'

Per il networking 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"
  }
}'

Configurare un'interfaccia secondaria su un pod utilizzando le VF SR-IOV

Dopo aver configurato una risorsa SriovNetworkNodePolicy e una risorsa NetworkAttachmentDefinition corrispondente, puoi configurare un'interfaccia di rete secondaria su un pod Distributed Cloud utilizzando le funzioni virtuali SR-IOV.

Per farlo, aggiungi un'annotazione alla definizione del pod Distributed Cloud come segue:

  • Chiave: k8s.v1.cni.cncf.io/networks
  • Valore: nameSpace/<NetworkAttachmentDefinition1,nameSpace/NetworkAttachmentDefinition2...

L'esempio seguente illustra questa annotazione:

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

Configurare un'interfaccia secondaria su un pod utilizzando il driver MacVLAN

Distributed Cloud connesso supporta anche la creazione di un'interfaccia di rete secondaria su un pod utilizzando il driver MacVLAN. Solo l'interfaccia gdcenet0 supporta questa configurazione e solo sui pod che eseguono workload containerizzati.

Per configurare un'interfaccia in modo che utilizzi il driver MacVLAN:

  1. Configura una risorsa NetworkAttachmentDefinition come mostrato negli esempi seguenti. Per il networking 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"
           }
         ]
       ...
       }
     }'
    

    Per il networking 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. Aggiungi un'annotazione alla definizione del pod Distributed Cloud come segue. Per il networking IPv4:

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

    Per il networking IPv6:

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

Configurare un'interfaccia secondaria su un pod utilizzando il networking multiplo di Distributed Cloud

Distributed Cloud connesso supporta la creazione di un'interfaccia di rete secondaria su un pod utilizzando la funzionalità di rete multipla. Per farlo, segui questa procedura.

  1. Configura una risorsa Network. Ad esempio:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vlan200-network
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: vlan200-interface
      gateway4: 10.53.0.1
    
  2. Aggiungi un'annotazione alla definizione del pod Distributed Cloud come segue:

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

    Passaggi successivi