Esta pagina se ve mejor con JavaScript habilitado

LXD containers

 ·  🎃 kr0m

Como ya explicamos en una ocasión anterior los contenedores aportan varias ventajas respecto a la virtualización completa estilo KVM, esta vez vamos a instalar LXD que no es mas que un wrapper sobre LXC que nos facilitará ciertas tareas.

Primero consultaremos si tenemos todo lo necesario en nuestro kernel para que LXD funcione:

ebuild /usr/portage/app-emulation/lxc/lxc-1.1.2.ebuild setup

Si queremos clonar contenedores tendremos que tener Rsync compilado con las siguientes use flags:

vi /etc/portage/package.use/rsync

net-misc/rsync acl iconv -ipv6 -static xattr
vi /etc/portage/package.accept_keywords/lxd
app-emulation/lxd ~amd64

Instalamos todo el software necesario:

emerge -av app-emulation/lxd net-misc/bridge-utils app-shells/bash-completion net-misc/rsync sys-fs/btrfs-progs

Permitimos que un usuario regular pueda gestionar los contenedores:

useradd kr0m
usermod –append –groups lxd kr0m
chown -R kr0m:kr0m /home/kr0m/

Si queremos tener autocompletado de los comandos de LXD:

cp /usr/share/bash-completion/completions/lxc /etc/bash_completion.d/
su kr0m -l
echo “source /etc/bash_completion.d/lxc” » ~/.bash_profile
exit

Configuramos la red, básicamente consiste en meter la interfaz en un bridge y configurar la ip en dicho bridge:

vi /etc/conf.d/net

bridge_lxcbr0="enp1s0"
config_lxcbr0="A.B.C.D/24"
routes_lxcbr0="default via E.F.G.H"
dns_servers_lxcbr0="8.8.8.8 8.8.4.4"

Metemos el bridge en el arranque y quitamos la interfaz física:

cd /etc/init.d/
ln -s net.lo net.lxcbr0
/etc/init.d/net.lxcbr0 start
rc-update add net.lxcbr0 default
rc-update del net.enp1s0 default

Hacemos que los usuarios del 0-65535 dentro de los contenedores sean mapeados a los UIDs del host de arriba: 1000000+uid y 1000000+gid

echo root:1000000:65536 »/etc/subuid
echo root:1000000:65536 »/etc/subgid

Arrancamos el servicio de LXD y lo metemos en el arranque:

/etc/init.d/lxd start
rc-update add lxd default

Añadimos el repo de imágenes de linuxcontainers:

Consultamos que se haya añadido correctamente:

lxc remote list

images <https://images.linuxcontainers.org:8443>
local <unix:///var/lib/lxd/unix.socket>

Consultamos las imágenes disponibles:

lxc image list images:

Lanzamos un CT:

lxc launch images:gentoo/current/amd64 gentoo00

Consultamos la lista de CTs:

lxc list

+----------+---------+----------------+------+------------+-----------+
|   NAME   |  STATE  |      IPV4      | IPV6 |    TYPE    | SNAPSHOTS |
+----------+---------+----------------+------+------------+-----------+
| gentoo00 | RUNNING | 192.168.40.165 |      | PERSISTENT | 0         |
+----------+---------+----------------+------+------------+-----------+

Podemos acceder al CT directamente:

lxc exec gentoo00 – /bin/bash -l

Los perfiles no son mas que opciones de configuración, estos se aplican en cascada, es decir el último en aplicarse añade, elimina o sobreescribe la configuración anterior.

lxc profile list

default
migratable
lxc profile show default
name: default
config: {}
devices:
  eth0:
    nictype: bridged
    parent: lxcbr0
    type: nic

LXD nos permite limitar ciertos recursos, por ejemplo el uso de CPU:

lxc profile create cpusandbox
lxc profile set cpusandbox limits.cpu 1
lxc init images:gentoo/current/amd64 cpusandboxed -p default -p cpusandbox
lxc config show cpusandboxed

name: cpusandboxed
profiles:
- default
- cpusandbox

Para limitar la RAM:

lxc profile create ramsandbox
lxc profile set ramsandbox limits.memory 250
lxc profile apply cpusandboxed default ramsandbox cpusandbox
lxc config show cpusandboxed

name: cpusandboxed
profiles:
- ramsandbox

Si queremos aplicarle varios profiles simultáneamente:

lxc profile assign cpusandboxed default,ramsandbox,cpusandbox

Profiles default,ramsandbox,cpusandbox applied to cpusandboxed

Podemos editar la config para algo concreto, por ejemplo cambiar la MAC:

lxc config edit CONTAINER_ID

profiles:
- default
config:
  volatile.base_image: 7a983015256a485891940af71b475612fa97f87173d044daab5d003950372312
  volatile.eth0.hwaddr: 02:00:00:57:ce:6f
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":100000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":100000}]'
devices: {}
ephemeral: false

LXD utiliza un rango de IDs de usuario para ejecutar cada uno de los CTs, esto es una medida de seguridad en caso de que algún atacante consiga escapar del CT, pero hay ciertas funcionalidades sobre todo a la hora de acceder a /proc que no funcionan de este modo, si queremos hacer el CT privilegiado:

lxc stop gentoo00
lxc config set gentoo00 security.privileged true
lxc config show gentoo00

 security.privileged: "true"
lxc start gentoo00

Los snapshots son una de las funcionalidades mas interesantes de las que dispone LXD-Btrfs, ya que Btrfs los soporta de forma nativa estos se realizan prácticamente en realtime sin penalización alguna.

Solo debemos asegurarnos de disponer de una versión reciente del kernel(4.X) y soporte para dicho sistema de ficheros.

Lo mas recomendable es montar /var del siguiente modo:

/dev/sda4 on /var type btrfs (rw,relatime)

Para crear un snapshot es tan sencillo como:

lxc snapshot CT_ID NOMBRE_DESCRIPTIVO

Con lxc list podemos ver a simple vista si el contenedor tiene snapshots:

lxc list

+----------------+---------+----------------+------+------------+-----------+
|     NAME       |  STATE  |      IPV4      | IPV6 |    TYPE    | SNAPSHOTS |
+----------------+---------+----------------+------+------------+-----------+
+----------------+---------+----------------+------+------------+-----------+
| testkr0m       | RUNNING | X.X.X.X (eth0) |      | PERSISTENT | 1         |
+----------------+---------+----------------+------+------------+-----------+

Podemos consultar los snapshots de un CT en particular con:

lxc info testkr0m

Snapshots:
 limpio (taken at 2016/11/23 15:40 UTC) (stateless)

Para restaurar el CT a un estado anterior:

lxc restore testkr0m limpio

Para borrar un snapshot:

lxc delete testkr0m/limpio

Otro tema a que todo sysadmin debe contemplar son los backups, se pueden realizar sin necesidad de montar otro LXD y mover el CT, tan solo comprimimos el rootfs:

cd /var/lib/lxd/containers/
tar czvf CONTAINER.tar.gz CONTAINER
scp CONTAINER.tar.gz REMOTE_IP:/var/lib/lxd/containers/

Si queremos arrancar el CT en otro LXD:

cd /var/lib/lxd/containers/
tar czvf CONTAINER.tar.gz
mv CONTAINER CONTAINER_ORI
lxc launch images:gentoo/current/amd64 CONTAINER
mv CONTAINER_ORI CONTAINER
lxc start CONTAINER

Los CTs LXD tienen algunas limitaciones entre ellas los puntos de montaje NFS, para solventar esto montaremos el recurso compartido en el server de LXD y lo añadiremos al CT:

mkdir -p /mnt/nfs/data
vi /etc/fstab

NFS_SERVER_IP:/data /mnt/nfs/data nfs rw,vers=4,async,noatime,nodiratime,soft,timeo=3,intr,bg 0 0
mount /mnt/nfs/data
lxc config device add gentoo00 data disk path=/data source=/mnt/nfs/data
lxc config device show gentoo00

Otra limitación puede ser el uso de dispositivos loop, para poder montar una imagen ISO por ejemplo:

mkdir /mnt/iso
mount -o loop FICHERO.iso /mnt/iso

Miramos el UID del user del CT:

ls -la /var/lib/lxd/containers/gentoo00/

total 20
drwxr-xr-x+ 4 100000 100000 4096 may 17 15:52 .

Cambiamos el propietario del directorio externo:

chown 100000:100000 /mnt/iso/

Mapeamos el directorio externo con el del CT:

lxc config device add CT_NAME NOMBRE_RECURSO disk path=/mnt/iso source=/mnt/iso
lxc config device add gentoo00 iso disk path=/mnt/iso source=/mnt/iso
lxc config device show gentoo00

NOTA: Si el CT es privileged no hace falta hacer el cambio de permisos en /mnt/iso en el servidor LXD

Una de las grandes ventajas de utilizar LXD es que se puede partir de una infraestructura básica e ir creciendo, en cualquier momento se pueden migrar CTs entre servidores sin problemas.

Tenemos dos servers:

  • SERVER1
  • SERVER2

Ponemos a la escucha el socket de gestión en SERVER2:

lxc config set core.https_address SERVER2_IP:8443
lxc config set core.trust_password PASSWORD

Añadimos SERVER2 como lacayo de SERVER1:

lxc remote add SERVER2 https://SERVER2_IP:8443

Ahora podemos consultar los CTs de SERVER2 desde SERVER1:

lxc list SERVER2:

Arrancar CTs remotos:

lxc launch images:gentoo/current/amd64 SERVER2:testkr0m
lxc info SERVER2:testkr0m

Movemos el CT de SERVER2 a SERVER1:

lxc move SERVER2:testkr0m testkr0m

Lxd es un sistema muy potente y con muchas posibilidades, en este artículo solo se han comentado las funcionalidades básicas, para mas información siempre podemos consultar la web del proyecto .

Si te ha gustado el artículo puedes invitarme a un RedBull aquí