Alquiler de direcciones IP enrutables con contenedores Podman

La mayoría de las redes de contenedores tradicionales han sido gestionadas por puentes y Traducción de Direcciones de Red (NAT), o uniéndose a la red del host de alguna manera. A medida que ha evolucionado la función de los contenedores, también lo han hecho los casos de uso para configuraciones de red más dinámicas. Uno de esos casos de uso es para los usuarios que desean que sus contenedores alquilen direcciones IP de los servidores DHCP existentes en su infraestructura de red, sin modificar el contenedor.
Hay varias formas de resolver este problema, dependiendo de su situación. La forma más fácil es usar el macvlan
y dhcp
complementos entregados con containernetworking-plugins
.
Notar: Esta solución solo se aplica a contenedores rootfull. Los contenedores sin raíz no utilizan containernetworking-plugins
.
Seguro macvlan
el macvlan
el complemento es parte del containernetworking-plugins
paquete. Según su descripción, macvlan
es similar a un conmutador conectado a una interfaz de red host. Mediante el uso de interfaces virtuales en combinación con la interfaz de host, cada dispositivo puede tener una dirección MAC separada. Este hecho permite que los servidores DHCP existentes en la red existente interactúen con los dispositivos y asignen direcciones.
el macvlan
plugin también requiere el uso de la dhcp
containernetworking-plugin
. el dhcp
El complemento es un cliente DHCP proxy en nombre del contenedor.
Creación de un archivo de configuración CNI
Para configurar este escenario, primero debe crear manualmente un nuevo archivo de configuración de interfaz de red de contenedor (CNI). Antes de crear el archivo, debe saber qué interfaz de host se utilizará para el enlace. Esta información se puede encontrar utilizando herramientas IP o ifconfig
.
En el siguiente ejemplo, la interfaz de red del host enlazada es enp0s31f6
. El otro campo crítico es el nombre de la red; En este caso lo es example
. Esta es la interfaz que se conecta a la red de destino:
$ cat /etc/cni/net.d/90-example.conflist
{
"cniVersion": "0.4.0",
"name": "example",
"plugins": [
{
"type": "macvlan",
"master": "enp0s31f6",
"ipam": {
"type": "dhcp"
}
}
]
}
Ejecución del complemento DHCP
Como se mencionó anteriormente, el macvlan
y dhcp
containernetworking-plugins
actuar en concierto. el dhcp
El complemento es un cliente DHCP proxy para el contenedor porque la mayoría de las imágenes del contenedor no tienen un cliente DHCP para interactuar con un servidor DHCP. Aunque los complementos se pueden ejecutar manualmente, normalmente automatizará el proceso. Las dos opciones se dan a continuación.
Para ejecutar manualmente el complemento, ejecute:
$ sudo /usr/libexec/cni/dhcp daemon &
Cuando se trata de automatizar este procedimiento, debido a que el dhcp
plugin utiliza un socket, su uso se puede automatizar con systemd
. Solo necesitas un archivo and.
El archivo de socket es el siguiente:
$ cat /usr/lib/systemd/system/io.podman.dhcp.socket
[Unit]
Description=DHCP Client for CNI
[Socket]
ListenStream=%t/cni/dhcp.sock
SocketMode=0600
[Install]
WantedBy=sockets.target
Y el archivo de servicio es:
$ cat /usr/lib/systemd/system/io.podman.dhcp.service
[Unit]
Description=DHCP Client CNI Service
Requires=io.podman.dhcp.socket
After=io.podman.dhcp.socket
[Service]
Type=simple
ExecStart=/usr/libexec/cni/dhcp daemon
TimeoutStopSec=30
KillMode=process
[Install]
WantedBy=multi-user.target
Also=io.podman.dhcp.socket
Solo necesita habilitar e iniciar el socket. De la, systemd
se encarga del resto:
$ sudo systemctl --now enable io.podman.dhcp.socket
Reúnelo todo
Antes de usar el macvlan
complemento, asegúrese de que el dhcp
el complemento se está ejecutando. Para usar la red con macvlan
, simplemente designarlo como la red para usar con el contenedor usando el --network
bandera.
Considere el siguiente ejemplo de ejecutar un contenedor Alpine y verificar la dirección IP de la interfaz de red eth0
:
$ sudo podman run -it --rm --network example alpine ip addr show eth0
2: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 2a:53:89:31:01:73 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.222/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2853:89ff:fe31:173/64 scope link
valid_lft forever preferred_lft forever
En el caso del ejemplo, la red host es 192.168.1.0/24. Tenga en cuenta cómo el eth0
La interfaz del contenedor arrienda una dirección IP de 192.168.1.122. Tenga cuidado, esta configuración puede agotar las direcciones DHCP disponibles si está utilizando una gran cantidad de contenedores de corta duración y un servidor DHCP con arrendamientos prolongados.
Notar: Recuerde, el propósito de dhcp
El complemento debe ser un cliente proxy DHCP para imágenes de contenedores que no tienen un cliente DHCP instalado (como dhclient
). Si desea omitir el uso del complemento, puede crear una imagen de contenedor que contenga un cliente DHCP y asegurarse de que se esté ejecutando cuando se ejecute la imagen del contenedor.
Enfoques alternativos para macvlan
Como se señaló anteriormente, hay varias formas de permitir que los contenedores alquilen direcciones IP en la red de un host. Mientras que la macvlan
enfoque es el más simple, puede usar un enfoque basado en puente usando dhcp
Método de gestión de direcciones IP (IPAM). Sin embargo, la compleja configuración del dhcp-relays
permitir interacciones entre el host, los contenedores y el servidor DHCP está más allá del alcance de este documento.
¿Necesitas saber más sobre redes? Descargar el Hoja de referencia de redes Linux.
Artículos de interés