Configurar redes de contenedores con Podman

Podman usa dos medios diferentes para su pila de red, dependiendo de si el contenedor es o . Cuando se define como ejecutado por el usuario raíz (o equivalente), Podman se basa principalmente en el containernetworking complementos proyecto. Cuando no tiene root, configurado para que lo ejecute un usuario regular, Podman usa el slirp4netns proyecto.

Índice

    Módulos de red y Podman

    Por definición, todos los contenedores en un pod de Podman comparten el mismo espacio de nombres de red. Este hecho significa que tendrán la misma dirección IP, direcciones MAC y asignaciones de puertos. Puede comunicarse fácilmente entre contenedores en un pod usando localhost.

    Red raíz

    Cuando se instala el paquete Podman, generalmente se instala una configuración de red predeterminada en /etc/cni/net.d me gusta 87-podman-bridge.conflist. Además, el nombre de red predeterminado se establece en /usr/share/Contenedores/libpod.conf con la llave cni_default_network. en forma inalterada libpod.conf, el nombre de red predeterminado será la configuración predeterminada proporcionada por el paquete. Puedes copiar el libpod.conf archivo a /etc/Contenedores/libpod.conf si desea cambiar alguna de sus configuraciones predeterminadas.

    Para crear una nueva red para contenedores rootfull, use el podman network pedido. Puede personalizar la red con banderas de comando o cambiándola manualmente más tarde. el podman network create El comando le proporciona la ruta al archivo de configuración de red recién creado:

    $ sudo podman network create
    /etc/cni/net.d/cni-podman4.conflist
    

    Para ver las redes actualmente configuradas, use el podman network ls comando, y para eliminar una red o redes dadas, use podman network rm.

    Notar: Todo podman network los comandos son solo para contenedores rootfull.

    Vea los ejemplos a continuación para saber cómo hacer que funcionen varias formas de comunicación entre contenedores rootfull. Al igual que con muchos temas de redes, existen múltiples formas de lograr un resultado determinado según las restricciones y necesidades. Estos ejemplos reflejan la más simple de estas formas.

    Comunicación entre un contenedor rootfull y el host

    Para comunicarse entre el sistema de contenedor anfitrión y el nginx contenedor, use el mapeo de puertos, que se puede descubrir con el podman port pedido:

    # podman run -dt --rm --publish-all alpine_nginx
    34e3b5c686baa2298c37475864457e1b3a383c6d172266a8847257a33d790cc4
    # podman port -l
    80/tcp -> 0.0.0.0:40109
    # curl http://localhost:40109
    podman rulez
    

    Comunicación entre dos contenedores rootfull

    La comunicación entre dos contenedores rootfull en la misma red se puede lograr utilizando sus direcciones IP:

    # podman run -dt --rm --name nginx alpine_nginx
    2e383ec1ca1873c3665e975bbaf40f98020a288534f686ce08fb243d321a653c
    # sudo podman inspect -f "{{.NetworkSettings.IPAddress}}" nginx
    10.88.6.9
    # podman run -it --rm alpine_nginx /bin/sh
    / # curl http://10.88.6.9
    podman rulez
    

    Comunicación entre dos contenedores rootfull en un pod

    La comunicación entre dos contenedores en un pod es probablemente el método más fácil de todos. Como están en el mismo espacio de nombres de red, se puede usar localhost:

    [[email protected] libpod]# podman run -dt --pod new:mypod --rm --name nginx alpine_nginx
    b72432387f603cd4da14348537cfad6b85424ee5dbc1e3af79a527b01c2e59a6
    [[email protected] libpod]# podman run --pod mypod -it --rm alpine_nginx /bin/sh
    / # curl http://localhost
    podman rulez
    

    Redes sin raíz

    Cuando se utiliza Podman como usuario no root, la configuración de la red es automática. Técnicamente, el contenedor en sí no tiene una dirección IP, porque sin privilegios de raíz, no se puede lograr la asociación de dispositivos de red. Además, hacer ping desde un contenedor sin raíz no funciona porque carece de la capacidad de seguridad CAP_NET_RAW que el ping el comando lo requiere. Si desea hacer ping desde un contenedor sin root, puede permitir que los usuarios envíen paquetes ICMP usando este sysctl pedido:

    # sysctl -w "net.ipv4.ping_group_range=0 2000000" 
    

    Esta acción permitiría que cualquier proceso dentro de estos grupos envíe ping paquetes

    Para comunicarse entre dos o más contenedores no rooteados, hay dos opciones. Lo más sencillo sería poner todos los contenedores en un solo pod. Estos contenedores luego pueden comunicarse usando localhost. Otra ventaja es que no es necesario abrir puertos para que los contenedores se comuniquen directamente entre sí.

    Una segunda opción es usar una técnica de asignación de puertos para asignar puertos a contenedores y luego usar esos puertos para dirigir el tráfico a contenedores específicos.

    Vea los ejemplos a continuación para saber cómo hacer funcionar varias formas de comunicación entre contenedores sin raíz. Como se mencionó anteriormente, hay varias formas de lograr un resultado dado dependiendo de las restricciones y necesidades. Estos ejemplos reflejan la más simple de estas formas.

    Comunicación entre un contenedor no rooteado y el host

    Para comunicarse entre el host del contenedor y un contenedor no rooteado, simplemente puede usar el mapeo de puertos y dirigir el tráfico al puerto asignado por Podman:

    $ podman run -dt --rm -P alpine_nginx
    95faeb0c9010d78fd6073ae4aea2e8a8baf10b77391218790682637c51c3ab4e
    [[email protected] libpod (master)]$ podman port -l
    80/tcp -> 0.0.0.0:38997
    [[email protected] libpod (master)]$ curl http://localhost:38997
    podman rulez
    

    Comunicarse entre dos contenedores sin root

    Hay varias formas no triviales de establecer comunicación entre dos contenedores sin raíz. La más simple es usar la técnica de mapeo de puertos del ejemplo anterior, luego comunicarse con el host desde el segundo contenedor:

    $ podman run -dt --rm -P alpine_nginx
    d73e09326390d5de9a8784daf25a13093e9012c7a1a8bef1febc585fd94f8a5f
    $ podman port -l
    80/tcp -> 0.0.0.0:35527
    $ ip addr show enp0s31f6
    2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
          link/ether c8:5b:76:f3:e9:f8 brd ff:ff:ff:ff:ff:ff
          inet 192.168.1.115/24 brd 192.168.1.255 scope global dynamic noprefixroute enp0s31f6
          valid_lft 78662sec preferred_lft 78662sec
          inet6 fe80::ee11:476a:eea:7924/64 scope link noprefixroute
          valid_lft forever preferred_lft forever
    [[email protected] libpod (master)]$ podman run -it --rm alpine_nginx /bin/sh
    / # curl http://192.168.1.115:35527[4] [5]
    podman rulez
    

    Comunicarse entre dos contenedores sin root en un pod

    Este suele ser el enfoque más fácil para que se comuniquen dos contenedores sin raíz. Ponerlos en un pod les permite comunicarse directamente en localhost:

    $ podman run -dt --rm --pod new:mypod alpine_nginx
    e2add389417957f2871503aeda82b1d826db3c8e00a5241528b59bf5060d5d94
    [[email protected] libpod (master)]$ podman run -it --rm --pod mypod alpine_nginx /bin/sh
    / # curl http://localhost
    podman rulez
    

    Resumen

    Con Podman, recuerde que existen complejidades en la implementación de redes para contenedores rootfull y rootless. Para la comunicación entre varios contenedores, a menudo es más fácil colocar los contenedores en el mismo pod para que compartan un espacio de nombres de red. Para usuarios sin root, si los contenedores no están en un pod, deberá usar puertos expuestos en el host para que se comuniquen entre sí.

    Artículos de interés

    Subir