En el mundo de los contenedores y la orquestación, Docker ha sido el líder indiscutible durante muchos años. Sin embargo, alternativas como Podman están ganando terreno gracias a sus características avanzadas y su enfoque sin daemon. Una de las ventajas más destacadas de Podman es su capacidad para funcionar en modo rootless, lo que aumenta la seguridad y reduce los riesgos al no requerir privilegios de superusuario.
Por otro lado, Traefik se ha consolidado como uno de los proxy reversos más eficientes y versátiles, especialmente diseñado para entornos de microservicios.
En este artículo, exploraremos cómo configurar y utilizar Podman en modo rootless junto con Traefik para gestionar y enrutar el tráfico de nuestras aplicaciones de contenedores. Veremos cómo aprovechar las capacidades de Podman rootless para ejecutar contenedores de manera eficiente y segura, y cómo integrar Traefik para gestionar el enrutamiento y balanceo de carga de nuestras aplicaciones. Desde la instalación y configuración básica hasta ejemplos prácticos de implementación, te guiaremos paso a paso para que puedas aprovechar al máximo estas poderosas herramientas sin necesidad de privilegios de superusuario.
Preparando el entorno
Detalles de subuid y subgid
Podman en modo rootless requiere que el usuario que lo ejecute tenga un rango de UIDs listados en los archivos /etc/subuid
y /etc/subgid
. El paquete shadow-utils
o newuid
proporciona estos archivos en diferentes distribuciones y deben estar instalados en el sistema. Se requieren privilegios de superusuario para agregar o actualizar entradas en estos archivos.
Nota: No detallaré la instalación de Podman, pero en un host Fedora 40 (como en mi caso), es tan simple como ejecutar # dnf install podman podman-compose
. En cuanto a habilitar las capacidades sin privilegios, asegúrate de configurar /etc/subuid
y /etc/subgid
para tu usuario no privilegiado según este tutorial de Podman(En mi caso no fue necesario hacer nada, creo que en las últimas versiones de GNU/Linux esto viene configurado).
Para cada usuario que se le permitirá crear contenedores, actualiza /etc/subuid
y /etc/subgid
para el usuario con campos que se vean como el siguiente bloque. Ten en cuenta que los valores para cada usuario deben ser únicos. Si hay superposición, existe la posibilidad de que un usuario utilice el espacio de nombres de otro usuario y pueda corromperlo.
$cat /etc/subgid
saiyans:100000:65536
Permitiendo el uso del puerto 80 & 443 por un usuario regular no-root
Para ejecutar Traefik sin privilegios de root, necesitamos permitir que los usuarios no privilegiados puedan enlazar puertos privilegiados modificando un parámetro del kernel.
Usaremos sysctl
para hacer esto (como root):
# sysctl net.ipv4.ip_unprivileged_port_start=80
Lo hacemos permanente para no tener que habilitarlo en cada reinicio de sistema.
# echo "net.ipv4.ip_unprivileged_port_start=80" > /etc/sysctl.d/user_priv_ports.conf
Activando el Socket API de Podman
Primero procederemos a activar la función de Systemd ‘linger’ para que permita la ejecución de procesos Systemd en usuarios sin privilegios root a pesar de que el usuario no tenga la sesión iniciada.
$ sudo loginctl enable-linger tu-usuario
Activamos el socket podman
Esto se hace sin sudo, desde el usuario no-root el cual ejecutara contenedores rootless
$ systemctl --user start podman.socket
$ systemctl --user enable podman.socket
Probamos si todo marcha bien ejecutaremos un contenedor test
$ podman run quay.io/podman/hello
El resultado debería ser como el siguiente
$ podman run quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob 81df7ff16254 done |
Copying config 5dd467fce5 done |
Writing manifest to image destination
!... Hello Podman World ...!
.--"--.
/ - - \
/ (O) (O) \
~~~| -=(,Y,)=- |
.---. /` \ |~~
~/ o o \~~~~.----. ~~
| =(X)= |~ / (O (O) \
~~~~~~~ ~| =(Y_)=- |
~~~~ ~~~| U |~~
Project: https://github.com/containers/podman
Website: https://podman.io
Desktop: https://podman-desktop.io
Documents: https://docs.podman.io
YouTube: https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon: @[email protected]
Inicializando el contenedor de Traefik
Clonamos el repositorio
$ git clone https://github.com/tomasmetal23/traefik_podman.git && cd traefik_podman
Editaremos varios archivos, empezamos con el archivo .env
donde asignaremos el dominio principal al cual se le resolverán los certificados SSL, también está la variable para el nombre de la red podman que usara el contenedor de Traefik, recomiendo dejarla así si no entendemos muchos sobre el tema.
Copiamos el archivo env
a .env
y editamos la variable MY_DOMAIN
$ cp env .env && nano .env
Proseguimos con la línea 34 del archivo docker-compose.yml
y agregamos el subdominio por el cual queremos acceder al dashboard de Traefik.
El archivo traefik.yml
en la línea 29 agregamos el email donde recibiremos todas las notificaciones sobre nuestros SSL.
Y el archivo users_credentials
en el cual agregaremos las credenciales de acceso a nuestro dashboard Traefik, lo pueden crear desde cualquier sitio web similar Htpasswd Generator.
Creamos el archivo donde se almacenaran los SSL y le otorgamos los permisos necesarios.
$ touch acme.json && chmod 0600 acme.json
Originemos la red
$ podman network create web
Procedemos con el deploy
$ podman-compose up -d
Cabe mencionar que tengo desactivado en este stack los logs de Traefik, se me acumulaban llenando mi pequeño ssd.
Accedo a mi subdominio y me pide la contraseña para ver el dashboard de Traefik
Administrador de sistemas, un curioso amante de las tecnologías.