Podman Rootless con Traefik como proxy

Podman & Traefik

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:  @Podman_io@fosstodon.org

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

podman network and domain

Proseguimos con la línea 34 del archivo docker-compose.yml y agregamos el subdominio por el cual queremos acceder al dashboard de Traefik.

podman-compose

El archivo traefik.yml en la línea 29 agregamos el email donde recibiremos todas las notificaciones sobre nuestros SSL.

traefik with podman

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

dashboard traefik/podman
Seguridad del Dashboard
traefik/podman dashboard
Traefik Dashboard
Contenedores podman expuestos por traefik
Microservicios de podman expuestos por Traefik
Administrador de sistemas, un curioso amante de las tecnologías.