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.
NotaMultus CNI no es compatible con los clústeres de carga de trabajo implementados por un supervisor de vSphere with Tanzu.
kubectl
, como se describe en Instalar la CLI de Tanzu y otras herramientas para su uso con un supervisor de vSphere with Tanzu o Instalar la CLI de Tanzu y otras herramientas para su uso con clústeres de administración independientes.large
o extra-large
, como se describe en Tamaños de nodo predefinidos.NotaUna 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:
Si el clúster no tiene un repositorio de paquetes con el paquete Multus CNI instalado, por ejemplo, el repositorio tanzu-standard
, instale uno:
NotaSi 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 nombrestanzu-package-repo-global
.
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-ENDPOINT
es la URL del repositorio de paquetes.
tanzu-standard
es projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0
. 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).(Opcional) Para configurar Multus:
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.
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
NotaAsegúrese de que se pueda acceder al registro de imágenes personalizado si está operando en un entorno restringido por la red.
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
Rellene el archivo de configuración multus-data-values.yaml
con los valores de campo que desee.
Elimine todos los comentarios del archivo multus-data-values.yaml
:
yq -i eval '... comments=""' multus-data-values.yaml
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
.
--namespace
, la CLI de Tanzu instala el paquete en el espacio de nombres default
.kubectl create namespace my-packages
.AVAILABLE-PACKAGE-VERSION
es la versión que recuperó anteriormente (por ejemplo, 3.8.0+vmware.3-tkg.1
).Ejecute tanzu package installed get
para comprobar el estado del paquete instalado.
tanzu package installed get multus-cni --namespace NAMESPACE
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.
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"
}
}'
Cree el recurso; por ejemplo, kubectl create -f multus-cni-crd.yaml
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
.
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
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 invertidoeth0
la red de pods predeterminada administrada por Antrea o Calico CNInet1
la nueva interfaz creada a través de k8s.v1.cni.cncf.io/networks: macvlan-conf
.NotaLa red predeterminada obtiene el nombre
eth0
y las interfaces de pod de red adicionales obtienen el nombrenet1
,net2
, etc.
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.
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:
Terminating
, con errores en el registro kubelet
.