Operatore di funzioni di rete

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

L'operatore di funzione di rete ti consente di svolgere le seguenti operazioni:

  • Esegui il polling dei dispositivi di rete esistenti su un nodo.
  • Esegui query sull'indirizzo IP e sullo stato del collegamento fisico per ogni dispositivo di rete su un nodo.
  • Esegui il provisioning di interfacce di rete aggiuntive su un nodo.
  • Configura le funzionalità di sistema di basso livello sulla macchina fisica del nodo necessarie per supportare i workload ad alte prestazioni.

Profili operatore di Network Function

Distributed Cloud connected fornisce le seguenti funzionalità dell'operatore di funzioni di rete:

  • Le funzioni di automazione della rete consentono di automatizzare la configurazione del networking dei pod del tuo workload.

  • Le funzioni di esportazione dello stato consentono di esportare gli stati della rete host per l'utente, inclusi la configurazione e lo stato dell'interfaccia di rete.

  • Le funzioni Webhook ti consentono di convalidare gli input dell'utente.

Prerequisiti

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

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]"

Sostituisci quanto segue:

  • ZONE_PROJECT_ID con l'ID del progetto Google Cloud che contiene le risorse dell'API Distributed Cloud Edge Network.
  • CLUSTER_PROJECT_ID con l'ID del progetto Google Cloud che contiene il cluster Distributed Cloud connesso di destinazione.

Risorse per gli operatori di funzioni di rete

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

  • Network. Definisce una rete virtuale che i pod possono utilizzare per comunicare con risorse interne ed esterne. Prima di specificarla in questa risorsa, devi creare la VLAN corrispondente utilizzando l'API Distributed Cloud Edge Network. Per le istruzioni, vedi Creare una subnet.
  • NetworkInterfaceState. Consente il rilevamento degli stati dell'interfaccia di rete e l'esecuzione di query su un'interfaccia di rete per lo stato del collegamento e l'indirizzo IP.
  • NodeSystemConfigUpdate. Consente la configurazione di funzionalità di sistema di basso livello come le opzioni del kernel e i flag Kubelet.
  • NetworkAttachmentDefinition. Consente di collegare i pod Distributed Cloud a una o più reti logiche o fisiche sul nodo Distributed Cloud connesso. Prima di specificarla in questa risorsa, devi creare la VLAN corrispondente utilizzando l'API Distributed Cloud Edge Network. Per le istruzioni, vedi Creare una subnet.

L'operatore Network Function consente anche di definire interfacce di rete secondarie.

Network risorsa

La risorsa Network definisce una rete virtuale all'interno del deployment connesso a Distributed Cloud che i pod all'interno del cluster connesso a Distributed Cloud possono utilizzare per comunicare con 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-per-node-ipam-size: specifica le dimensioni della maschera di subnet per un singolo nodo. Se questo valore viene omesso, la dimensione della maschera di sottorete viene impostata sul valore del campo cluster-cidr-config-per-node-mask-size in ConfigMap nf-operator-defaults nello spazio dei nomi nf-operator.
  • annotations.networking.gke.io/gke-gateway-clusterip-cidr: specifica un blocco CIDR per l'accesso ai cluster tramite Connect Gateway. Questo viene utilizzato da CoreDNS sulle interfacce di rete secondarie.
  • annotations.networking.gke.io/gke-gateway-pod-cidr: specifica un blocco CIDR per un pod che può essere allocato su interfacce di rete secondarie.
  • 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 compresso. 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 viene impostato automaticamente su false se omesso.

NetworkInterfaceState risorsa

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

La configurazione predefinita delle macchine connesse a Distributed Cloud include un'interfaccia di rete aggregata denominata uplink0. Questa interfaccia combina le interfacce di rete eno1np0 e eno2np1. Ciascuno è collegato 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: l'ora e la data 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 sulla 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 dell'operatore riscontrati dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.collisions: il numero totale di collisioni di pacchetti rilevate dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.dropped: il numero totale di pacchetti eliminati dall'interfaccia di destinazione.
  • status.interfaces.statistics.tx.errors: gli errori di trasmissione totali 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"

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

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

  1. Configura una risorsa Network. Ad esempio:

    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'annotazione networking.gke.io/gdce-lb-service-vip-cidrs specifica uno o più pool di indirizzi IP per questa rete virtuale. La prima metà del CIDR specificato qui deve includere gli indirizzi IP virtuali del servizio (SVIP). Distributed Cloud connesso applica questo requisito tramite i controlli webhook nel seguente modo:

    • L'intervallo di indirizzi SVIP deve rientrare nell'intervallo CIDR della VLAN corrispondente e
    • L'intervallo di indirizzi SVIP può estendersi solo fino alla prima metà dell'intervallo CIDR della VLAN.
  2. Aggiungi un'annotazione alla definizione del pod Distributed Cloud nel seguente modo:

    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
    

    Questa annotazione configura l'interfaccia eth0 come principale e l'interfaccia eth1 come secondaria con bilanciamento del carico di livello 2 con MetalLB.

La configurazione dell'interfaccia secondaria come descritto in questa sezione comporta la creazione automatica delle seguenti risorse personalizzate:

  • Una risorsa IPAddressPool, che consente l'assegnazione automatica dell'indirizzo SVIP ai pod. Ad esempio:
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
  • Una risorsa L2Advertisement che consente la pubblicità degli indirizzi VIP condivisi specificati. Ad esempio:
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertise-410
  namespace: kube-system
spec:
  ipAddressPools:
  - test-410-pool
  interfaces:
  - gdcenet0.410

## Passaggi successivi