Questo documento descrive come configurare Google Distributed Cloud per fornire più interfacce di rete, multi-NIC, per i tuoi pod. La funzionalità multi-NIC per pod può aiutare a separare il traffico del piano di controllo da quello del piano dati, creando isolamento tra i piani. Anche le interfacce di rete aggiuntive abilitano la funzionalità multicast per i tuoi pod. Il NIC multiplo per i pod è supportato per i cluster utente, ma non è consentito per i cluster di amministrazione.
L'isolamento del piano di rete è importante per i sistemi che utilizzano le virtualizzazioni delle funzioni di rete (NFV), come il networking software-defined in una Wide Area Network (SD-WAN), un broker di sicurezza di accesso al cloud (CASB) e i firewall di nuova generazione (NG-FW). Questi tipi di NFV si basano sull’accesso a più interfacce per mantenere separati il piano di controllo e i piani dati.
La configurazione di più interfacce di rete supporta l'associazione di interfacce di rete a pool di nodi, il che può offrire vantaggi in termini di prestazioni. Ad esempio, un cluster può contenere una combinazione di tipi di nodi. Quando raggruppi macchine ad alte prestazioni in un pool di nodi, puoi creare interfacce aggiuntive al pool di nodi per migliorare il flusso del traffico.
Configurazione di più interfacce di rete
In genere sono previsti tre passaggi per configurare più interfacce di rete per i pod:
Abilita il protocollo multi-NIC per il tuo cluster utente utilizzando i campi
multipleNetworkInterfaces
eenableDataplaneV2
nel file di configurazione del cluster.Specifica le interfacce di rete con la sezione
additionalNodeInterfaces
nel file di configurazione del cluster e crea una o più risorse personalizzateNetworkAttachmentDefinition
.Assegna le interfacce di rete ai pod con l'annotazione
k8s.v1.cni.cncf.io/networks
.
Attiva più NIC
Abilita il multi-NIC per i tuoi pod impostando i campi multipleNetworkInterfaces
e enableDataplaneV2
nel file di configurazione del cluster utente su true
.
apiVersion: v1 multipleNetworkInterfaces: true enableDataplaneV2: true ...
Specifica le interfacce di rete
Nel file di configurazione del cluster, specifica le interfacce di rete dei nodi aggiuntive nella sezione additionalNodeInterfaces
.
Ad esempio, ecco una parte di un file di configurazione del cluster utente che mostra un'interfaccia di rete di nodi aggiuntiva:
apiVersion: v1 multipleNetworkInterfaces: true enableDataplaneV2: true network: serviceCIDR: "10.96.0.0/20" podCIDR: "192.168.0.0/16" vCenter: networkName: network-private310 ... # New multiple network configs additionalNodeInterfaces: - networkName: "gke-network-1" ipBlockFilePath: "my-block-yaml" type: static
Dopo aver creato un cluster con la configurazione precedente, devi creare una o più risorse personalizzate NetworkAttachmentDefinition
(NAD) nel cluster utente in cui specifichi interfacce di rete aggiuntive. NetworkAttachmentDefinitions
corrisponde alle reti disponibili per i tuoi pod. L'esempio seguente mostra un manifest per un NetworkAttachmentDefinition
:
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: gke-network-1 namespace: default spec: config: '{ "cniVersion":"0.3.0", "type": "ipvlan", "master": "ens224", # defines the node interface that this Pod interface would map to "mode": "l2", "ipam": { "type": "whereabouts", "range": "172.16.0.0/24" } }'
Salva il manifest come file YAML, ad esempio my-nad.yaml
, e crea il codice NetworkAttachmentDefinition
:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f my-nad.yaml
assegna interfacce di rete a un pod
Usa l'annotazione k8s.v1.cni.cncf.io/networks
per assegnare una o più interfacce di rete a un pod. Ogni interfaccia di rete è specificata con uno spazio dei nomi e il nome di un NetworkAttachmentDefinition
, separati da una barra (/
). Utilizza un elenco separato da virgole per specificare più interfacce di rete.
Nell'esempio seguente, al pod samplepod
sono assegnate due interfacce di rete. Le interfacce di rete sono specificate dai nomi di due NetworkAttachmentDefinitions
, gke-network-1
e gke-network-2
, creati nello spazio dei nomi default
.
--- apiVersion: v1 kind: Pod metadata: name: samplepod annotations: k8s.v1.cni.cncf.io/networks: default/gke-network-1,default/gke-network-2 spec: containers: ...
Limita le interfacce di rete a un insieme di nodi
Se non vuoi che un valore NetworkAttachmentDefinition
sia applicabile a un intero cluster, puoi limitarne la funzionalità a un gruppo di nodi.
Puoi raggruppare i nodi del cluster utilizzando l'etichetta standard assegnata al nodo o un'etichetta personalizzata. Puoi quindi specificare l'etichetta del nodo nel manifest NetworkAttachmentDefinition
utilizzando l'annotazione k8s.v1.cni.cncf.io/nodeSelector
. GKE su VMware forza il deployment di tutti i pod che fanno riferimento a questa risorsa personalizzata sui nodi che hanno questa etichetta.
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: annotations: k8s.v1.cni.cncf.io/nodeSelector: LABEL_KEY=LABEL_VALUE name: gke-network-1 spec: ...
L'esempio seguente mostra l'etichetta my-label=multinicNP
indicata su NetworkAttachmentDefinition
e forza il deployment di tutti i pod a cui è assegnata la rete gke-network-1
ai nodi che hanno questa etichetta.
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: annotations: k8s.v1.cni.cncf.io/nodeSelector: my-label=multinicNP name: gke-network-1 spec: ...
Per applicare un'etichetta personalizzata a un nodo, utilizza il comando kubectl label nodes
:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] label nodes NODE_NAME LABEL_KEY=LABEL_VALUE
Sostituisci quanto segue:
NODE_NAME
: il nome del nodo che stai etichettando.LABEL_KEY
: la chiave da utilizzare per l'etichetta.LABEL_VALUE
: il valore dell'etichetta.
In questo esempio, al nodo my-node
viene assegnata l'etichetta environment=production
:
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] label nodes my-node environment=production
Problemi di sicurezza
Un NetworkAttachmentDefinition
fornisce l'accesso completo a una rete, quindi gli amministratori del cluster devono fare attenzione nel fornire ad altri utenti l'accesso in fase di creazione, aggiornamento o eliminazione. Se un determinato NetworkAttachmentDefinition
deve essere isolato, puoi specificare uno spazio dei nomi non predefinito durante la creazione, in cui solo i pod dello spazio dei nomi possono accedervi.
Nel diagramma seguente, i pod dello spazio dei nomi default
non possono accedere all'interfaccia di rete nello spazio dei nomi privileged
.
Plug-in CNI supportati
Questa sezione elenca i plug-in CIN supportati dalla funzionalità multi-NIC per Google Distributed Cloud. Utilizza solo i seguenti plug-in quando specifichi un valore NetworkAttachmentDefinition
.
Creazione dell'interfaccia:
ipvlan
macvlan
bridge
Meta plug-in:
portmap
sbr
tuning
Plug-in IPAM:
host-local
static
whereabouts
Configurazione del percorso
Un pod a cui sono assegnati uno o più NetworkAttachmentDefinitions
dispone di più interfacce di rete. Per impostazione predefinita, la tabella di routing del pod in questa situazione è estesa con le interfacce aggiuntive disponibili a livello locale solo dall'oggetto NetworkAttachmentDefinitions
assegnato. I pacchetti associati al gateway predefinito sono ancora configurati per l'utilizzo dell'interfaccia predefinita del pod, eth0
.
Puoi modificare questo comportamento utilizzando i seguenti plug-in CNI:
sbr
static
whereabouts
Ad esempio, potresti volere che la maggior parte del traffico passi attraverso il gateway predefinito, ovvero supererà l'interfaccia di rete predefinita. Tuttavia, vuoi che una parte del traffico specifico superi una delle interfacce non predefinite. Può essere difficile distinguere il traffico in base all'IP di destinazione (routing normale), poiché lo stesso endpoint è disponibile per entrambi i tipi di interfaccia. In questo caso, può essere utile il routing basato sull'origine (SBR).
Plug-in SBR
Il plug-in sbr
consente all'applicazione di controllare le decisioni di routing. L'applicazione controlla ciò che viene utilizzato come indirizzo IP di origine della connessione che stabilisce. Quando l'applicazione sceglie di utilizzare l'indirizzo IP di NetworkAttachmentDefinition
come IP di origine, i pacchetti vengono indirizzati alla tabella di routing aggiuntiva che sbr
ha configurato. La tabella di routing sbr
invia il traffico attraverso il proprio gateway predefinito, che supererà l'interfaccia di NetworkAttachmentDefinition
. L'IP predefinito del gateway all'interno di questa tabella è controllato con il campo gateway
all'interno dei plug-in whereabouts
o static
. Il plug-in sbr
viene eseguito come plug-in concatenato. Per ulteriori informazioni sul plug-in sbr
, incluse informazioni sull'utilizzo, consulta la sezione Plug-in di routing basato sulla fonte.
L'esempio seguente mostra l'impostazione "gateway":"21.0.111.254"
impostata in whereabouts
e il plug-in sbr
impostato come plug-in concatenato dopo il giorno ipvlan
:
# ip route
default via 192.168.0.64 dev eth0 mtu 1500
192.168.0.64 dev eth0 scope link
# ip route list table 100
default via 21.0.111.254 dev net1
21.0.104.0/21 dev net1 proto kernel scope link src 21.0.111.1
Plug-in statici e di localizzazione
Il plug-in whereabouts
è fondamentalmente un'estensione del plug-in static
e questi due plug-in condividono la configurazione di routing. Per un esempio di configurazione, consulta l'articolo sul plug-in di gestione degli indirizzi IP statici.
Puoi definire un gateway e una route da aggiungere alla tabella di routing del pod. Tuttavia, non puoi modificare il gateway predefinito del pod in questo modo.
L'esempio seguente mostra l'aggiunta di "routes": [{ "dst": "172.31.0.0/16" }]
in NetworkAttachmentDefinition
:
# ip route
default via 192.168.0.64 dev eth0 mtu 1500
172.31.0.0/16 via 21.0.111.254 dev net1
21.0.104.0/21 dev net1 proto kernel scope link src 21.0.111.1
192.168.0.64 dev eth0 scope link
Esempi di configurazione
Questa sezione illustra alcune delle configurazioni di rete comuni supportate dalla funzionalità multi-NIC.
Un singolo collegamento di rete utilizzato da più pod:
Più collegamenti di rete utilizzati da un singolo pod:
Più collegamenti di rete che puntano alla stessa interfaccia utilizzata da un singolo pod:
Stesso collegamento di rete utilizzato più volte da un singolo pod:
Risolvere i problemi
Se altre interfacce di rete non sono configurate correttamente, i pod a cui sono assegnate non vengono avviati. Questa sezione evidenzia come trovare informazioni per la risoluzione dei problemi relativi alla funzionalità multi-NIC.
Controlla gli eventi del pod
Multus segnala gli errori tramite gli eventi dei pod Kubernetes. Usa il seguente comando kubectl describe
per visualizzare gli eventi per un determinato pod:
kubectl describe pod POD_NAME
Controlla i log
Per ogni nodo, puoi trovare i log Anywhere e Multus nelle seguenti posizioni:
/var/log/whereabouts.log
/var/log/multus.log
Esamina le interfacce dei pod
Usa il comando kubectl exec
per verificare le interfacce del pod. Una volta applicato correttamente l'NetworkAttachmentDefinitions
, le interfacce del pod avranno l'aspetto seguente:
user@node1:~$ kubectl exec samplepod-5c6df74f66-5jgxs -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:82:3e:f0 brd ff:ff:ff:ff:ff:ff
inet 21.0.103.112/21 scope global net1
valid_lft forever preferred_lft forever
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 36:23:79:a9:26:b3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.2.191/32 scope global eth0
valid_lft forever preferred_lft forever
Ottieni lo stato del pod
Usa l'kubectl get
per recuperare lo stato della rete per un determinato pod:
kubectl get pods POD_NAME -oyaml
Ecco un output di esempio che mostra lo stato di un pod con più reti:
apiVersion: v1
kind: Pod
metadata:
annotations:
k8s.v1.cni.cncf.io/network-status: |-
[{
"name": "",
"interface": "eth0",
"ips": [
"192.168.1.88"
],
"mac": "36:0e:29:e7:42:ad",
"default": true,
"dns": {}
},{
"name": "default/gke-network-1",
"interface": "net1",
"ips": [
"21.0.111.1"
],
"mac": "00:50:56:82:a7:ab",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks: gke-network-1