Distribuzione di Multus nei cluster del carico di lavoro

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.

Nota

Multus CNI non è supportato per i cluster del carico di lavoro distribuiti da un supervisore vSphere with Tanzu.

Prerequisiti

Installare il pacchetto Multus CNI

Nota

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

  1. Se nel cluster non è installato un repository dei pacchetti con il pacchetto Multus CNI, ad esempio il repository tanzu-standard, installarne uno:

    Nota

    Se 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 nomi tanzu-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.

      • Per questa versione, l'URL di 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.
  2. (Facoltativo) Per configurare Multus:

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

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

      assicurarsi che il registro immagini personalizzato possa essere raggiunto se si opera in un ambiente con restrizioni di rete.

    3. Eseguire il comando tanzu package available getcon --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

    4. Compilare il file di configurazione multus-data-values.yaml con i valori del campo desiderato.

  3. Rimuovere tutti i commenti dal file multus-data-values.yaml:

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

      • Se il flag --namespace non viene specificato, la CLI di Tanzu installa il pacchetto nello spazio dei nomi default.
      • Lo spazio dei nomi specificato deve essere già stato creato, ad esempio eseguendo kubectl create namespace my-packages.
    • AVAILABLE-PACKAGE-VERSION è la versione recuperata in precedenza, ad esempio 3.8.0+vmware.3-tkg.1.
  5. Eseguire tanzu package installed get per verificare lo stato del pacchetto installato.

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

    1. 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"
          }
        }'
      
    2. Creare la risorsa; ad esempio kubectl create -f multus-cni-crd.yaml

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

    1. 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
      
      
    2. 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 loopback
  • eth0 la rete pod predefinita gestita da Antrea o Calico CNI
  • net1 la nuova interfaccia creata tramite l'annotazione k8s.v1.cni.cncf.io/networks: macvlan-conf.
Nota

La rete predefinita ottiene il nome eth0 mentre altre interfacce del pod di rete ottengono il nome net1, net2 e così via.

Convalidare Multus

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.

Eliminare la Multus non supportata

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:

  • Non è possibile creare nuovi pod. Si tratta di un problema noto; vedere Problema #461 nel repository Multus.
  • Non è possibile eliminare i pod creati prima dell'eliminazione di Multus. I pod rimangono bloccati con stato Terminating con errori nel registro kubelet.
check-circle-line exclamation-circle-line close-line
Scroll to top icon