Whereabouts es un complemento CNI de administración de direcciones IP (IP Address Management, IPAM) que asigna dinámicamente direcciones IP a los pods en todos los nodos de un clúster. En comparación con otros complementos de IPAM, como host-local, que solo asigna direcciones IP a pods en el mismo nodo, whereabouts asigna direcciones IP en todo el clúster.
En este tema, mostraremos cómo se puede asociar una interfaz de red secundaria a un pod con la dirección IP asignada en el rango especificado mediante whereabouts. Por ejemplo, tendrá Antrea o Calico como la CNI principal, una interfaz secundaria creada con macvlan o ipvlan y Whereabouts como la CNI de IPAM.
kubectl, como se describe en Instalar la CLI de Tanzu y otras herramientas.large o extra-large, como se describe en Tamaños de nodo predefinidos.Para instalar el paquete Whereabouts en un clúster de carga de trabajo y configurar el clúster para utilizarlo:
Configure e instale Whereabouts.
Cree un archivo de configuración que recupere los parámetros de Whereabouts.
tanzu package available get whereabouts.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
NotaEl espacio de nombres en el que se van a implementar los componentes
whereaboutsdebe serkube-system. Se producirá un error en la instalación de cualquier espacio de nombres personalizado.
Donde PACKAGE-VERSION es la versión del paquete de Whereabouts que desea instalar y FILE-PATH es la ubicación en la que desea guardar el archivo de configuración, por ejemplo, whereabouts-data-values.yaml. El comando anterior creará un archivo de configuración denominado whereabouts-data-values.yaml que contiene los valores predeterminados.
Ejecute el comando tanzu package available list para enumerar las versiones disponibles del paquete Whereabouts, por ejemplo:
tanzu package available list whereabouts.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
whereabouts.tanzu.vmware.com 0.5.1+vmware.2-tkg.1 2022-30-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 whereabouts.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 whereabouts-data-values.yaml con los valores de campo que desee.
Elimine todos los comentarios del archivo whereabouts-data-values.yaml:
yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
Ejecute tanzu package install para instalar el paquete.
tanzu package install whereabouts --package whereabouts.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file whereabouts-data-values.yaml --namespace TARGET-NAMESPACE
Donde:
TARGET-NAMESPACE es el espacio de nombres en el que se desea instalar el paquete Whereabouts. 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, 0.5.1+vmware.2-tkg.1).Ejecute tanzu package installed get para comprobar el estado del paquete instalado.
tanzu package installed get whereabouts -o <json|yaml|table>
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 con Whereabouts como el tipo de IPAM.
Cree una especificación de CRD. Por ejemplo, este multus-cni-crd.yaml especifica una NetworkAttachmentDefinition con el nombre macvlan-conf que configura una CNI macvlan y tiene whereabouts como el tipo de IPAM:
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.1",
"plugins": [
{
"type": "macvlan",
"capabilities": { "ips": true },
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "whereabouts",
"range": "192.168.20.0/24",
"range_start": "192.168.20.10",
"range_end": "192.168.20.100",
"gateway": "192.168.20.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 para especificar la red adicional que desea agregar.
Cree la especificación del pod; por ejemplo, my-multi-cni-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod0
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: pod0
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: docker.io/kserving/tools:latest
Cree el pod. Por ejemplo, kubectl create -f my-multi-cni-crd.yaml crea el pod pod0.
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
eth0y las interfaces de pod de red adicionales obtienen el nombrenet1,net2, etc.
Ejecute kubectl describe pod en pod0 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 pod0
Name: pod0
Namespace: default
Priority: 0
Node: tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time: Thu, 25 August 2022 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.20.11"
],
"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. Repita este paso para validar la configuración de otros pods que creará en el siguiente paso.
Cree dos pods adicionales, pod1 en el mismo nodo y pod2 en un nodo diferente. Utilizaremos estos pods para verificar el acceso a la red dentro de un solo nodo y nodos en el clúster.
Ahora puede comprobar el acceso a la red entre los pods del mismo nodo y los pods del clúster.
Compruebe que el acceso a la red entre los pods del mismo nodo funciona. Por ejemplo, el siguiente comando verifica que pod0 pueda acceder a pod1 a través de su dirección IP asignada.
kubectl exec -it pod0 -- ping -c 3 192.168.20.12
PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
--- 192.168.20.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
Compruebe que el acceso a la red entre los pods de un nodo diferente funcione. Por ejemplo, el siguiente comando verifica que pod0 pueda acceder a pod2 a través de su dirección IP asignada.
kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
--- 192.168.20.13 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms