Configuración de Docker en producción: LVM

Cuando se está utilizando docker en producción surge en algún momento la pregunta ¿Qué hago si necesito más espacio?. Esta pregunta es fácilmente contestada en arquitecturas tradicionales y es montando LVM (Logic Volume Manager).

Términos:
  • PV (Volumen físico): Se refiere a dispositivos conectados al sistema (/dev/sdX, /dev/rmX, etc).
  • GV (Grupo de volumenes): Agrupa un conjunto de volúmenes físicos.
  • LV (Volumen lógico): Unidad lógica que permite almacenar información y posteriormente ser montada en alguna ubicación (o no).

La gran ventaja de tener volúmenes lógicos es que con algunos comandos es posible montar un nuevo disco al grupo de volúmenes y posteriormente aumentar el espacio de volumen lógico.

¿Disco duro y docker?

En un principio Docker utilizaba AUFS como Storage Backend, pero por diversas razones estratéticas decidieron crear su propio sistema el cual es conocido como Device Mapper. [1]

La razon principal para utilizar este sistema, es que Docker utiliza en el disco y crea "capas" para el almacenamiento de las imágenes.

Preparación del sistema

Instalación de utilidades adicionales de lvm [1:1]:

# apt-cache policy thin-provisioning-tools
# apt-get install thin-provisioning-tools

Creación de volúmenes físicos:
# pvcreate /dev/sd[b,c,d]

Creación de grupo de volúmenes:
# vgcreate docker /dev/sd[b,c,d]

Creación de volúmenes lógicos para docker
# lvcreate --wipesignatures y -n thinpool docker -l 95%VG
# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
Conversión de pool a thinpool

# lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta

Configuración del perfil de LVM

Editar /etc/lvm/profile/docker-thinpool.profile:
# vi /etc/lvm/profile/docker-thinpool.profile

Y agregar:

activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}

Aplicar perfil de LVM:
lvchange --metadataprofile docker-thinpool docker/thinpool

Verificar que se encuentre monitoreado:
lvs -o+seg_monitor

Configuración de Device Mapper con LVM

En este punto es necesario cambiar la forma de arranque de docker para que utilice el volumen lógico previamente creado. Es necesario tener en cuenta que se perderan todos los datos, por lo que se podría crear un backup de la carpeta /var/lib/docker.

Editar /etc/docker/daemon.json
# vi /etc/docker/daemon.json

Y agregar:

{
  "storage-driver": "devicemapper",
   "storage-opts": [
     "dm.thinpooldev=/dev/mapper/docker-thinpool",
     "dm.use_deferred_removal=true",
     "dm.use_deferred_deletion=true"
   ]
}
Recargar el demonio de docker

# systemctl daemon-reload

Iniciar el demonio de docker

# systemctl start docker

De esta forma tendremos docker corriendo con LVM. Si desearamos extender el volúmen lógico sería tan facil como: # lvextend -L +10G /dev/docker/thinpool

¿Es posible utilizar con LVM (Mirror)?

No. Un thinpool no puede tener espejos.

¿Es posible utilizar con LVM otra configuración de discos (raid10)?

Es cierto que actualmente con LVM es posible crear una configuración raid10 lvcreate --type raid10... y el resultado que tuve es que se crearon correctamente los volúmenes y cuando ejecutaba el comando para convertir de pool a thinpool funcionaba correctamente lvconvert pero al analizar la nueva configuración del volumen con el comando lvdisplay no se veía que tuviera las "réplicas", sin embargo, el tamaño del disco no se podía extender más que un raid10 (disco1 + disco2 + disco3 + disco4) / 2, por esto supongo que internamente si se conserva el raid10, pero al parecer no es compatible. Sobre este tema no hay mucha información en la red, al parecer no es muy común este tipo de aquitecturas, o quizá falta madurez en este tipo de temas.


  1. Explicación oficial de Device Mapper ↩︎ ↩︎

Juan Pablo Arias

I constantly discover new technologies and ways to improve IT processes. I'm a fan of automation. I like programming, but my passion is cloud computing.