Introducción a LXD
LXD, Linux Container Daemon, es una herramienta de gestión de los contenedores y máquinas virtuales del sistema operativo Linux, desarrollada por Canonical.
Internamente usa LXC para la gestión de contenedores, pero facilita el uso de los contenedores añadiendo nuevas funcionalidades.
- LXD no trabaja con plantillas, trabaja con imágenes de sistemas operativos para crear los contenedores. Lista de imágenes.
- No ofrece soporte para diferentes backends de almacenamiento y tipos de red. Facilitando la gestión de red y almacenamiento.
- LXD ofrece una REST API que podemos usar con una simple herramienta de línea de comandos o con herramientas de terceros.
- LXD gestiona instancias, que pueden ser de tipos: contenedores, usando LXC internamente, y máquinas virtuales usando QEMU internamente.
Instalación de LXD
Vamos a usar el gestor de paquetes snap (si estás trabajando con la distribución Debian debes instalar el paquete snapd
).
sudo snap install lxd
Antes de ejecutar una instancia (contenedor o máquina virtual) tenemos que hacer una configuración inicial de LXD, para ello ejecutamos como root:
lxd init
Interactivamente nos va preguntando distintos parámetros que nos permitirán realizar la configuración inicial:
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (cephobject, dir, lvm, btrfs, ceph) [default=btrfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
Hemos dejado todos los valores por defecto, a excepción del tipo de pool de almacenamiento que he indicado que sea un directorio (dir). También ha creado una red puente para conectar los contenedores.
Creación de un contenedor
Para crear un contenedor, ejecutamos:
lxc launch <image_server>:<image_name> <instance_name>
Por ejemplo:
lxc launch images:ubuntu/20.04 ubuntu-container
Creación de máquinas virtuales
Para crear una máquina virtual, ejecutamos:
lxc launch <image_server>:<image_name> <instance_name> --vm
Por ejemplo:
lxc launch images:ubuntu/20.04 ubuntu-vm --vm
Y comprobamos que hemos creado un contenedor y una máquina virtual:
lxc list
+------------------+---------+-------------------------+-------------------------------------------------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------------------+---------+-------------------------+-------------------------------------------------+-----------------+-----------+
| ubuntu-container | RUNNING | 10.242.154.69 (eth0) | fd42:40c4:7788:440e:216:3eff:fe61:66b0 (eth0) | CONTAINER | 0 |
+------------------+---------+-------------------------+-------------------------------------------------+-----------------+-----------+
| ubuntu-vm | RUNNING | 10.242.154.119 (enp5s0) | fd42:40c4:7788:440e:216:3eff:fea3:8748 (enp5s0) | VIRTUAL-MACHINE | 0 |
+------------------+---------+-------------------------+-------------------------------------------------+-----------------+-----------+
Redes en LXD
Por defecto se ha creado un red de tipo bridge, que ha creado un Linux Bridge llamado lxdbr0
.
lxc network list
+-----------------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| NAME | TYPE | MANAGED | IPV4 | IPV6 | DESCRIPTION | USED BY | STATE |
+-----------------+----------+---------+----------------+---------------------------+-------------+---------+---------+
+-----------------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| ens3 | physical | NO | | | | 0 | |
+-----------------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| lxdbr0 | bridge | YES | 10.93.154.1/24 | fd42:1b3c:2651:4df1::1/64 | | 3 | CREATED |
+-----------------+----------+---------+----------------+---------------------------+-------------+---------+---------+
Esta red es de tipo NAT con DHCP, es decir, posibilita que las instancias tengas conexión a internet y tiene configurado un servidor DHCP responsable de asignar el direccionamiento a las instancias. En este ejemplo la dirección 10.93.154.1
es la IP del host en esta red y sería la puerta de enlace de las instancias.
Podemos crear nuevas redes y modificar las existentes pero lo estudiaremos en otro post del blog.
Gestión de imágenes
En la creación de las dos instancias hemos descargado dos imágenes que podemos gestionar con el subcomando lxc image
, por ejemplo para ver las imágenes que hemos descargado:
lxc image list
+-------+--------------+--------+-------------------------------------+--------------+-----------------+----------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+-------+--------------+--------+-------------------------------------+--------------+-----------------+----------+------------------------------+
| | 3aa3fa64e5d0 | no | Ubuntu focal amd64 (20220911_07:42) | x86_64 | VIRTUAL-MACHINE | 230.98MB | Sep 12, 2022 at 7:28am (UTC) |
+-------+--------------+--------+-------------------------------------+--------------+-----------------+----------+------------------------------+
| | 7628425e768e | no | Ubuntu focal amd64 (20220911_07:42) | x86_64 | CONTAINER | 110.65MB | Sep 12, 2022 at 7:22am (UTC) |
+-------+--------------+--------+-------------------------------------+--------------+-----------------+----------+------------------------------+
Para más información ejecuta lxc image --help
.
Gestión de instancia
Vamos a usar la utilidad de línea de comandos lxc
, para ver todas las funcionalidades puedes ejecutar lxc --help
. Veamos algunas de ella:
lxc list
: Listar instancias. Podemos filtrar la lista, por ejemplolxc list type=container
olxc list ubuntu.*
.lxc info
: Nos da información de una instancia. Con la opción--show-log
nos muestra los logs de la instancia.lxc start
: Inicia una instancia.lxc stop
: Detiene una instancia.lxc delete
: Borra una instancia.
Si queremos ejecutar un comando en una instancia, ejecutamos:
lxc exec <instance_name> -- <command>
Por ejemplo:
lxc exec ubuntu-container -- apt update
Si queremos acceder a una shell de la instancia:
lxc exec ubuntu-container -- /bin/bash
Si queremos conectarnos a una instancia por una consola, ejecutamos:
lxc console <instance_name>
Nota: Deberíamos configurar una contraseña para un usuario anteriormente accediendo al bash de la instancia.
Configuración de las instancias
Tenemos muchos parámetros de configuración de las instancias, que podemos devivir en tres bloques: propiedades de las instancias, openciones de las instancias y dispositivos de las instancias.
Al crear una instancia podemos indicar los parámetros de configuración deseados, por ejemplo, si queremos limitar el número de CPU y la memoria de un contenedor, podemos ejecutar:
lxc launch images:ubuntu/20.04 ubuntu-limited -c limits.cpu=1 -c limits.memory=192MiB
Con el subcomando lxc config
podemos gestionar la configuración de las instancias, por ejemplo para mostrar la configuración de una instancia, ejecutamos:
lxc config show ubuntu-container
Por ejemplo, para cambiar un parámetro:
lxc config set ubuntu-container limits.memory=128MiB
Para seguir profundizando
- Más información sobre la configuración de instancias.
- Más información sobre la gestión de imágenes.
- Con el subcomando
lxc network
gestionamos las redes. Más información. - Con el subcomando
lxc storage
gestionamos los pools de almacenamiento. Más información.
Leave a Comment
Your email address will not be published. Required fields are marked *