Migración en vivo de una aplicación desplegada en LXC

Partimos de la siguiente situación:

  • contenedor1
    • Debian Stretch sobre LXC
    • 10 GiB de tamaño máximo de disco
    • Uso máximo de 512 MiB de RAM
    • Disco adicional de 1 GiB sobre un LVM con XFS
    • Conectado a un bridge interno
  • contenedor2
    • Debian Stretch sobre LXC
    • 10 GiB de tamaño máximo de disco
    • Uso máximo de 1 GiB de RAM
    • Conectado a un bridge interno

Pasos a realizar

  • Crea los dos contenedores
  • Instala una aplicación (servidor web, DNS, SGBDR, etc.) cuyos datos radiquen en el volumen adicional
  • Configura iptables para que el servicio sea accesible desde el exterior
  • Configura un sistema automático que:
  • Cuando el contenedor1 consuma toda su RAM, migre la aplicación a contenedor2
  • Cuando contenedor2 consuma toda su RAM, aumente la RAM en vivo a 2 GiB
  • Intenta mejorar el código del script aportado, haciendo un análisis adecuado de la estructura del mismo y preguntando en clase lo que sea necesario.

 

VOLUMEN LÓGICO PARA LA PRÁCTICA

root@holmes:/home/maria# pvcreate /dev/sda2
WARNING: ext4 signature detected on /dev/sda2 at offset 1080. Wipe it? [y/n]: y
 Wiping ext4 signature on /dev/sda2.
 Physical volume "/dev/sda2" successfully created
root@holmes:/home/maria# vgcreate lxc /dev/sda2
 Volume group "lxc" successfully created

CREACIÓN DE LOS CONTENEDORES

 

CONTENEDOR 1

  • Debian Stretch sobre LXC
  • 10 GiB de tamaño máximo de disco
  • Uso máximo de 512 MiB de RAM
  • Disco adicional de 1 GiB sobre un LVM con XFS
  • Conectado a un bridge interno

CREACIÓN DEL CONTENEDOR

root@holmes:/home/maria# lxc-create -n cont1 --bdev lvm --vgname lxc --lvname contenedor1 --fssize 10G -t debian

 DISCO ADICIONAL

Lo primero es crear el volumen para luego poder añadirlo al contenedor

root@holmes:~# lvcreate -L 1G -n additional lxc
root@holmes:~# lvs
 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
 additional lxc -wi-a----- 1,00g 
 contenedor1 lxc -wi-ao---- 10,00g 
 contenedor2 lxc -wi-ao---- 10,00g

Lo siguiente será darle formato:

root@holmes:~# mkfs.xfs /dev/lxc/additional
meta-data=/dev/lxc/additional isize=512 agcount=4, agsize=65536 blks
 = sectsz=4096 attr=2, projid32bit=1
 = crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=262144, imaxpct=25
 = sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =registro interno bsize=4096 blocks=2560, version=2
 = sectsz=4096 sunit=1 blks, lazy-count=1
realtime =ninguno extsz=4096 blocks=0, rtextents=0

root@holmes:~# lsblk -f | grep add
│ └─lxc-additional xfs 22325dff-c8ec-49ae-9eb8-75ae83546338

Con esto ya podemos añadirlo al contenedor:

root@holmes:~# lxc-device -n cont1 add /dev/lxc/additional

Para que el contenedor vea ese disco adicional, hay que montarlo con

root@holmes:~# lxc-attach -n cont1 -- mount /dev/lxc/additional /punto/de/montaje

De momento no se va a montar para evitar posibles conflictos y mezcla de datos, se hará una vez instale el servicio (apache).

LIMITAR LA RAM

Con el contenedor iniciado ejecutamos el siguiente comando

root@holmes:/home/maria# lxc-cgroup -n cont1 memory.limit_in_bytes 512M

BRIDGE INTERNO

Para que se cree un bridge cuando se crea el contenedor, en Ubuntu no hay que modificar nada, pero en /etc/default/lxc-net Debian hay que modificar el archivo  y añadir lo siguiente:

LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.0.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.0.0/24"
LXC_DHCP_RANGE="10.0.0.2,10.0.0.254"
LXC_DHCP_MAX="253"

De forma que en las interfaces de red veremos:

root@holmes:/home/maria# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host 
 valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
 link/ether d8:cb:8a:f2:03:c1 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
 link/ether 9c:b6:d0:08:97:9b brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.155/24 brd 192.168.0.255 scope global dynamic wlan0
 valid_lft 85817sec preferred_lft 85817sec
 inet6 fe80::8f6e:9437:56b9:7640/64 scope link 
 valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
 link/ether 02:42:76:84:41:f4 brd ff:ff:ff:ff:ff:ff
 inet 172.17.0.1/16 scope global docker0
 valid_lft forever preferred_lft forever
6: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
 link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
 inet 10.0.0.1/24 scope global lxcbr0
 valid_lft forever preferred_lft forever
 inet6 fe80::216:3eff:fe00:0/64 scope link 
 valid_lft forever preferred_lft forever

COMPROBACIONES

RAM

root@holmes:/home/maria# lxc-attach -n cont1
root@cont1:/# free -h
 total used free shared buff/cache available
Mem: 512M 11M 470M 1,0G 29M 470M
Swap: 15G 0B 15G

 

CONTENEDOR 2

  • Debian Stretch sobre LXC
  • 10 GiB de tamaño máximo de disco
  • Uso máximo de 1 GiB de RAM
  • Conectado a un bridge interno

CREACIÓN DEL CONTENEDOR

root@holmes:/home/maria# lxc-create -n cont2 --bdev lvm --vgname lxc --lvname contenedor2 --fssize 10G -t debian

LIMITAR LA RAM

Con el contenedor iniciado ejecutamos el siguiente comando

root@holmes:/home/maria# lxc-cgroup -n cont2 memory.limit_in_bytes 1G

COMPROBACIONES

RAM

root@holmes:/home/maria# lxc-attach -n cont2
root@cont2:/# free -h
 total used free shared buff/cache available
Mem: 1,0G 8,6M 989M 1,0G 25M 989M
Swap: 15G 0B 15G

INSTALACIÓN Y CONFIGURACIÓN DE APACHE

  • Instala una aplicación (servidor web, DNS, SGBDR, etc.) cuyos datos radiquen en el volumen adicional
  • Configura iptables para que el servicio sea accesible desde el exterior

Hay que instalar apache en ambas máquinas:

root@cont1:/# apt install apache2
root@cont2:/# apt install apache2

Para que los datos estén en el volumen adicional, se añade al conetendor y se monta en /var/www/html

root@holmes:~# lxc-device -n cont1 add /dev/lxc/additional
root@holmes:~# lxc-attach -n cont1 -- mount /dev/lxc/additional /var/www/html

Comprobamos en el contenedor que se ha añadido:

root@cont1:/var/www/html# df -h
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/lxc/contenedor1 9,8G 443M 8,8G 5% /
none 492K 0 492K 0% /dev
tmpfs 7,8G 0 7,8G 0% /dev/shm
tmpfs 7,8G 8,1M 7,8G 1% /run
tmpfs 5,0M 0 5,0M 0% /run/lock
tmpfs 7,8G 0 7,8G 0% /sys/fs/cgroup
/dev/lxc/additional 1014M 34M 981M 4% /var/www/html

Y se crea  el index.html en

root@holmes:~# lxc-attach -n cont1 — mount /dev/lxc/additional /var/www/html

1.png

Para que el servicio sea accesible desde fuera, ponemos las siguientes reglas de iptables

root@holmes:~# iptables -t nat -D PREROUTING 1
root@holmes:~# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.183:80

2.jpg

 

AUTOMATIZACIÓN

  • Configura un sistema automático que:
    • Cuando el contenedor1 consuma toda su RAM, migre la aplicación a contenedor2
    • Cuando contenedor2 consuma toda su RAM, aumente la RAM en vivo a 2 GiB
    • Intenta mejorar el código del script aportado, haciendo un análisis adecuado de la estructura del mismo y preguntando en clase lo que sea necesario.

Script GitHub.

COMPROBAR FUNCIONAMIENTO SCRIPT

RAM cont1

root@holmes:/home/maria# lxc-attach -n cont1 -- stress -m 1 --vm-bytes 512M --vm-keep -t 90s

RAM cont2

root@holmes:/home/maria# lxc-attach -n cont2 -- stress -m 1 --vm-bytes 1024M --vm-keep -t 90s

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *