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 aún no tiene instalado el repositorio del paquete standard, instálelo:

    Nota

    Si tiene como objetivo un clúster basado en planes (heredado), omita este paso. Para los clústeres basados en planes, el repositorio de paquetes tanzu-standard se habilita automáticamente en cada clúster, en el espacio de nombres tanzu-package-repo-global.

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    Donde PACKAGE-REPOSITORY-ENDPOINT es la URL del repositorio de paquetes standard. Para esta versión, la URL es projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1.

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

      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, 3.8.0+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:
        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. 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.

Al eliminar Multus, no se desinstala el archivo de configuración /etc/cni/net.d/00-multus.conf del directorio de scripts CNI, lo que impide que el clúster cree nuevos pods.

Este es un problema conocido; consulte Problema n.º 461 en el repositorio Multus.

check-circle-line exclamation-circle-line close-line
Scroll to top icon