Configuración de LXD en un VPS para aislamiento de servicios y ejecución de contenedores ligeros
TL;DR
En esta guía detallada, configuraremos LXD en su VPS para crear y gestionar contenedores aislados y ligeros. LXD permite ejecutar múltiples aplicaciones o servicios, cada uno en su propio entorno limpio, minimizando conflictos y mejorando la seguridad, mientras utiliza eficientemente los recursos del servidor. Aprenderá a instalar LXD, configurar su red y almacenamiento, iniciar contenedores y asegurar su funcionamiento estable y copias de seguridad.
- Instalación e inicialización de LXD: Pasos detallados para instalar LXD en Ubuntu 24.04 LTS y su configuración básica.
- Aislamiento y seguridad: Creación de contenedores aislados para cada servicio, aprovechando las ventajas de la virtualización ligera de LXD.
- Gestión de recursos: Configuración de perfiles para contenedores con límites de CPU, RAM y espacio en disco.
- Configuración de red: Configuración de una red puente para contenedores, que permite el acceso externo y la comunicación interna.
- Copia de seguridad: Implementación de una estrategia de copias de seguridad utilizando instantáneas de LXD y almacenamiento externo.
- Mantenimiento: Recomendaciones para actualizar LXD y gestionar el ciclo de vida de los contenedores.
Qué configuramos y por qué
En esta guía, nos centraremos en la configuración de LXD — un gestor de contenedores de sistema — en su servidor privado virtual (VPS). LXD permite ejecutar sistemas operativos completos (por ejemplo, Ubuntu, Debian, Alpine) dentro de contenedores ligeros que, a diferencia de las máquinas virtuales (como KVM), utilizan el kernel del sistema operativo anfitrión principal. Esto proporciona una sobrecarga significativamente menor, un arranque más rápido y una alta densidad de servicios en un solo servidor, manteniendo un alto nivel de aislamiento.
Qué obtendrá el lector al final: Aprenderá a utilizar eficientemente los recursos de su VPS, ejecutando diversos servicios (servidores web, bases de datos, servidores de juegos, nodos de blockchain) en contenedores separados y completamente aislados. Cada contenedor tendrá su propio sistema de archivos, pila de red y conjunto de procesos, lo que evitará conflictos de dependencias y simplificará la gestión. Esta es una solución ideal para desarrolladores, fundadores de SaaS y entusiastas que necesitan flexibilidad y control sobre su infraestructura sin la necesidad de alquilar múltiples VPS individuales.
Qué alternativas existen y por qué self-hosted en un VPS:
- Máquinas virtuales (KVM, VMware): Proporcionan aislamiento de hardware completo, pero tienen una sobrecarga significativa de recursos (cada VM requiere su propio kernel de SO, más RAM y CPU). LXD es más eficiente para tareas donde se requiere aislamiento a nivel de SO, no de hardware.
- Docker: Una excelente herramienta para la contenerización de aplicaciones, pero está orientada a la ejecución de procesos individuales o microservicios, no de sistemas operativos completos. LXD, a su vez, permite ejecutar "máquinas virtuales" a nivel de contenedores, lo que es más conveniente para migrar aplicaciones existentes o ejecutar servicios que requieren un sistema init completo (systemd).
- Servicios gestionados en la nube (AWS EC2, Google Cloud Compute): Convenientes y escalables, pero a menudo más caros y menos flexibles para quienes desean un control total sobre su entorno. La configuración self-hosted de LXD en un VPS le brinda acceso completo al sistema, le permite optimizar los costos y adaptar la configuración a sus necesidades únicas.
La elección de LXD self-hosted en un VPS se justifica cuando necesita flexibilidad, aislamiento, uso eficiente de los recursos, pero al mismo tiempo desea evitar altos costos y las limitaciones de los proveedores de la nube.
Qué configuración de VPS se necesita para esta tarea
La elección de un VPS adecuado para LXD depende de la cantidad y el tipo de contenedores que planee ejecutar. LXD en sí mismo es muy ligero, pero cada contenedor en ejecución consume recursos.
Requisitos mínimos para el host LXD (sin contar los contenedores):
- CPU: 1-2 vCPU (para el host y varios contenedores ligeros). Los procesadores modernos con instrucciones de virtualización (VT-x/AMD-V) son deseables, pero LXD puede funcionar sin ellos, aunque con menor rendimiento.
- RAM: 2 GB (para el host y operaciones básicas de LXD). Si planea ejecutar contenedores con bases de datos o servidores web, necesitará más.
- Disco: 40-60 GB NVMe SSD. LXD puede funcionar con HDD, pero un SSD mejora significativamente el rendimiento de E/S, lo cual es crítico para los contenedores. NVMe proporciona la máxima velocidad.
- Red: Puerto de 1 Gbps (estándar para la mayoría de los VPS).
Plan de VPS específico para la tarea (por ejemplo, para 3-5 contenedores: servidor web, base de datos, servidor VPN):
- CPU: 4 vCPU
- RAM: 8 GB
- Disco: 160-200 GB NVMe SSD (incluyendo espacio para datos de contenedores e instantáneas)
- Red: 1 Gbps, sin restricciones de tráfico o con un límite alto.
Para alquilar un VPS con las características indicadas, asegúrese de que el proveedor ofrezca NVMe SSD y una cantidad suficiente de núcleos/RAM para sus necesidades. La mayoría de los proveedores de VPS modernos ofrecen estas configuraciones.
Cuándo se necesita un servidor dedicado, no un VPS:
Si planea ejecutar decenas de contenedores, bases de datos de alta carga, servidores de juegos con muchos jugadores, o tiene requisitos de hardware muy específicos (por ejemplo, GPU para aprendizaje automático), entonces debería considerar un servidor dedicado. Los servidores dedicados le proporcionan todos los recursos físicos de la máquina, lo que elimina el "ruido de vecinos" y ofrece el máximo rendimiento. Además, los servidores dedicados a menudo tienen opciones más flexibles para el subsistema de disco (RAID, HDD+SSD).
Ubicación: en qué influye
La elección de la ubicación del VPS juega un papel importante, especialmente para servicios críticos en cuanto a latencia:
- Latencia: Cuanto más cerca esté el servidor de su público objetivo, menor será la latencia y más rápida la respuesta. Para los sitios web, esto afecta la velocidad de carga de las páginas; para los servidores de juegos, el ping.
- Factores geopolíticos y legislación: En algunos países, existen leyes más estrictas sobre el almacenamiento de datos o la censura. Tenga esto en cuenta al elegir una ubicación para datos confidenciales o servicios que requieran un alto grado de privacidad.
- Costo: Los precios de los VPS pueden variar según la ubicación debido a las diferencias en el costo de la electricidad, el alquiler del centro de datos y los impuestos.
Siempre elija una ubicación que esté geográficamente más cerca de la mayoría de sus usuarios o de usted, si es el principal consumidor del servicio.
Preparación del servidor
Antes de instalar LXD, es necesario realizar una configuración básica de su VPS para garantizar la seguridad y estabilidad. Utilizaremos Ubuntu Server 24.04 LTS como sistema operativo anfitrión principal.
1. Conexión por SSH
Conéctese a su servidor como usuario root o como el usuario proporcionado por el proveedor:
ssh root@ВАШ_IP_АДРЕС
2. Actualización del sistema
Primero, actualice todos los paquetes a las versiones más recientes:
sudo apt update # Actualizar la lista de paquetes
sudo apt upgrade -y # Actualizar los paquetes instalados sin pedir confirmación
sudo apt autoremove -y # Eliminar dependencias innecesarias
3. Creación de un nuevo usuario con permisos sudo (si aún no existe)
Trabajar como root no es seguro. Cree un nuevo usuario y concédale permisos sudo.
adduser ваш_пользователь # Crear un nuevo usuario
usermod -aG sudo ваш_пользователь # Añadir el usuario al grupo sudo
Ahora, cierre la sesión de root e inicie sesión con el nuevo usuario:
exit
ssh ваш_пользователь@ВАШ_IP_АДРЕС
4. Configuración de claves SSH (recomendado)
Para mejorar la seguridad, se recomienda usar claves SSH en lugar de contraseñas. Si aún no tiene claves, genérelas en su máquina local:
# En su máquina local
ssh-keygen -t rsa -b 4096 -C "ваш[email protected]"
Luego, copie la clave pública al servidor:
# En su máquina local
ssh-copy-id ваш_пользователь@ВАШ_IP_АДРЕС
Después de verificar el inicio de sesión con clave, desactive la autenticación por contraseña en /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Encuentre las líneas y establezca los valores:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
Reinicie el servicio SSH:
sudo systemctl restart sshd
5. Configuración del Firewall (UFW)
Habilite el firewall UFW y permita solo los puertos necesarios (SSH, HTTP/HTTPS, así como los puertos que utilizarán los contenedores).
sudo apt install ufw -y # Instalar UFW
sudo ufw allow OpenSSH # Permitir SSH (puerto 22)
sudo ufw allow http # Permitir HTTP (puerto 80)
sudo ufw allow https # Permitir HTTPS (puerto 443)
sudo ufw enable # Habilitar UFW
sudo ufw status verbose # Verificar el estado de UFW
Más tarde, si sus contenedores utilizarán otros puertos, también deberá abrirlos.
6. Instalación de Fail2Ban
Fail2Ban ayuda a proteger el servidor contra ataques de fuerza bruta, bloqueando las direcciones IP desde las cuales se producen numerosos intentos fallidos de inicio de sesión.
sudo apt install fail2ban -y # Instalar Fail2Ban
sudo systemctl enable fail2ban # Habilitar el inicio automático del servicio
sudo systemctl start fail2ban # Iniciar el servicio
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Crear una configuración local
Puede editar /etc/fail2ban/jail.local para configurar las reglas, pero la configuración predeterminada para SSH ya es bastante buena.
sudo systemctl restart fail2ban # Reiniciar Fail2Ban después de los cambios
Su servidor ahora está protegido de forma básica y listo para la instalación de LXD.
Instalación de software — paso a paso
Ahora que el servidor está preparado, procedemos a la instalación de LXD. Utilizaremos el paquete snap, ya que es el método recomendado y más actualizado para instalar LXD en Ubuntu.
1. Instalación de LXD a través de Snap
LXD en Ubuntu se distribuye como un paquete snap, lo que garantiza su actualidad y aislamiento. Para Ubuntu 24.04 LTS, snap ya viene instalado por defecto.
sudo snap install lxd --channel=6.0/stable # Instalación de LXD 6.0 LTS (versión actual para 2026)
Después de la instalación, añada su usuario al grupo lxd, para que pueda gestionar LXD sin sudo:
sudo usermod -aG lxd ваш_пользователь # Añadir usuario al grupo lxd
newgrp lxd # Aplicar cambios de grupo sin reiniciar sesión (o simplemente reinicie sesión)
Asegúrese de que LXD está instalado y disponible:
lxd --version # Verificar la versión de LXD
2. Inicialización de LXD
Después de instalar LXD, es necesario inicializarlo, configurando los ajustes básicos de almacenamiento y red. Este es un proceso interactivo.
lxd init # Iniciar la inicialización interactiva de LXD
Durante la inicialización, se le harán las siguientes preguntas. Aquí están las respuestas recomendadas para la mayoría de los escenarios de VPS:
Would you like to use LXD clustering? (yes/no) [default=no]:no (para un solo VPS, no se necesita clúster)Do you want to setup a new storage pool? (yes/no) [default=yes]:yesName of the new storage pool [default=default]:default (o cualquier otro nombre)Would you like to use an existing block device? (yes/no) [default=no]:no (si no tiene un disco separado)Would you like to use a new loop device? (yes/no) [default=yes]:yes (creará un archivo de imagen para almacenar contenedores)Size in GiB of the new loop device (minimum 4GiB) [default=100GiB]:50GiB (o más, dependiendo del tamaño de su disco y sus planes. Deje espacio para el host)Would you like to connect to a remote LXD daemon? (yes/no) [default=no]:noWould you like to setup a new network bridge? (yes/no) [default=yes]:yesWhat should the new bridge be called? [default=lxdbr0]:lxdbr0 (nombre estándar)What IPv4 address should be used? (CIDR format, e.g. 10.0.0.1/24) [default=10.200.200.1/24]:10.200.200.1/24 (o cualquier otro rango privado que no se superponga con su red local)Would you like LXD to NAT traffic on its own? (yes/no) [default=yes]:yes (para el acceso de los contenedores a internet)What IPv6 address should be used? (CIDR format, e.g. fd42:42:42:42::1/64) [default=none]:none (si no se necesita IPv6)Would you like the LXD daemon to be available over the network? (yes/no) [default=no]:no (si no planea gestionar LXD de forma remota)Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:yesWould you like a YAML summary of your configuration? (yes/no) [default=yes]:yes
Una vez completada la inicialización, LXD está listo para funcionar. Puede verificar el estado de la red:
lxc network list # Ver el estado de las redes LXD configuradas
3. Iniciar el primer contenedor
Ahora, vamos a iniciar nuestro primer contenedor. Por ejemplo, Ubuntu 22.04 LTS.
lxc launch ubuntu:22.04 my-first-container # Iniciar un contenedor con la imagen de Ubuntu 22.04 LTS bajo el nombre my-first-container
Verifique el estado del contenedor:
lxc list # Lista de todos los contenedores en ejecución
Verá el estado RUNNING y la dirección IP asignada al contenedor en la red lxdbr0.
4. Acceso al contenedor y configuración básica
Puede obtener una línea de comandos dentro del contenedor:
lxc exec my-first-container bash # Ejecutar el comando bash dentro del contenedor
Dentro del contenedor se puede trabajar como en un sistema Ubuntu normal. Actualícelo:
apt update && apt upgrade -y # Actualizar paquetes dentro del contenedor
exit # Salir del contenedor
5. Configuración de un perfil para contenedores (ejemplo)
Los perfiles de LXD permiten aplicar configuraciones estándar (recursos, red) a múltiples contenedores. Crearemos un perfil para un servidor web.
lxc profile copy default webserver # Copiar el perfil predeterminado a uno nuevo 'webserver'
lxc profile edit webserver # Editar el nuevo perfil
En el archivo YAML abierto, añada o modifique la sección limits:
config:
limits.cpu: "2" # Límite de CPU a 2 núcleos
limits.memory: "2GB" # Límite de RAM a 2GB
limits.disk: "50GB" # Límite de disco a 50GB (si usa un pool con cuotas)
user.user-data: | # Ejemplo de cloud-init para la configuración inicial
#cloud-config
runcmd:
- echo "Hello from cloud-init!" > /root/cloud-init-test.txt
packages:
- nginx
users:
- name: myuser
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC... your_public_key_here
Guarde y cierre el archivo. Ahora puede iniciar contenedores con este perfil:
lxc launch ubuntu:22.04 my-web-server --profile webserver # Iniciar un contenedor con el perfil webserver
Esto garantiza la estandarización y simplifica la gestión de recursos.
6. Reenvío de puertos en el host para acceder a los contenedores
Por defecto, los contenedores tienen direcciones IP privadas. Para hacer que un servicio dentro de un contenedor sea accesible desde internet, es necesario reenviar un puerto del host al contenedor. Por ejemplo, si Nginx en el contenedor my-web-server escucha en el puerto 80, y usted quiere que sea accesible a través del puerto 80 de su VPS:
lxc config device add my-web-server myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:10.200.200.X:80 # Reenvío del puerto 80 del host al contenedor
Reemplace 10.200.200.X con la dirección IP real de su contenedor (puede averiguarlo con lxc list). No olvide abrir el puerto 80 en el UFW del host, si aún no está abierto.