Déployer Multus sur des clusters de charge de travail

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.

Remarque

Multus CNI n'est pas pris en charge pour les clusters de charge de travail déployés par un superviseur vSphere with Tanzu.

Conditions requises

Installer le module de Multus CNI

Remarque

une 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 :

  1. 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 :

    Remarque

    Si 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 noms tanzu-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.

      • Pour cette version, l'URL 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.
  2. (Facultatif) Pour configurer Multus :

    1. 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
      

      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.

    2. 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
      
      Remarque

      assurez-vous que votre registre d'images personnalisé est accessible si vous travaillez dans un environnement restreint au réseau.

    3. 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

    4. Remplissez le fichier de configuration multus-data-values.yaml avec les valeurs de champ souhaitées.

  3. Supprimez tous les commentaires du fichier multus-data-values.yaml :

    yq -i eval '... comments=""' multus-data-values.yaml
    
  4. 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.

      • Si l'indicateur --namespace n'est pas spécifié, la CLI Tanzu installe le module dans l'espace de noms default.
      • L'espace de noms spécifié doit déjà exister, par exemple en exécutant 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.
  5. Exécutez tanzu package installed get pour vérifier l'état du module installé.

    tanzu package installed get multus-cni --namespace NAMESPACE
    
  6. 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.

    1. 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"
          }
        }'
      
    2. Créez la ressource (par exemple, kubectl create -f multus-cni-crd.yaml).

  7. 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.

    1. 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
      
      
    2. 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.
Remarque

le réseau par défaut obtient le nom eth0 et les interfaces d'espace réseau supplémentaires obtiennent le nom net1, net2 et ainsi de suite.

Validation de Multus

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.

Suppression de Multus non pris en charge

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 :

  • Échec de la création d'espaces. Il s'agit d'un problème connu, reportez-vous à la section Issue #461 dans le référentiel Multus.
  • Échec de la suppression des espaces créés avant la suppression de Multus. Les espaces restent bloqués avec l'état Terminating avec des erreurs dans le journal kubelet.
check-circle-line exclamation-circle-line close-line
Scroll to top icon