4 minute read

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 sanpd).

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 ejemplo lxc list type=container o lxc 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

Leave a Comment

Your email address will not be published. Required fields are marked *

Loading...