2.- Tipos de virtualización
En el campo de la computación en la nube, la virtualización desempeña un papel fundamental al permitir la creación de entornos virtuales que aprovechan eficientemente los recursos de hardware. Existen diferentes tipos de virtualización, y en esta sección vamos a explorar tres de ellos: Emulación, virtualización y paravirtualización. A continuación, exploraremos estos tipos de virtualización y proporcionaremos ejemplos de cada uno:
- Emulación: La emulación es un enfoque de virtualización que permite ejecutar un sistema operativo o una aplicación en un entorno que simula el hardware original. En este caso, el hardware virtualizado es diferente al hardware físico subyacente. Un ejemplo común de emulación es el software de emulación de videojuegos arcade antiguos, donde se recrean las características de una consola de juegos con hardware de los año 80.
La emulación proporciona una gran flexibilidad, ya que permite ejecutar sistemas operativos y aplicaciones diseñadas para un hardware específico en un hardware diferente. Sin embargo, debido a la naturaleza de la emulación, es menos eficiente en términos de rendimiento que otros enfoques de virtualización, ya que hay que virtualizar por completo el hardware emulado.
- Virtualización tradicional: La virtualización tradicional, también conocida como virtualización completa, se basa en la creación de máquinas virtuales (VM) que ejecutan sistemas operativos y aplicaciones en un hardware virtualizado e independiente unas de otras. En este caso, cada máquina virtual tiene que tener su propio sistema operativo independiente del SO anfitrión. Ejemplos populares de software de virtualización tradicional son VMware, Microsoft Hyper-V, VirtualBox, etc. Las máquinas virtuales creadas necesitan ser ejecutadas sobre un software especial que las interprete y gestione, llamado hipervisor, también conocido como VMM (Virtual Machine Monitor), que es el que se encarga de realizar las peticiones hardware al sistema operativo anfitrión o emular el hardware que no esté disponible en la máquina real. Su función principal es dividir los recursos físicos de la máquina anfitrión en múltiples entornos virtuales.
La virtualización tradicional permite ejecutar múltiples sistemas operativos en un único servidor físico y proporciona un alto nivel de aislamiento entre las máquinas virtuales. Cada máquina virtual se comporta como si estuviera ejecutándose en su propio hardware dedicado. Esto facilita la consolidación de servidores y la gestión de infraestructuras complejas.
Existen dos tipos principales de hipervisores (gestores e interpretes de VM):
- Hipervisor de tipo 1 (o "bare metal"): Este tipo de hipervisor se ejecuta directamente sobre el hardware físico del servidor. No requiere de un sistema operativo anfitrión adicional. Los hipervisores de tipo 1 ofrecen un mayor rendimiento y eficiencia, ya que pueden acceder directamente a los recursos del hardware. Algunos ejemplos populares de hipervisores de tipo 1 son VMware ESXi, Microsoft Hyper-V y Xen.
- Hipervisor de tipo 2 (o "hosted"): Este tipo de hipervisor se ejecuta como un software dentro de un sistema operativo anfitrión. El sistema operativo anfitrión proporciona los controladores de dispositivo y los servicios básicos, mientras que el hipervisor se ejecuta como una aplicación dentro de él. Los hipervisores de tipo 2 son más fáciles de instalar y configurar, pero pueden tener un rendimiento ligeramente inferior debido a la capa adicional del sistema operativo anfitrión. Algunos ejemplos de hipervisores de tipo 2 son VMware Workstation, VirtualBox, QEMU y Parallels Desktop.
- Hipervisor híbrido: Además de estos dos tipos principales, también existe una variante llamada "hipervisor híbrido", que combina características de los hipervisores de tipo 1 y tipo 2. Estos hipervisores se ejecutan directamente sobre el hardware pero también requieren de un sistema operativo anfitrión mínimo para proporcionar servicios adicionales. Un ejemplo de este tipo híbrido puede ser Proxmox, que necesita de una distribución Debian con el kernel de Linux y el hipervisor de tipo 2 de código abierto QEMU, como base para la gestión de las máquinas virtuales, y KVM (Kernel-based Virtual Machine) para la gestión de contenedores LXC.
- Paravirtualización: La paravirtualización es un enfoque de virtualización en el que el sistema operativo invitado se modifica para ser consciente de que se está ejecutando en un entorno virtualizado. A diferencia de la virtualización tradicional, donde se emula el hardware, en la paravirtualización se utilizan interfaces especiales para acceder al hardware subyacente de manera más eficiente.
En la paravirtualización, el sistema operativo invitado y el sistema operativo anfitrión colaboran para mejorar el rendimiento y la eficiencia general. Esto permite una comunicación más rápida y directa entre el sistema operativo invitado y el hardware real, lo que resulta en un mejor rendimiento en comparación con la virtualización tradicional. Las máquinas paravirtualizadas comparten el kernel del SO anfitrión y por tanto, no se puede virtualizar máquinas con sistemas operativos incompatibles.
El hipervisor ofrece un interfaz especial para acceder a los recursos. En ocasiones, es necesario la adaptación del sistema operativo de la máquina virtual. Ofrecen el máximo rendimiento, pero no se pueden usar sistemas operativos sin modificaciones o hardware especifico.
- Paravirtualización ligera: También llamada virtualización a nivel de sistema operativo, o virtualización basada en contenedores. Es un método de virtualización en el que, sobre el núcleo del sistema operativo se ejecuta una capa de virtualización que permite que existan múltiples instancias aisladas de espacios de usuario. A cada espacio de usuario aislado lo llamamos contenedor. Por lo tanto, un contenedor es un conjunto de procesos aislado, que se ejecuta en un servidor, y que accede a un sistema de ficheros propio, tiene una configuración red propio y accede a los recursos del host (memoria y CPU).
Podemos hacer la siguiente clasificación de contenedores:
- Los contenedores hardware o de sistema.
- Los contenedores software o de aplicación.
2.2.- Contenedores de sistemas (LXC)
La virtualización ligera a nivel de hardware, también conocida como contenedores hardware, es una tecnología que permite ejecutar múltiples instancias aisladas de sistemas operativos en un único servidor físico pero aprovechando el sistema operativo anfitrión para acceder al hardware. Un ejemplo común de esta tecnología es LinuX Containers (LXC) que aprovecha el núcleo de Linux del SO del servidor anfitrión (o host).
Evidentemente, no podemos crear un contenedor hardware LXC con un núcleo del SO diferente al de Linux.
Los contenedores a nivel de hardware ofrecen una gran flexibilidad y agilidad, ya que se pueden iniciar y detener rápidamente, y ocupan menos recursos en comparación con las máquinas virtuales convencionales. Esto los hace ideales para implementar aplicaciones aisladas en entornos de desarrollo, pruebas o producción. Permite una mayor densidad de utilización de recursos, al compartir eficientemente el hardware del sistema, lo que resulta en un menor consumo energético y reserva de recursos en comparación con la virtualización completa. Además, los contenedores LXC son rápidos de crear, clonar y desplegar, lo que facilita la escalabilidad y la replicación de distintos escenarios.
Son una opción más interesante que los contenedores de aplicaciones, como por ejemplo Docker, cuando tenemos la necesidad de emular un hardware específico pero sin sobrecargar al servidor con la virtualización completa de las tradicionales máquinas virtuales (un ejemplo de máquina virtual tradicional son las creadas con VirtualBox)
La virtualización LXC se basa en la creación de contenedores ligeros y aislados de los errores producidos en otros LXC. Estos contenedores permiten ejecutar múltiples instancias de sistemas operativos Linux de forma eficiente y compartiendo los recursos del sistema anfitrión, como CPU, memoria y almacenamiento.
Cada contenedor LXC incluye su propio entorno de usuario y su espacio de archivos aislado, lo que permite la ejecución de aplicaciones y servicios de manera independiente dentro del contenedor. Los contenedores pueden comunicarse entre sí y con el sistema operativo anfitrión mediante mecanismos de comunicación definidos, como sockets UNIX o redes virtuales utilizando la pila del protocolo TCP/IP.
El hardware de los contenedores LXC puede ser configurado, cómo ejemplo podemos reservar memoria máxima de RAM para utilizar, número de núcleos o hilos del procesador a utilizar, etc... Es decir, podemos hacer lo mismo que podías hasta ahora hacer con las máquinas virtuales pero sin tener que emular el hardware por completo.
En resumen, los contenedores de sistema LXC es una tecnología que permite la virtualización a nivel de sistema operativo en entornos Linux, a través de paravirtualización ligera para compartir los recursos del sistema anfitrión. Esta tecnología ofrece beneficios en términos de eficiencia de recursos y escalabilidad en el desarrollo, pruebas y despliegue continuo de aplicaciones.