Técnica de migración básica en LXD
LXD 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:
- En el servidor origen:
- Se detiene el contenedor
- Se toma un snapshot
- Se publica el snapshot como una imagen
- Se exporta la imagen a un fichero
- Se lleva la imagen al nuevo servidor
- En el servidor destino:
- Se importa la imagen
- Se lanza una nueva instancia
- Opcionalmente se borra la imagen que ya no es necesaria
- 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: