Questo documento descrive come configurare i cluster Anthos su Bare Metal in modo da fornire più interfacce di rete, multi-NIC, per i tuoi pod. La funzionalità multi-NIC per pod consente di separare il traffico del piano di controllo da quello del piano dati, creando l'isolamento tra i piani. Le interfacce di rete aggiuntive consentono anche la funzionalità multicast per i pod. Il multi-NIC per pod è supportato per cluster utente, cluster ibridi e cluster autonomi. Non è consentito per i cluster di tipo amministratore.
L'isolamento dei piani di rete è importante per i sistemi che utilizzano le virtualizzazione di rete (NFV), come il networking software-defined in un'ampia area rete (SD-WAN), un broker di sicurezza cloud access (CASB) e i firewall di nuova generazione (NG-FW). Questi tipi di NFV si basano sull'accesso a più interfacce per mantenere separati i piani di gestione e quelli di dati, mentre sono in esecuzione come container.
La configurazione dell'interfaccia di rete multipla supporta l'associazione delle interfaccia di rete ai pool di nodi, il che può offrire vantaggi in termini di prestazioni. I cluster possono contenere una combinazione di tipi di nodi. Quando raggruppi macchine a prestazioni elevate in un pool di nodi, puoi aggiungere ulteriori interfacce al pool di nodi per migliorare il flusso del traffico.
Configurazione di più interfacce di rete
In generale, ci sono tre passaggi per configurare più interfacce di rete per i tuoi pod:
Abilita più NIC per il tuo cluster con il campo
multipleNetworkInterfaces
nella risorsa personalizzata del cluster.Specifica le interfacce di rete con
NetworkAttachmentDefinition
risorse personalizzate.Assegna le interfacce di rete ai pod con l'annotazione
k8s.v1.cni.cncf.io/networks
.
Vengono fornite informazioni aggiuntive per aiutarti a configurare e utilizzare la funzionalità multi-NIC nel modo più adatto alle tue esigenze di networking.
Attivazione di più NIC
Attiva più NIC per i tuoi pod aggiungendo il campo multipleNetworkInterfaces
alla sezione clusterNetwork
della risorsa personalizzata del cluster e impostandolo su true
.
...
clusterNetwork:
multipleNetworkInterfaces: true
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/12
...
Specifica delle interfacce di rete
Utilizza le risorse personalizzate NetworkAttachmentDefinition
per specificare le interfacce di rete aggiuntive. Le risorse personalizzate di NetworkAttachmentDefinition
corrispondono alle reti disponibili per i tuoi pod. Puoi specificare le risorse personalizzate all'interno della configurazione del cluster, come mostrato nell'esempio seguente, oppure puoi creare direttamente le risorse personalizzate NetworkAttachmentDefinition
:
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: my-cluster
namespace: cluster-my-cluster
spec:
type: user
clusterNetwork:
multipleNetworkInterfaces: true
...
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-network-1
namespace: cluster-my-cluster
spec:
config: '{
"type": "ipvlan",
"master": "enp2342", # defines the node interface that this pod interface would
map to.
"mode": "l2",
"ipam": {
"type": "whereabouts",
"range": "172.120.0.0/24"
}
}'
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-network-2
namespace: cluster-my-cluster
spec:
config: '{
"type": "macvlan",
"mode": "bridge",
"master": "vlan102",
"ipam": {
"type": "static",
"addresses": [
{
"address": "10.10.0.1/24",
"gateway": "10.10.0.254"
}
],
"routes": [
{ "dst": "192.168.0.0/16", "gw": "10.10.5.1" }
]
}
}'
Quando specifichi la risorsa personalizzata NetworkAttachmentDefinition
nel file di configurazione del cluster, i cluster Anthos su Bare Metal utilizzano questo nome per controllare la risorsa personalizzata NetworkAttachmentDefinition
dopo la creazione del cluster.
I cluster Anthos su Bare Metal considerano questa risorsa personalizzata all'interno dello spazio dei nomi del cluster come la fonte di riferimento e la riconciliano con lo spazio dei nomi default
del cluster di destinazione.
Il seguente diagramma illustra come i cluster Anthos su Bare Metal riconciliano NetworkAttachmentDefinition
risorse personalizzate dallo spazio dei nomi specifico del cluster allo spazio dei nomi default
.
Sebbene sia facoltativo, consigliamo di specificare NetworkAttachmentDefinition
risorse personalizzate in questo modo, durante la creazione del cluster. I cluster utente hanno il vantaggio maggiore quando specifichi le risorse personalizzate durante la creazione del cluster, perché puoi controllare le NetworkAttachmentDefinition
risorse personalizzate del cluster di amministrazione.
Se scegli di non specificare le risorse personalizzate NetworkAttachmentDefinition
durante la creazione del cluster, puoi aggiungere risorse personalizzate NetworkAttachmentDefinition
direttamente a un cluster di destinazione esistente. I cluster Anthos su Bare Metal riconciliano NetworkAttachmentDefinition
risorse personalizzate definite nello spazio dei nomi del cluster. La riconciliazione avviene anche in seguito all'eliminazione. Quando una risorsa personalizzata NetworkAttachmentDefinition
viene rimossa da uno spazio dei nomi del cluster, i cluster Anthos su Bare Metal rimuovono la risorsa personalizzata dal cluster di destinazione.
Assegnazione di interfacce di rete a un pod
Utilizza 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 una risorsa personalizzata NetworkAttachmentDefinition
, separata da una barra (/
).
---
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: NAMESPACE/NAD_NAME
spec:
containers:
...
Sostituisci quanto segue:
NAMESPACE
: lo spazio dei nomi. Utilizzadefault
per lo spazio dei nomi predefinito, che è standard. Vedi Problemi di sicurezza per un'eccezione.NAD_NAME
: il nome della risorsa personalizzataNetworkAttachmentDefinition
.
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
NetworkAttachmentDefinition
risorse personalizzate, gke-network-1
e
gke-network-2
, nello spazio dei nomi predefinito del cluster di destinazione.
---
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: default/gke-network-1,default/gke-network-2
spec:
containers:
...
Limitazione delle interfacce di rete a un pool di nodi
Devi specificare con l'annotazione k8s.v1.cni.cncf.io/nodeSelector
un pool di nodi
per i quali è valida una risorsa personalizzata NetworkAttachmentDefinition
.
I cluster Anthos su Bare Metal forzano il deployment di qualsiasi pod che fa riferimento a questa risorsa personalizzata su tali nodi specifici. Nell'esempio seguente, i cluster Anthos su Bare Metal forzano il deployment di tutti i pod a cui è assegnata l'interfaccia di rete gke-network-1
al pool di nodi multinicNP
.
I cluster Anthos su Bare Metal etichettano un pool di nodi con l'etichetta baremetal.cluster.gke.io/node-pool
di conseguenza.
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
annotations:
k8s.v1.cni.cncf.io/nodeSelector: baremetal.cluster.gke.io/node-pool=multinicNP
name: gke-network-1
spec:
...
Le etichette standard non sono limitate. Puoi creare pool personalizzati dai nodi del cluster applicando un'etichetta personalizzata a questi nodi.
Utilizza il comando kubectl label nodes
per applicare un'etichetta personalizzata:
kubectl 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 nome dell'etichetta.
Dopo aver etichettato il nodo, applica l'annotazione baremetal.cluster.gke.io/label-taint-no-sync
al nodo per impedire ad Cluster Anthos su Bare Metal di riconciliare le etichette. Usa il comando kubectl get nodes --show-labels
per verificare se un nodo è etichettato.
Problemi di sicurezza
Una risorsa personalizzata NetworkAttachmentDefinition
fornisce l'accesso completo a una rete, pertanto gli amministratori del cluster devono essere cauti quando si fornisce l'accesso di creazione, aggiornamento o eliminazione ad altri utenti. Se una determinata risorsa personalizzata NetworkAttachmentDefinition
deve essere isolata, può essere posizionata in uno spazio dei nomi non predefinito, dove solo i pod di tale spazio dei nomi possono accedervi. NetworkAttachmentDefinition
risorse personalizzate specificate nel file di configurazione del cluster vengono sempre riconciliate nello spazio dei nomi predefinito.
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
In questa sezione sono elencati i plug-in del CNI supportati dalla funzionalità multi-NIC per i cluster Anthos su Bare Metal. Utilizza i seguenti plug-in quando specifichi una risorsa personalizzata NetworkAttachmentDefinition
.
Creazione dell'interfaccia:
ipvlan
macvlan
bridge
Plug-in meta:
portmap
sbr
tuning
Plug-in IPAM:
host-local
static
whereabouts
Routing
Un pod a cui sono assegnate una o più risorse personalizzate NetworkAttachmentDefinition
ha più interfacce di rete. Per impostazione predefinita, la tabella di routing in questa situazione è estesa con le interfacce aggiuntive disponibili localmente solo dalle risorse personalizzate di NetworkAttachmentDefinition
assegnate. Il gateway predefinito è ancora configurato per utilizzare l'interfaccia master/predefinita del pod eth0
.
Puoi modificare questo comportamento utilizzando i seguenti plug-in CNI:
sbr
static
whereabouts
Ad esempio, potresti volere che tutto il traffico passi attraverso il gateway predefinito. Tuttavia, una parte del traffico specifico controlla una di queste interfacce non predefinite. Può essere difficile distinguere il traffico in base all'IP di destinazione (routing normale), perché lo stesso endpoint è disponibile su entrambi i tipi di interfaccia. In questo caso, il routing basato sull'origine (SBR) può essere utile.
Plug-in SBR
Il plug-in sbr
consente all'applicazione di controllare le decisioni relative al routing. L'applicazione controlla quello che viene utilizzato come indirizzo IP di origine della connessione che stabilisce. Quando l'applicazione sceglie di utilizzare l'indirizzo IP della risorsa personalizzata NetworkAttachmentDefinition
per l'IP di origine, i pacchetti vengono indirizzati alla tabella di routing aggiuntiva sbr
configurata. La tabella di routing di sbr
stabilisce l'interfaccia della risorsa personalizzata NetworkAttachmentDefinition
come gateway predefinito. L'IP gateway predefinito all'interno di quella tabella è controllato
con il campo gateway
all'interno di whereabouts
o plug-in static
. Fornisci il plug-in sbr
come plug-in concatenato. Per scoprire di più sul plug-in sbr
, incluse le informazioni sull'utilizzo, consulta il plug-in di routing basato sull'origine.
L'esempio seguente mostra "gateway":"21.0.111.254"
impostato in whereabouts
e
sbr
impostato come plug-in concatenato dopo 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 ovunque
Il plug-in whereabouts
è fondamentalmente un'estensione del plug-in static
e questi due condividono la configurazione di routing. Per un esempio di configurazione, consulta il plug-in di gestione degli indirizzi IP statici.
Puoi definire un gateway e una route da aggiungere alla tabella di routing del pod. Tuttavia, puoi modificare il gateway predefinito del pod in questo modo.
L'esempio seguente mostra l'aggiunta di "routes": [{ "dst": "172.31.0.0/16" }]
nella risorsa personalizzata 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.
Singolo collegamento di rete utilizzato da più pod
Collegamenti di rete multipli utilizzati da un singolo pod
Più collegamenti di rete che puntano alla stessa interfaccia utilizzata dal pod singolo
Stesso collegamento di rete utilizzato più volte da un singolo pod
Risolvere i problemi
Se le interfacce di rete aggiuntive non sono configurate correttamente, i pod a cui sono assegnati non vengono avviati. Questa sezione evidenzia come trovare informazioni per la risoluzione dei problemi con la funzionalità multi-NIC.
Controlla gli eventi del pod
Multus segnala gli errori tramite gli eventi del pod Kubernetes. Utilizza 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 Dove e Multus nelle seguenti posizioni:
/var/log/whereabouts.log
/var/log/multus.log
Esamina le interfacce dei pod
Utilizza il comando kubectl exec
per controllare le interfacce dei pod. Una volta applicate correttamente le risorse personalizzate NetworkAttachmentDefinition
, le interfacce dei pod hanno il seguente output:
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
Conoscere lo stato del pod
Usa kubectl get
per recuperare lo stato di rete per un determinato pod:
kubectl get pods POD_NAME -oyaml
Di seguito è riportato un esempio di output 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