Cómo crear Backups de contenedores LXD

Realizar copias de seguridad o mover contenedores es una tarea habitual. Lamentablemente LXC/LXD no incluye un mecanismo que permita realizar los backups de un contenedor existente directamente. Aquí encontrarás dos técnicas para hacer copias de seguridad online de contenedores LXC. Una exportando a un fichero tar.gz y otra utilizando otro servidor de contenedores.

1# Exportar contenedores en tarballs

Con esta técnica puedes realizar copias online de cualquier contenedor que este en ejecución.

Exportar la imagen de un contenedor

El proceso consiste en:

  • Realizar un snapshot de un contenedor.
  • Volcar el snapshot en una Imagen.
  • Exportar la imagen a un tarball (Un fichero .tar.gz).

Paso a paso, en la línea de comandos:
# ---------------------
# crear un snapshot del 
# contenedor prueba
# ---------------------
$ lxc snapshot prueba backup

$ lxc list prueba
+--------+---------+ // ... +-----------+
| NOMBRE | ESTADO  | // ... | SNAPSHOTS |
+--------+---------+ // ... +-----------+
| prueba | RUNNING | // ... | 1         |
+--------+---------+ // ... +-----------+

# ---------------------
# publicar una imagen 
# del snapshot
# ---------------------
$ lxc publish prueba/backup --alias prueba-backup
Container published with fingerprint: a1fa8864fe0aa0c3cf395fd647d55b5b5292cfce932073782976389a6fee9612

# ---------------------
# exportar la imagen 
# a un tarball
# ---------------------
$ lxc image export prueba-backup
Image exported successfully!           

# ---------------------
# el contenedor exportado
# ---------------------
$ ls -alht a1fa8864fe0aa0c3cf395fd647d55b5b5292cfce932073782976389a6fee9612*
-rw-rw-r-- 1 user group 2,6M feb 13 02:10 a1fa8864fe0aa0c3cf395fd647d55b5b5292cfce932073782976389a6fee9612.tar.gz

Al final del proceso consigues un tarball en el mismo directorio desde el que has lanzado los comandos.

Puedes llevarlo a otra máquina con rsync o scp o almacencarlo en un sistema de copias de seguridad.

Importar el tarball

En algún momento puedes necesitar restaurar un contenedor desde una de las copias de seguridad.

Puedes importar el contenedor en el mismo host en el que se creó la copia de seguridad o en otro distinto. En cualquier caso, tanto los datos como la configuración del contenedor se mantendrán tras la restauración.

# ---------------------
# Importar el tarball 
# como imagen
# ---------------------
$ lxc image import a1fa8864fe0aa0c3cf395fd647d55b5b5292cfce932073782976389a6fee9612.tar.gz --alias prueba-backup
Image imported with fingerprint: a1fa8864fe0aa0c3cf395fd647d55b5b5292cfce932073782976389a6fee9612

# ---------------------
# Arrancar el contendor
# ---------------------
$ lxc launch prueba-backup prueba

2# Backup en un servidor remoto

Esta técnica permite realizar backups remotos de una foma más cómoda sin necesidad de mover ficheros entre distintos servidores. Además las copias se hacen en caliente sin necesidad de parar los contenedores.

Las imagenes se mueven utilizando el API de LXD que hay que habilitar previamente en el servidor que tiene los contenedores en funcionamiento.

2.1 Habilitar el API LXD en el servidor de contenedores

Para habilitar el API en el servidor de contenedores sigue estos pasos:

# ---------------------
# Habilita conexiones remotas 
# del API al pueto  8443
# ---------------------
$ lxc config set core.https_address "[::]:8443"

# ---------------------
# configurar una contraseña
# ---------------------
$ lxc config set core.trust_password password

Al terminar tendremos a la escucha en el puerto 8443 en todas las interfaces.

2.2 Backup en el servidor remoto

El resto de configuración se realiza en el servidor de copias de seguridad:

  • Añade el servidor de contenedores a la lista de servidores remotos. Utiliza la contraseña que proporcionaste al API en el anterior paso para validar la conexión:
# ---------------------
# añadir el servidor de 
# contenedores a la lista 
# de servidores permitidos
# ---------------------
backup ~ $ lxc remote add produccion 1.2.3.4:8443
Certificate fingerprint: fdb06d909b77a5311d7437cabb6c203374462b907f3923cefc91dd5fce8d7b60
ok (y/n)? y
Admin password for produccion: 
Client certificate stored at server: produccion

El certificado es almacenado en la carpeta ~/.config/lxc/servercerts/ y sustituye a cualquier otro certificado anterior.

Así, ahora puedes ver el listado de servidores remotos, sus contenedores y puedes contrarlos de forma remota.

backup ~ $ lxc remote list 
+-----------------+------------------------ // ...
|      NAME       |                   URL       
+-----------------+------------------------ // ...
| produccion      | https://1.2.3.4 :8443   
+-----------------+------------------------ // ...


# Listar los contenedores de un servidor remoto:
backup ~ lxc list produccion:
+------------------------+---------+------- // ...
|          NAME          |  STATE  |         
+------------------------+---------+------- // ...
| aplicacion             | RUNNING | 
+------------------------+---------+------- // ...

Fíjate La nomenclatura utilizada para acceder a un contenedor de un servidor remoto es remote:[filtro]. El filtro es opcional y sirve para filtrar los contenedores por el nombre a través de una expresión regular. Así, por ejemplo puedes utilizar como filtro la expresión ^web para listar todos los contenedores que empiezen por web.

  • Crea un snapshot del contenedor que quieres copiar de forma remota usando el comando lxc snapshot:
# ---------------------
# Realizar un snapshot de 
# un contenedor en ejecución
# ---------------------
backup ~ $ lxc snapshot produccion:prueba backup

# ---------------------
# Localizar la imagen y 
# los snapshots disponibles
# ---------------------
backup ~ $ lxc info produccion:prueba
Name: prueba
Remote: https://1.2.3.4:8443
Architecture: x86_64
Created: 2018/02/14 00:54 UTC
Status: Running
Type: persistent
Profiles: default, docker
Pid: 29707
Ips:
  eth0:	inet	10.66.150.250	veth6NNAXO
  eth0:	inet6	fe80::216:3eff:fe6d:ae87	veth6NNAXO
  lo:	inet	127.0.0.1
  lo:	inet6	::1
Resources:
  Processes: 29
  Disk usage:
    root: 11.38MB
  Memory usage:
    Memory (current): 71.91MB
    Memory (peak): 194.04MB
  Network usage:
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0
    eth0:
      Bytes received: 205.90kB
      Bytes sent: 11.25kB
      Packets received: 140
      Packets sent: 142
Snapshots:
  backup (taken at 2018/02/14 00:55 UTC) (stateless)
  • Copia del snapshot remoto. El comando lxc copy sirve para copiar localmente el snapshot que acabamos de hacer en el servidor remoto. El resultado es un nuevo contenedor parado que al finalizar la copia puedes arrancar.
# ---------------------
# Copiar el snapshot
# ---------------------
backup ~ $ lxc copy produccion:prueba/backup prueba

# ---------------------
# Listar el contenedor
# que acabamos de copiar
# ---------------------
backup ~ $ lxc list prueba
+-----------------+------------------------ // ...
|         NOMBRE          | ESTADO  |        
+-------------------------+---------+------ // ...
| prueba                  | STOPPED |        
+-------------------------+---------+------ // ...

# ---------------------
# Arrancar el contendor
# si fuera necesario
# ---------------------
backup ~ $ lxc launch prueba-backup prueba

2.3 Desactivar el API

Una vez añadidos todos los servidores remotos es conveniente configurar core.trust_password con un valor vacío para no autorizar las conexiones de nuevos servidores. De este modo, proteges el servidor de contenedores de ataques de fuerza bruta.

Adicionamente, es recomendable limitar las conexiones al API a una determinada IP del servidor y configurar reglas en el cortafuegos que limiten el acceso a las direcciones IP de nuestra red o que nos sean confiables.

Como puedes ver, el uso del API facilita realizar copias de seguridad desde remoto. A partir de este punto es fácil programar copias de seguridad desatendidas.

César Maeso


Creative Commons License

Esta obra está bajo una licencia de Creative
Commons Reconocimiento-NoComercial-CompartirIgual
4.0 Internacional
.