Bei der Multus-CNI handelt es sich um ein Container Network Interface-Plug-In (CNI) für Kubernetes, mit denen Sie mehrere Netzwerkschnittstellen an einen einzelnen Pod anhängen und jedem einen anderen Adressbereich zuordnen können.
In diesem Thema werden die Installation des Multus-Pakets in einem Arbeitslastcluster, das von einem eigenständigen Verwaltungscluster bereitgestellt wird, sowie die Verwendung dieses Clusters zum Erstellen von Pods mit mehreren Netzwerkschnittstellen beschrieben. Beispiel: Antrea oder Calico als die primäre CNI und eine sekundäre Schnittstelle, wie z. B. macvlan- oder ipvlan- oder SR-IOV- oder DPDK-Geräte, für Hardware und beschleunigte Schnittstellen.
Binärdateien für macvlan und ipvlan sind bereits in der Vorlage des Arbeitslastclusterknotens installiert.
HinweisDie Multus-CNI wird für Arbeitslastcluster, die von einem vSphere with Tanzu Supervisor bereitgestellt werden, nicht unterstützt.
kubectl
(siehe Installieren der Tanzu CLI und Kubernetes-CLI für die Verwendung mit eigenständigen Verwaltungsclustern).large
oder extra-large
(siehe Beschreibung unter Vordefinierte Knotengrößen).HinweisSobald die Multus-CNI in einem Cluster installiert ist, sollte sie nicht gelöscht werden. Weitere Informationen finden Sie im Folgenden unter Löschen von Multus wird nicht unterstützt.
So installieren Sie das Multus-CNI-Paket in einem Arbeitslastcluster und konfigurieren den Cluster zu Verwendungszwecken:
Wenn der Cluster nicht über ein Paket-Repository mit installiertem Multus-CNI-Paket verfügt, wie z. B. das tanzu-standard
-Repository, installieren Sie es:
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
Dabei gilt:
PACKAGE-REPO-NAME
ist der Name des Paket-Repositorys, wie z. B. tanzu-standard
, oder der Name einer privaten Image-Registrierung, die mit ADDITIONAL_IMAGE_REGISTRY
-Variablen konfiguriert ist.PACKAGE-REPO-ENDPOINT
ist die URL des Paket-Repositorys.
tanzu-standard
-URL projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16
. Informationen zum Abrufen dieses Werts über die Tanzu CLI finden Sie unter Listen von Paketrepositorys oder in Tanzu Mission Control in der Liste Add-Ons (Addons) > Repositorys (Repositories) im Fensterbereich Cluster.(Optional) So konfigurieren Sie Multus:
Erstellen Sie eine Konfigurationsdatei, die die Multus-Parameter abruft und als Daemonset bereitstellt.
tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Dabei ist PACKAGE-VERSION
die Version des Multus-Pakets, das Sie installieren möchten, und FILE-PATH
der Speicherort, an dem Sie die Konfigurationsdatei speichern möchten, z. B. multus-data-values.yaml
.
Informationen zu den Einstellungen für die Konfigurationsdatei finden Sie unter entrypoint.sh
-Parameter im Multus-CNI-Repository.
Führen Sie den Befehl tanzu package available list
aus, um die verfügbaren Versionen des Multus-Pakets aufzulisten, wie z. B.:
tanzu package available list multus-cni.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
multus-cni.tanzu.vmware.com 4.0.1+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
multus-cni.tanzu.vmware.com 3.8.0+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.2 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
HinweisStellen Sie sicher, dass Ihre benutzerdefinierte Image-Registrierung erreichbar ist, wenn Sie in einer Umgebung mit eingeschränktem Netzwerk arbeiten.
Führen Sie den Befehl tanzu package available get
mit --values-schema
aus, um die festzulegenden Feldwerte anzuzeigen:
tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
Dabei gilt: – VERSION
ist eine Version, die in der Ausgabe tanzu package available list
aufgelistet wird – FORMAT
ist entweder yaml
oder json
Befüllen Sie die Konfigurationsdatei multus-data-values.yaml
mit den gewünschten Feldwerten.
Entfernen Sie alle Kommentare aus der Datei multus-data-values.yaml
:
yq -i eval '... comments=""' multus-data-values.yaml
Führen Sie tanzu package install
aus, um das Paket zu installieren.
tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
Dabei gilt:
TARGET-NAMESPACE
ist der Namespace, in dem das Multus-Paket installiert werden soll. Beispielsweise der Namespace my-packages
oder tanzu-cli-managed-packages
.
--namespace
nicht angegeben ist, installiert die Tanzu CLI das Paket im Namespace default
.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
ist die Version, die Sie oben abgerufen haben, z. B. 4.0.1+vmware.1-tkg.1
.Führen Sie tanzu package installed get
aus, um den Status des installierten Pakets zu überprüfen.
tanzu package installed get multus-cni --namespace NAMESPACE
Erstellen Sie eine benutzerdefinierte Ressourcendefinition (CRD) für NetworkAttachmentDefinition
, in der die CNI-Konfiguration für Netzwerkschnittstellen definiert wird, die von der Multus-CNI verwendet werden sollen.
Erstellen Sie eine CRD-Spezifikation. Beispiel: Diese multus-cni-crd.yaml
gibt eine NetworkAttachmentDefinition
mit dem Namen macvlan-conf
an, die eine macvlan
-CNI konfiguriert:
---
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"
}
}'
Erstellen Sie die Ressource, wie z. B. kubectl create -f multus-cni-crd.yaml
.
Erstellen Sie einen Pod mit der Anmerkung k8s.v1.cni.cncf.io/networks
, die eine kommagetrennte Liste der Namen der benutzerdefinierten Ressource NetworkAttachmentDefinition
enthält.
Erstellen Sie die Pod-Spezifikation, wie z. B. my-multi-cni-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
runAsNonRoot: true
containers:
- name: sample-pod
image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/busybox:1.28
command: [ "sh", "-c", "sleep 1h" ]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
Erstellen Sie den Pod. kubectl create -f my-multi-cni-crd.yaml
erstellt beispielsweise den Pod sample-pod
.
Nach der Erstellung des Pods verfügt dieser über drei Netzwerkschnittstellen:
lo
: die Loopback-Schnittstelleeth0
: das von der Antrea- oder Calico-CNI verwaltete Standard-Pod-Netzwerknet1
: die über die Anmerkung k8s.v1.cni.cncf.io/networks: macvlan-conf
erstellte neue Schnittstelle.HinweisDas Standardnetzwerk erhält den Namen
eth0
, und zusätzliche Netzwerk-Pod-Schnittstellen erhalten den Namennet1
,net2
usw.
Führen Sie kubectl describe pod
auf dem Pod aus und bestätigen Sie, dass in der Anmerkung k8s.v1.cni.cncf.io/network-status
alle Netzwerkschnittstellen aufgelistet werden. Beispiel:
$ 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
Führen Sie anschließend kubectl exec sample-pod -- ip a show dev net1
aus, um sicherzustellen, dass die Zielschnittstelle aktiv ist und mit der in den obigen Anmerkungen aufgelisteten IP-Adresse ausgeführt wird.
Sobald die Multus-CNI in einem Cluster installiert ist, sollte sie nicht gelöscht werden.
Durch das Löschen von Multus wird die Multus-Konfigurationsdatei /etc/cni/net.d/00-multus.conf
nicht im CNI-Skriptverzeichnis deinstalliert, wodurch folgende Probleme auftreten:
Terminating
mit Fehlern im kubelet
-Protokoll hängen.