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
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
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