Multus CNI è un plug-in Container Network Interface (CNI) per Kubernetes che consente di collegare più interfacce di rete a un singolo pod e associare ciascuna di esse a un intervallo di indirizzi diverso.
Questo argomento spiega come installare il pacchetto Multus in un cluster del carico di lavoro distribuito da un cluster di gestione autonomo e utilizzarlo per creare pod con più interfacce di rete. Ad esempio, Antrea o Calico come CNI principale e un'interfaccia secondaria come macvlan o ipvlan oppure dispositivi SR-IOV o DPDK per interfacce hardware o accelerate.
I file binari per macvlan e ipvlan sono già installati nel modello del nodo del cluster del carico di lavoro.
NotaMultus CNI non è supportato per i cluster del carico di lavoro distribuiti da un supervisore vSphere with Tanzu.
kubectl
, come descritto in Installazione della CLI di Tanzu e altri strumenti per l'utilizzo con un supervisore vSphere with Tanzu o Installazione della CLI di Tanzu e altri strumenti per l'utilizzo con i cluster di gestione autonomi.large
o extra-large
come descritto in Dimensioni dei nodi predefinite.NotaDopo che l'interfaccia Multus CNI è stata installata in un cluster, non deve essere eliminata. Vedere Eliminazione di Multus non supportata di seguito.
Per installare il pacchetto Multus CNI in un cluster del carico di lavoro e configurare il cluster per utilizzarlo:
Se nel cluster non è installato un repository dei pacchetti con il pacchetto Multus CNI, ad esempio il repository tanzu-standard
, installarne uno:
NotaSe si utilizza un cluster basato sul piano (legacy), ignorare questo passaggio. Per i cluster basati sul piano, il repository dei pacchetti
tanzu-standard
veniva abilitato automaticamente in ogni cluster nello spazio dei nomitanzu-package-repo-global
.
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
In cui:
PACKAGE-REPO-NAME
è il nome del repository dei pacchetti, ad esempio tanzu-standard
o il nome di un registro immagini privato configurato con le variabili ADDITIONAL_IMAGE_REGISTRY
.PACKAGE-REPO-ENDPOINT
è l'URL del repository dei pacchetti.
tanzu-standard
è projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0
. Vedere Elenco dei repository dei pacchetti per ottenere questo valore dalla CLI di Tanzu oppure in Tanzu Mission Control vedere l'elenco Elementi aggiuntivi (Addons) > Repository (Repositories) nel riquadro Cluster.(Facoltativo) Per configurare Multus:
Creare un file di configurazione che recuperi i parametri Multus e li distribuisca come Daemonset.
tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Dove PACKAGE-VERSION
è la versione del pacchetto Multus che si desidera installare e FILE-PATH
è la posizione in cui si desidera salvare il file di configurazione, ad esempio multus-data-values.yaml
.
Per informazioni sulle impostazioni per il file di configurazione, vedere Parametri di entrypoint.sh
nel repository di Multus CNI.
Eseguire il comando tanzu package available list
per elencare le versioni disponibili del pacchetto Multus, ad esempio:
tanzu package available list multus-cni.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
multus-cni.tanzu.vmware.com 3.7.1+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
multus-cni.tanzu.vmware.com 3.7.1+vmware.2-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
multus-cni.tanzu.vmware.com 3.7.1+vmware.2-tkg.2 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
Notaassicurarsi che il registro immagini personalizzato possa essere raggiunto se si opera in un ambiente con restrizioni di rete.
Eseguire il comando tanzu package available get
con --values-schema
per verificare quali valori dei campi possono essere impostati:
tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
In cui: - VERSION
è una versione elencata nell'output tanzu package available list
- FORMAT
è yaml
oppure json
Compilare il file di configurazione multus-data-values.yaml
con i valori del campo desiderato.
Rimuovere tutti i commenti dal file multus-data-values.yaml
:
yq -i eval '... comments=""' multus-data-values.yaml
Eseguire tanzu package install
per installare il pacchetto.
tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
In cui:
TARGET-NAMESPACE
è lo spazio dei nomi in cui si desidera installare il pacchetto Multus. Ad esempio, lo spazio dei nomi my-packages
o tanzu-cli-managed-packages
.
--namespace
non viene specificato, la CLI di Tanzu installa il pacchetto nello spazio dei nomi default
.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
è la versione recuperata in precedenza, ad esempio 3.8.0+vmware.3-tkg.1
.Eseguire tanzu package installed get
per verificare lo stato del pacchetto installato.
tanzu package installed get multus-cni --namespace NAMESPACE
Creare una definizione di risorsa personalizzata (Custom Resource Definition, CRD) per NetworkAttachmentDefinition
che definisca la configurazione CNI per le interfacce di rete che devono essere utilizzate da Multus CNI.
Creare una specifica CRD. Ad esempio, multus-cni-crd.yaml
specifica un NetworkAttachmentDefinition
denominato macvlan-conf
che configura una CNI macvlan
:
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.0",
"type": "macvlan",
"master": "ens5",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.1.0/24",
"rangeStart": "192.168.1.200",
"rangeEnd": "192.168.1.216",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"gateway": "192.168.1.1"
}
}'
Creare la risorsa; ad esempio kubectl create -f multus-cni-crd.yaml
Creare un pod con l'annotazione k8s.v1.cni.cncf.io/networks
, che acquisisce un elenco delimitato da virgole dei nomi della risorsa personalizzata NetworkAttachmentDefinition
.
Creare la specifica del pod, ad esempio my-multi-cni-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: sample-pod
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/alpine
Creare il pod; ad esempio kubectl create -f my-multi-cni-crd.yaml
crea il pod sample-pod
.
Una volta creato, il pod avrà tre interfacce di rete:
lo
l'interfaccia di loopbacketh0
la rete pod predefinita gestita da Antrea o Calico CNInet1
la nuova interfaccia creata tramite l'annotazione k8s.v1.cni.cncf.io/networks: macvlan-conf
.NotaLa rete predefinita ottiene il nome
eth0
mentre altre interfacce del pod di rete ottengono il nomenet1
,net2
e così via.
Eseguire kubectl describe pod
nel pod e verificare che l'annotazione k8s.v1.cni.cncf.io/network-status
elenchi tutte le interfacce di rete. Ad esempio:
$ kubectl describe pod sample-pod
Name: sample-pod
Namespace: default
Priority: 0
Node: tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time: Thu, 27 May 2021 15:31:20 +0000
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "",
"interface": "eth0",
"ips": [
"100.96.1.80"
],
"mac": "66:39:dc:63:50:a3",
"default": true,
"dns": {}
},{
"name": "default/macvlan-conf",
"interface": "net1",
"ips": [
"192.168.1.201"
],
"mac": "02:77:cb:a0:60:e3",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks: macvlan-conf
Eseguire quindi kubectl exec sample-pod -- ip a show dev net1
per verificare che l'interfaccia di destinazione sia attiva e funzionante con l'IP elencato nelle annotazioni precedenti.
Dopo che l'interfaccia Multus CNI è stata installata in un cluster, non deve essere eliminata.
L'eliminazione di Multus non disinstalla il file di configurazione di Multus /etc/cni/net.d/00-multus.conf
dalla directory degli script CNI. Questo comportamento causa problemi come i seguenti:
Terminating
con errori nel registro kubelet
.