Multus CNI est un plug-in d'interface réseau de conteneur (CNI) pour Kubernetes qui vous permet d'attacher plusieurs interfaces réseau à un seul espace et de les associer à une plage d'adresses différente.
Cette rubrique explique comment installer le module Multus sur un cluster de charge déployé par un cluster de gestion autonome et l'utiliser pour créer des espaces avec plusieurs interfaces réseau. Par exemple, Antrea ou Calico comme CNI principale et une interface secondaire telle que macvlan ou ipvlan, ou des périphériques SR-IOV ou DPDK pour les interfaces matérielles ou accélérées.
Les fichiers binaires pour macvlan et ipvlan sont déjà installés dans le modèle de nœud de cluster de charge de travail.
RemarqueMultus CNI n'est pas pris en charge pour les clusters de charge de travail déployés par un superviseur vSphere with Tanzu.
kubectl
, comme décrit dans Installer la CLI Tanzu et d'autres outils à utiliser avec un superviseur vSphere with Tanzu ou Installer la CLI Tanzu et d'autres outils à utiliser avec les clusters de gestion autonomes.large
ou extra-large
, comme décrit dans la section Tailles de nœud prédéfinies.Remarqueune fois Multus CNI installé dans un cluster, il ne doit pas être supprimé. Reportez-vous à la section Suppression de Multus non pris en charge ci-dessous.
Pour installer le module de Multus CNI sur un cluster de charge de travail et configurer le cluster pour l'utiliser :
Si le cluster ne dispose pas d'un référentiel de modules avec le module Multus CNI installé, tel que le référentiel tanzu-standard
, installez-en un :
RemarqueSi vous ciblez un cluster basé sur un plan (hérité), ignorez cette étape. Pour les clusters basés sur un plan, le référentiel de modules
tanzu-standard
est automatiquement activé dans chaque cluster, dans l'espace de nomstanzu-package-repo-global
.
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
Où :
PACKAGE-REPO-NAME
est le nom du référentiel de modules, tel que tanzu-standard
ou le nom d'un registre d'images privé configuré avec des variables ADDITIONAL_IMAGE_REGISTRY
.PACKAGE-REPO-ENDPOINT
est l'URL du référentiel de modules.
tanzu-standard
est projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0
. Reportez-vous à la section Répertorier les référentiels de modules (List Package Repositories) pour obtenir cette valeur depuis la CLI Tanzu ou, dans Tanzu Mission Control, consultez la liste Modules complémentaires (Addons) > Référentiels (Repositories) dans le volet Cluster.(Facultatif) Pour configurer Multus :
Créez un fichier de configuration qui récupère les paramètres Multus et le déploie en tant que DaemonSet.
tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
Où PACKAGE-VERSION
est la version du module Multus que souhaitez installer et FILE-PATH
est l'emplacement dans lequel vous souhaitez enregistrer le fichier de configuration (par exemple, multus-data-values.yaml
).
Pour plus d'informations sur les paramètres du fichier de configuration, reportez-vous aux paramètres entrypoint.sh
dans le référentiel Multus CNI.
Exécutez la commande tanzu package available list
pour répertorier les versions disponibles du module Multus, par exemple :
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
Remarqueassurez-vous que votre registre d'images personnalisé est accessible si vous travaillez dans un environnement restreint au réseau.
Exécutez la commande tanzu package available get
avec --values-schema
pour voir quelles valeurs de champ peuvent être définies :
tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
Où : - VERSION
est une version répertoriée dans la sortie tanzu package available list
- FORMAT
est yaml
ou json
Remplissez le fichier de configuration multus-data-values.yaml
avec les valeurs de champ souhaitées.
Supprimez tous les commentaires du fichier multus-data-values.yaml
:
yq -i eval '... comments=""' multus-data-values.yaml
Exécutez tanzu package install
pour installer le module.
tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
Où :
TARGET-NAMESPACE
est l'espace de noms dans lequel vous souhaitez installer le module Multus. Par exemple, l'espace de noms my-packages
ou tanzu-cli-managed-packages
.
--namespace
n'est pas spécifié, la CLI Tanzu installe le module dans l'espace de noms default
.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
est la version que vous avez récupérée ci-dessus, par exemple 3.8.0+vmware.3-tkg.1
.Exécutez tanzu package installed get
pour vérifier l'état du module installé.
tanzu package installed get multus-cni --namespace NAMESPACE
Créez une définition de ressource personnalisée (CRD, Custom Resource Definition) pour NetworkAttachmentDefinition
qui définit la configuration CNI des interfaces réseau à utiliser par Multus CNI.
Créez une spécification CRD. Par exemple, ce multus-cni-crd.yaml
spécifie un NetworkAttachmentDefinition
nommé macvlan-conf
qui configure un 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"
}
}'
Créez la ressource (par exemple, kubectl create -f multus-cni-crd.yaml
).
Créez un espace avec l'annotation k8s.v1.cni.cncf.io/networks
, qui prend une liste délimitée par des virgules des noms de la ressource personnalisée NetworkAttachmentDefinition
.
Créez la spécification d'espace (par exemple 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
Créez l'espace (par exemple, kubectl create -f my-multi-cni-crd.yaml
crée l'espace sample-pod
).
Une fois l'espace créé, il disposera de trois interfaces réseau :
lo
, l'interface de bouclage ;eth0
, le réseau d'espace par défaut géré par la CNI Antrea ou Calico ;net1
, la nouvelle interface créée via l'annotation k8s.v1.cni.cncf.io/networks: macvlan-conf
.Remarquele réseau par défaut obtient le nom
eth0
et les interfaces d'espace réseau supplémentaires obtiennent le nomnet1
,net2
et ainsi de suite.
Exécutez kubectl describe pod
sur l'espace et vérifiez que l'annotation k8s.v1.cni.cncf.io/network-status
répertorie toutes les interfaces réseau. Par exemple :
$ 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
Exécutez ensuite kubectl exec sample-pod -- ip a show dev net1
pour vérifier si l'interface cible est active et en cours d'exécution avec l'adresse IP répertoriée dans les annotations ci-dessus.
une fois Multus CNI installé dans un cluster, il ne doit pas être supprimé.
La suppression de Multus ne désinstalle pas le fichier de configuration Multus /etc/cni/net.d/00-multus.conf
du répertoire de scripts CNI, ce qui entraîne des problèmes tels que :
Terminating
avec des erreurs dans le journal kubelet
.