Implementar Multus en clústeres de carga de trabajo

Multus CNI es un complemento de interfaz de red de contenedor (Container Network Interface, CNI) para Kubernetes que permite asociar interfaces de varias redes a un único pod y asociar cada una con un rango de direcciones diferente.

En este tema se explica cómo instalar el paquete Multus en un clúster de carga de trabajo implementado por un clúster de administración independiente y usarlo para crear pods con varias interfaces de red. Por ejemplo, Antrea o Calico como CNI principal y una interfaz secundaria, como dispositivos macvlan o ipvlan o SR-IOV o DPDK para interfaces aceleradas o de hardware.

Los binarios de macvlan e ipvlan ya están instalados en la plantilla de nodo del clúster de carga de trabajo.

Nota

Multus CNI no es compatible con los clústeres de carga de trabajo implementados por un supervisor de vSphere with Tanzu.

Requisitos previos

Instalar el paquete Multus CNI

Nota

Una vez que Multus CNI está instalada en un clúster, no debe eliminarse. Consulte Eliminar Multus no compatible a continuación.

Para instalar el paquete Multus CNI en un clúster de carga de trabajo y configurar el clúster para que lo utilice:

  1. Si el clúster no tiene un repositorio de paquetes con el paquete Multus CNI instalado, por ejemplo, el repositorio tanzu-standard, instale uno:

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    Donde:

    • PACKAGE-REPO-NAME es el nombre del repositorio de paquetes, como tanzu-standard o el nombre de un registro de imagen privado configurado con variables ADDITIONAL_IMAGE_REGISTRY.
    • PACKAGE-REPO-ENDPOINTes la URL del repositorio de paquetes.

      • En esta versión, la URL tanzu-standard es projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16. Consulte Repositorios de paquetes de lista para obtener este valor de la CLI de Tanzu, o bien en Tanzu Mission Control, consulte la lista Complementos (Addons) > Repositorios (Repositories) en el panel Clúster (Cluster).
  2. (Opcional) Para configurar Multus:

    1. Cree un archivo de configuración que recupere los parámetros Multus e impleméntelo como Daemonset.

      tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
      

      Donde PACKAGE-VERSION es la versión del paquete de Multus que desea instalar y FILE-PATH es la ubicación en la que desea guardar el archivo de configuración, por ejemplo, multus-data-values.yaml.

      Consulte los parámetros entrypoint.sh en el repositorio de Multus CNI para obtener información sobre la configuración del archivo de configuración.

    2. Ejecute el comando tanzu package available list para enumerar las versiones disponibles del paquete Multus, por ejemplo:

      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
      
      Nota

      Asegúrese de que se pueda acceder al registro de imágenes personalizado si está operando en un entorno restringido por la red.

    3. Ejecute el comando tanzu package available get con --values-schema para ver qué valores de campo se pueden establecer:

      tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
      

      Donde: - VERSION es una versión que aparece en los resultados de tanzu package available list: FORMAT es yaml o json

    4. Rellene el archivo de configuración multus-data-values.yaml con los valores de campo que desee.

  3. Elimine todos los comentarios del archivo multus-data-values.yaml:

    yq -i eval '... comments=""' multus-data-values.yaml
    
  4. Ejecute tanzu package install para instalar el paquete.

    tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
    

    Donde:

    • TARGET-NAMESPACE es el espacio de nombres en el que se desea instalar el paquete Multus. Por ejemplo, el espacio de nombres my-packages o tanzu-cli-managed-packages.

      • Si no se especifica la marca --namespace, la CLI de Tanzu instala el paquete en el espacio de nombres default.
      • El espacio de nombres especificado ya debe existir, por ejemplo, al haber ejecutado kubectl create namespace my-packages.
    • AVAILABLE-PACKAGE-VERSION es la versión que recuperó anteriormente (por ejemplo, 4.0.1+vmware.1-tkg.1).
  5. Ejecute tanzu package installed get para comprobar el estado del paquete instalado.

    tanzu package installed get multus-cni --namespace NAMESPACE
    
  6. Cree una definición de recursos personalizada (Custom Resource Definition, CRD) para NetworkAttachmentDefinition que defina la configuración de CNI para las interfaces de red que utilizará Multus CNI.

    1. Cree una especificación de CRD. Por ejemplo, este multus-cni-crd.yaml especifica un NetworkAttachmentDefinition denominado macvlan-conf que 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. Cree el recurso; por ejemplo, kubectl create -f multus-cni-crd.yaml

  7. Cree un pod con la anotación k8s.v1.cni.cncf.io/networks, que toma una lista delimitada por comas de los nombres del recurso personalizado NetworkAttachmentDefinition.

    1. Cree la especificación del pod, por ejemplo, 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
      
    2. Crear el pod; por ejemplo, kubectl create -f my-multi-cni-crd.yaml crea el pod sample-pod.

Una vez creado el pod, tendrá tres interfaces de red:

  • lo la interfaz de bucle invertido
  • eth0 la red de pods predeterminada administrada por Antrea o Calico CNI
  • net1 la nueva interfaz creada a través de k8s.v1.cni.cncf.io/networks: macvlan-conf.
Nota

La red predeterminada obtiene el nombre eth0 y las interfaces de pod de red adicionales obtienen el nombre net1, net2, etc.

Validar Multus

Ejecute kubectl describe pod en el pod y confirme que el k8s.v1.cni.cncf.io/network-status de anotación enumera todas las interfaces de red. Por ejemplo:

$ 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

A continuación, ejecute kubectl exec sample-pod -- ip a show dev net1 para comprobar si la interfaz de destino está activa y en ejecución con la DIRECCIÓN IP indicada en las anotaciones anteriores.

No se admite la eliminación de Multus

Una vez que Multus CNI está instalada en un clúster, no debe eliminarse.

La eliminación de Multus no desinstala el archivo de configuración de Multus /etc/cni/net.d/00-multus.conf del directorio de scripts CNI, lo que genera errores como los siguientes:

  • Error al crear nuevos pods. Este es un problema conocido; consulte Problema n.º 461 en el repositorio Multus.
  • Error al eliminar los pods creados con antes de eliminar Multus. Los pods permanecen bloqueados con el estado Terminating, con errores en el registro kubelet.
check-circle-line exclamation-circle-line close-line
Scroll to top icon