Técnica de migración básica en LXD

per Victor Carceler darrera modificació 2023-04-10T17:02:17+01:00

containers.pngLXD permite gestionar contenedores y máquinas virtuales. Entre sus funciones se encuentran varias técnicas que incluso posibilitan la migración en vivo tanto de máquinas virtuales como de contenedores.

Pero aquí se va a describir una técnica básica que permitirá migrar los contenedores de un servidor a otro manualmente.

Los pasos serán:

  1. En el servidor origen:
    1. Se detiene el contenedor
    2. Se toma un snapshot
    3. Se publica el snapshot como una imagen
    4. Se exporta la imagen a un fichero
  2. Se lleva la imagen al nuevo servidor
  3. En el servidor destino:
    1. Se importa la imagen
    2. Se lanza una nueva instancia
    3. Opcionalmente se borra la imagen que ya no es necesaria
    4. Se vuelven a aplicar los límites al contenedor

Al mover contenedores de esta manera se estarán recreando las instancias a partir de las imágenes creadas, por lo que los contenedores tendrán una nueva dirección MAC.

Exportación manual de un contenedor

Alternativamente se puede exportar directamente un contenedor, que deberá estar parado, a un fichero y recrearlo en otro servidor LXD. En este caso se utilizarán directamente los comandos lxc export <contenedor> para exportar el contenedor. Y lxc import <fichero-exportado> para importar el contenedor. Al trabajar de esta manera se estará exportando el contenedor con sus snapshots y límites (si los tuviera).

Opcionalmente se puede utilizar el parámetro --compression="zstd" para indicar que el archivo al que se exporta el contenedor utilizará compresión zstd que es más rápida y comprime más que gzip.

Así podemos exportar el contenedor prometheus nombrando prometheus.tar.zst al archivo producido:

lxc export prometheus prometheus.tar.zst --compression="zstd"

Para importar el contenedor bastará con ejecutar:

lxc import prometheus.tar.zst

Exportación manual a partir de un snapshot

Servidor origen: matrioska-2004

En esta MV que ejecuta Ubuntu 20.04 se están ejecutando diferentes contenedores que se desean migrar a matrioska-2204, una nueva MV que ejecuta Ubuntu 22.04.

Se pueden ver los contenedores en el servidor origen con el comando: lxc list

vcarceler@matrioska-2004:~$ lxc list
+--------------------------+---------+----------------------+------+-----------+-----------+
|           NAME           |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+--------------------------+---------+----------------------+------+-----------+-----------+
| avaluacions              | RUNNING | 192.168.0.135 (eth0) |      | CONTAINER | 2         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| dmoj                     | RUNNING | 192.168.0.120 (eth0) |      | CONTAINER | 1         |
|                          |         | 10.0.0.21 (elpuig)   |      |           |           |
+--------------------------+---------+----------------------+------+-----------+-----------+
| enquestes                | STOPPED |                      |      | CONTAINER | 1         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| facturascripts           | RUNNING | 192.168.0.128 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| glpi                     | RUNNING | 192.168.0.121 (eth0) |      | CONTAINER | 2         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| glpi-agent               | STOPPED |                      |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| grafana-prometheus       | RUNNING | 192.168.0.132 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| juan                     | STOPPED |                      |      | CONTAINER | 1         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| letsencrypt-1804         | RUNNING | 192.168.0.5 (eth0)   |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| limesurvey               | RUNNING | 192.168.0.126 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| loki                     | STOPPED |                      |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| mec                      | RUNNING | 192.168.0.124 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| mikrotik-exporter        | STOPPED |                      |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| mikrotik-exporter-python | STOPPED |                      |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| prometheus               | RUNNING | 192.168.0.131 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| savapage                 | RUNNING | 192.168.0.122 (eth0) |      | CONTAINER | 0         |
+--------------------------+---------+----------------------+------+-----------+-----------+
| speedtest                | STOPPED |                      |      | CONTAINER | 1         |
+--------------------------+---------+----------------------+------+-----------+-----------+
vcarceler@matrioska-2004:~$

Exportar el contenedor glpi

En primer lugar será necesario detener el contenedor:

vcarceler@matrioska-2004:~$ lxc stop glpi

Ahora podremos tomar un nuevo snapshot con el nombre matrioska-2004

vcarceler@matrioska-2004:~$ lxc snapshot glpi matrioska-2004

Publicar el snapshot como una imagen

vcarceler@matrioska-2004:~$ lxc publish glpi/matrioska-2004 --alias="glpi en matrioska-2004"
Instance published with fingerprint: 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc
vcarceler@matrioska-2004:~$

Y finalmente exportar la imagen a un fichero

vcarceler@matrioska-2004:~$ lxc image export 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc
Image exported successfully!           
vcarceler@matrioska-2004:~$ ls -lh *gz
-rw-rw-r-- 1 vcarceler vcarceler 2.4G Apr  7 16:29 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc.tar.gz
vcarceler@matrioska-2004:~$

Llegados a este punto podemos guardar el fichero .tar.gz para preservar la instancia o enviarlo por la red a otro servidor.

Servidor destino: matrioska-2204

En el servidor de destino podremos recrear la instancia a partir del fichero que hemos exportado.

En primer lugar será necesario importar la imagen:

vcarceler@matrioska-2204:~$ lxc image import 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc.tar.gz 
Image imported with fingerprint: 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc
vcarceler@matrioska-2204:~$ lxc image list
+-------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |            DESCRIPTION             | ARCHITECTURE |   TYPE    |   SIZE    |         UPLOAD DATE         |
+-------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------------+
|       | 3ebad3d0f920 | no     | Ubuntu 20.04 LTS server (20220322) | x86_64       | CONTAINER | 2359.30MB | Apr 7, 2023 at 2:36pm (UTC) |
+-------+--------------+--------+------------------------------------+--------------+-----------+-----------+-----------------------------+
vcarceler@matrioska-2204:~$

Y a partir de la imagen se puede lanzar una nueva instancia

vcarceler@matrioska-2204:~$ lxc launch 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc glpi
Creating glpi
Starting glpi                              
vcarceler@matrioska-2204:~$ lxc list
+-----------+---------+----------------------+------+-----------+-----------+
|   NAME    |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-----------+---------+----------------------+------+-----------+-----------+
| glpi      | RUNNING | 192.168.0.121 (eth0) |      | CONTAINER | 0         |
+-----------+---------+----------------------+------+-----------+-----------+
vcarceler@matrioska-2204:~$

Una vez recreada la instancia glpi ya se puede eliminar la imagen utilizada

vcarceler@matrioska-2204:~$ lxc image delete 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc

Aplicar límites

Si la instancia original tenía límites estos no se han conservado durante la migración. Así que será necesario volver a aplicar los límites a la nueva instancia.

En nuestro caso:

vcarceler@matrioska-2204:~$ lxc config set glpi limits.cpu 2
vcarceler@matrioska-2204:~$ lxc config set glpi limits.memory 2048MB

Al inspeccionar la configuración se podrán observar los límites

vcarceler@matrioska-2204:~$ lxc config show glpi
architecture: x86_64
config:
  image.architecture: x86_64
  image.description: Ubuntu 20.04 LTS server (20220322)
  image.os: ubuntu
  image.release: focal
  limits.cpu: "2"
  limits.memory: 2048MB
  volatile.base_image: 3ebad3d0f920e3bafd1a9accbdacb26eb812a1e960f58098202df8ec5dd818dc
  volatile.cloud-init.instance-id: 967575c9-cf20-4274-8847-fcc4e1b155b7
  volatile.eth0.host_name: veth6b3c5a9e
  volatile.eth0.hwaddr: 00:16:3e:54:99:6b
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
  volatile.uuid: 72784a5a-5e1d-401c-ae98-8a1d1fdb2882
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""
vcarceler@matrioska-2204:~$

Más información: