Linux, containers y virtualización

Intro a la virtualización y los contenedores

Esta vez vamos a emprender el viaje práctico a la virtualización de entornos. En una serie de Blogposts en las que hablaremos de nuestra experiencias en el uso de tecnologías como :

  • Linux Containers (LXC)
  • Docker containers
  • Proxmox
  • QEMU

Hasta ahora nuestra experiencia se reducía a algunos contactos con VirtualBox. Así lograbas una completa máquina virtual en la que correr otros sistemas operativos y/o entornos, que podrían ser diferentes al tuyo (Host).

La experiencia fue agridulce, pues si bien es un adelanto poder disponer de ‘entornos virtuales’ en tu computadora, se hacía bastante pesado, el proceso de creación de la máquina virtual (consumiendo muchos recursos), por no hablar del proceso de exportar luego el trabajo realizado en ello.

Últimamente se habla mucho en la red de redes de Docker, que como reza la entrada correspondiente en Wikipedia es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores software, proveyendo de una capa adicional de abstracción y automatización de virtualización del sistema operativo en Linux

El caso es que Docker (si bien luego tomó su propio camino) basa su potencia en LXC:LinuX Containers. Así que … principiemos por el principio. Hablemos de los contenedores Linux (LXC).

Mi agradable sorpresa ha sido el comprobar como sencillamente puedo crear una máquina (pseudo) virtual , con unos pocos comandos, en mi computadora. Esa (pseudo) máquina hábilmente, gracias a LXC reutiliza el mismo Kernel de la máquina que la alberga (Host). Ecología de recursos. De ahí lo de pseudo .

El caso es que uno de los pocos contras del proceso con LXC es que el nuevo sistema (pseudo) virtualizado (obviamente) debe basarse en el mismo núcleo Linux (Kernel) de la máquina Host.

El primero que me habló de LXC fue mi amigo hk … compartiendo conmigo el concepto de como uno puede usar esta técnica para correr diferentes servicios interconectados entre sí via IP (paralelamente en el mismo Host).

Instalación de las herramientas LXC

Puede variar según la distribución derivada del Kernel Linux que elijamos, y la versión, naturalmente.

Instalar LXC en Debian y derivados ( Ubuntu, Linux Mint…)

Basta con teclear

$ sudo apt install lxc

Instalar LXC en openSUSE Linux

$ sudo zypper in lxc

Familiarizándonos con la tecnología LXC - Linux Containers

Seguiré los pasos de Stéphane Graber para, este vez desde Ubuntu 14.04 en vez de Debian Jessie GNU / Linux , por comodidad.

En un alarde de originalidad, copio y pego los comandos, y los adapto a mi gusto, traduciendo los comentarios que clarifican los pasos a dar. De esto modo podemos ir familiarizándonos cono esta tecnología de ‘contenedores’ que nos permitirá crear entornos y arquitecturas ‘aisladas físicamente’ si bien interconectadas a nivel de servicios.

# Crear "p1" : container usando el template "ubuntu" y la version de Ubuntu
# and architecture as the Host (mi compu _real- ). Con "-- --help" listamos todas las opciones all available options.

$ sudo lxc-create -t ubuntu -n p1

# Iniciar el container (en background)
$ sudo lxc-start -n p1 -d

# Entrar al container en una de los siguientes formas

##  'Attach' a la consola del container' (ctrl-a + q para detach)
$ sudo lxc-console -n p1

## Bash directamente en el container (cortocircuitando el login de consola), requiere >= 3.8 kernel
$ sudo lxc-attach -n p1

## via SSH
$ sudo lxc-info -n p1
$ ssh ubuntu@<ip según lxc-info>

# Stop container, de una de las siguientes formas
## Stop desde él mismo
$ sudo poweroff

## Stop limpiamente desde 'fuera'
$ sudo lxc-stop -n p1

## Kill desde 'fuera'
$ sudo lxc-stop -n p1 -k

Bien.Ya armamos nuestro primer, simple y ligero contenedor Linux - LXC .

A efectos de networking, los paquetes LXC configuran un , y bridge y servidor DHCP automáticamente; que los containers usan por defecto” … Todo ello, obvio, configurable y muy versatil. Con la configuración por defecto, estamos servidos para lo que es nuestro caso de uso.

Vayamos por segundo container que albergue el sistema operativo Debian. Básicamente lo que haremos será usar otro template de container. Es decir :

## creamos el container debian, forzando la arquitectura 
$ sudo lxc-create -t debian -n p2 -- -a i386

## iniciamos el container debian 32bits
$ sudo lxc-start -n p2 -d

## lo chequeamos,

$ sudo lxc-info -n p2
Name:           p2
State:          RUNNING
PID:            5828
IP:             10.0.3.118
CPU use:        1.88 seconds
BlkIO use:      49.66 MiB
Memory use:     85.56 MiB
KMem use:       0 bytes
Link:           vethV01VLC
 TX bytes:      1.79 KiB
 RX bytes:      5.69 KiB
 Total bytes:   7.48 KiB

## notar que, para acceder a él si es necesario por esta via, obtenemos su dirección IP

NOTA: los diferentes containers , dijimos, tendrán siempre de base el mismo Kernel, que comparte con el Host que los alberga. En nuestro caso

## Verificamos el sistema y Kernel del Host (común a los containers)
$ uname --all
Linux RainbowWarrior 3.13.0-37-generic #64 [...]

Para mi uso y propósito personal, instalaré la pila - stack LAMP (Linux+Apache+MySQL+PHP). Y así ya tengo mi servidor Web personal de bolsillo …

Para ello que nos viene como un guante el siguiente comando para procesar un clon.

## pre-condición al clonar : el _container_ a clonar deber estar en stop
$ sudo lxc-stop -n p2

## clonamos 'p2' , nuestro 2º container Debian mínimo con LAMP
$ sudo lxc-clone -o <container original: 'p2'> -n <nombre del nuevo container>

## en nuestro caso, parametrizando lo anterior ..., y lo llamamos lamp1
$ sudo lxc-clone -o p2 -n lamp2

A estas alturas del partido… tenemos 3 instancias LXC en juego

1.- p1 : Ubuntu clon del sistema Host común

2.- p2 : Debian GNU/Linux

3.- lamp2 : Debian GNU/Linux + LAMPhp + phpMyAdmin …

##podemos comprobar el estado operativo de cada container LXC
$ lxc-ls --fancy

… al que, por ejemplo, puedo acceder en

http://10.0.3.85/phpmyadmin/

Voilà.

Reflexiones

Hemos venido usando Docker containers últimamente para determinados casos de uso. Es fácil dejarse llevar ‘por las modas’ tecnológicas… (la industria vive de ello, y de la ‘obsolescencia programada’).

Por otro lado los contenedores Linux (LXC) son la forma de implementar máquinas virtuales ligeras sin necesidad de un hipervisor y la carga que representan. Ello los hace altamente escalables y presentar menos voracidad en cuanto a los recursos de computación. La principal diferencia con los contenedores Docker es que éstos se enfocan en las aplicaciones y ciclos de vida cortos. En cambio, LXC es una tecnología enfocada al sistema operativo y la persistencia.

BONUS : LXC Web Panel para Ubuntu desde el que poder cómodamente gestionar todos los containers LXC …

LXC