Uno de los aspectos más importantes en la administración de contenedores LXC es el control fino de recursos y la comprensión del modelo de seguridad. LXD expone los cgroups de Linux para limitar memoria, CPU, procesos y más, mientras que el concepto de contenedores privilegiados vs. no privilegiados define el nivel de aislamiento del host.
Límites de recursos: memoria, CPU y procesos
LXD permite asignar límites de recursos a nivel de contenedor mediante las propiedades limits.*. Estas restricciones se aplican en tiempo real y garantizan que un contenedor no pueda consumir más recursos de los asignados, protegiendo al host y a los demás contenedores.
# Asignar límites de memoria y CPU a un contenedor existente
lxc config set mi-container limits.memory 512MB
lxc config set mi-container limits.memory.swap false
lxc config set mi-container limits.cpu 2
# Límite de procesos y sockets
lxc config set mi-container limits.processes 100
lxc config set mi-container limits.cpu.allowance 50%
# Crear un contenedor con límites desde el inicio
lxc launch ubuntu:24.04 web-prod --config limits.memory=1GB --config limits.cpu=4
Los límites se aplican inmediatamente sin necesidad de reiniciar el contenedor. Puedes verificar la configuración activa consultando la información del contenedor.
# Ver la configuración completa del contenedor
lxc config show mi-container
# Ver solo los límites aplicados
lxc config show mi-container | grep limits
# Probar que el límite de memoria funciona
lxc exec mi-container -- stress --vm 1 --vm-bytes 800M --timeout 30
# (debería fallar o ser OOM-killed si excede 512MB)
Monitorización con lxc top y lxc info –resources
LXD incluye herramientas de monitorización integradas. lxc top muestra el uso de recursos en tiempo real de todos los contenedores, similar a top de Linux pero con una vista consolidada del host. lxc info --resources ofrece información detallada de la CPU y memoria de un contenedor específico.
# Monitorización en tiempo real de todos los contenedores
lxc top
# Información detallada de recursos de un contenedor
lxc info mi-container --resources
# Uso de almacenamiento por contenedor
lxc storage info pool-zfs
lxc storage volume list pool-zfs
# Estadísticas detalladas con lxc query (API interna)
lxc query /1.0/containers/mi-container/state
Para monitorización más avanzada, puedes integrar LXD con Prometheus, Telegraf o scripts personalizados que consuman la API REST de LXD. El endpoint /1.0/metrics expone métricas en formato Prometheus de forma nativa en versiones recientes de LXD.
# Habilitar métricas Prometheus en LXD
lxc config set core.https_address :8443
# Luego consultar:
curl -k https://localhost:8443/1.0/metrics
# Script simple para monitorear uso de memoria
for c in $(lxc list -c n --format csv); do
mem=$(lxc info $c --resources | grep "Memory (current)" | awk '{print $3}')
echo "$c: $mem"
done
Contenedores no privilegiados vs. privilegiados
LXD distingue dos modos de seguridad fundamentales. Por defecto, los contenedores se ejecutan como no privilegiados (unprivileged): el UID 0 dentro del contenedor se mapea a un UID no root en el host, limitando drásticamente el daño potencial si el contenedor es comprometido. Los contenedores privilegiados (security.privileged=true) ejecutan su UID 0 como root real en el host.
# Crear un contenedor no privilegiado (por defecto)
lxc launch ubuntu:24.04 seguro
# Crear un contenedor privilegiado (requiere acceso root real)
lxc launch ubuntu:24.04 root-access --config security.privileged=true
# Ver el modo de seguridad de un contenedor
lxc config get mi-container security.privileged
# false → no privilegiado (recomendado)
# true → privilegiado (mayor riesgo)
Usos recomendados de cada tipo
La elección entre contenedores privilegiados y no privilegiados depende del caso de uso:
# NO PRIVILEGIADOS (recomendado para casi todo):
# ✅ Aislamiento seguro: el root del contenedor NO es root en el host
# ✅ UID mapping (subuid/subgid): 0 → 1000000+ en el host
# ✅ Compatible con todos los backends de almacenamiento
# ✅ Ideal para servidores web, bases de datos, aplicaciones
# ⚠️ No puede montar sistemas de archivos del host
# ⚠️ No puede cargar módulos del kernel
# PRIVILEGIADOS (solo cuando sea estrictamente necesario):
# ❌ El root del contenedor ES root en el host
# ❌ Mayor superficie de ataque
# ❌ Requiere trust público o token de confianza
# ✅ Puede montar FUSE, NFS, CIFS
# ✅ Puede cargar módulos del kernel (dentro del contenedor)
# ✅ Puede ejecutar systemd como PID 1
# ✅ Útil para contenedores que actúan como routers, VPN, firewalls
Como regla general, usa siempre contenedores no privilegiados a menos que tengas una necesidad técnica concreta que lo requiera. Incluso en entornos de desarrollo, es mejor simular las condiciones de producción con contenedores no privilegiados. Si necesitas funcionalidades como montar NFS o usar FUSE dentro del contenedor, considera si realmente necesitas privilegios completos o si existe una alternativa más segura mediante dispositivos LXD.
Con estos conceptos dominados, tienes las herramientas para administrar contenedores LXC en producción con control de recursos fino y una postura de seguridad adecuada para tu infraestructura.
