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.

Índice

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

    Subir