Máquinas virtuales, contenedores y Cloud
Requisitos y objetivos
1. Requisitos previos
Tener un acceso root y conocer los comandos del shell bash.
Para los contenedores, instalar docker.
Para la virtualización, tener acceso a un hipervisor (kvm, vmware, virtualbox).
Para el cloud, tener un acceso a Internet y una cuenta AWS.
2. Objetivos
Al final de este capítulo, será capaz de:
Comprender qué son los hipervisores y las máquinas virtuales.
Comprender qué son los contenedores y sus imágenes y cómo utilizarlos.
Comprender qué es el cloud y cuáles son sus ventajas.
Probar AWS desde la consola web o en línea de comandos.
Configurar de una manera básica un sistema invitado en función del hipervisor.
La virtualización
La virtualización es una técnica que permite hacer funcionar a la vez, de manera separada y aislada, varios sistemas operativos o aplicaciones en una misma máquina física.
La diferencia entre un sistema operativo y una aplicación es importante: la máquina virtual no es el único mecanismo de virtualización. También se puede virtualizar una aplicación usando mecanismos de aislamiento.
Se tomarán en cuenta muchos criterios a la hora de tomar la decisión de virtualizar o no. El más importante será el hecho de poder ahorrar. Lo primero, por lo tanto, sería el aspecto económico, ya que el gasto será menor, así como el coste de mantenimiento del hardware. Después, se tendrá en cuenta el ahorro de recursos, gracias a una buena distribución de las máquinas virtuales en los servidores para poder optimizar, precisamente, el conjunto de los recursos. También simplifica las tareas de administración, ya que es más sencillo instalar, desplegar y migrar máquinas virtuales. Se pueden usar distintas herramientas para transformar máquinas físicas en virtuales o viceversa, y el entorno de hardware virtual, normalmente, es idéntico para todas las máquinas virtuales.
1. El cloud
El cloud le permite alquilar servicios de infraestructura en Internet: servidores virtuales, redes, espacio de almacenamiento, etc., bajo la forma de un IaaS (Infrastructure as a Service), por ejemplo. Un servidor en la nube no es más que una máquina virtual, alojada en los servidores de un proveedor (Amazon, Google, Microsoft u otro), al que se accede a través de Internet o a través...
Métodos de virtualización
1. El aislamiento
El aislamiento consiste en ejecutar aplicaciones en entornos aislados los unos de los otros, llamados contextos o zonas de aislamiento. Algunas instancias de una misma aplicación se pueden arrancar simultáneamente, cada una en su contexto. La aplicación no se ejecuta en una verdadera máquina virtual, sino que se encuentra aislada de las otras gracias a una funcionalidad del sistema operativo. El aislador más conocido en Linux es chroot, que permite un cambio de raíz de sistema.
Principio de los aisladores
El principio de chroot es simple. Un directorio contiene todos los elementos necesarios para ejecutar un programa, por ejemplo, un servidor web o ftp: la aplicación y sus archivos de configuración, así como las librerías y los comandos que utilizará. Se aplica el comando chroot a dicho directorio, el cual se convierte en la raíz. Los procesos del servidor solo tienen acceso a los datos que se encuentran en esta nueva raíz y no pueden salir de ella.
El kernel de Linux presenta mecanismos de aislamiento integrados que se llaman namespaces o "espacios de nombre " que definen lo que los procesos podrán ver. El principio es prácticamente el mismo que para chroot (un punto de montaje o directorio contiene todos los elementos necesarios para ejecutar la aplicación). Los procesos que se encuentren...
Paravirtualización
1. Principio
Cuando nos encontramos en presencia de un hipervisor de tipo 1 o 2, el sistema host puede proponer una interfaz aplicativa optimizada y similar a la del hardware real. Esto se conoce como paravirtualización. La interfaz aplicativa API permite que el sistema invitado tenga un acceso casi directo a uno o a varios componentes de hardware.
Paravirtualización: el sistema accede al host gracias a las API
Esta posibilidad la puede ofrecer el kernel, la arquitectura de hardware (por ejemplo, el microprocesador), o incluso los dos.
Cuando son los sistemas invitados los que acceden al hardware, los pilotos que se instalarán establecerán una comunicación directa con la API del sistema host.
En Linux, los productos XEN y KVM utilizan técnicas de paravirtualización si están disponibles.
2. VirtIO
VirtIO, Virtual Input Output, se trata de la interfaz de programación (API) del kernel Linux dedicada a los pilotos de los periféricos de las máquinas virtuales (o más bien de los sistemas invitados).
Una comunicación de tipo FIFO se establece entre el hipervisor (el kernel del sistema host) y el kernel del sistema invitado. Los pilotos se basarán en esta interfaz.
VirtIO es la API predeterminada de KVM, y Linux propone los pilotos de red y discos asociados. Hay otros pilotos que también están disponibles para Windows. VMWare y Virtualbox disponen...
Los contenedores
1. Principio
El aislamiento de uno o de distintos procesos lo realiza el kernel de Linux usando para ello los espacios de nombres y los grupos de control.
El kernel de Linux ofrece las funciones predeterminadas:
Los namespaces, o espacios de nombres, permiten:
-
aislar los procesos y un proceso con PID 1 como primer proceso en su espacio,
-
aislar la red, con su propia dirección IP y sus puertos,
-
aislar los volúmenes de datos, de almacenamiento,
-
aislar los derechos y los usuarios con respecto al host: ser root en un contenedor puede corresponder a un usuario no root en el host.
Los cgroups, o grupos de control, definen los recursos del sistema que un grupo de procesos puede utilizar para:
-
limitar los recursos de memoria o de procesador de un grupo,
-
administrar las prioridades,
-
obtener información «contable» sobre el grupo,
-
controlar en su conjunto (por ejemplo, hacer que se paren) algunos procesos,
-
aislar el grupo, asociándolo a un espacio de nombres,
La asociación de estos dos mecanismos es la base del principio del contenedor.
2. Contenedor y máquina virtual
A veces, se comparan los contenedores con las máquinas virtuales y, aunque se trate de dos tipos de tecnología de virtualización, el concepto es diferente.
Las máquinas virtuales funcionan en hipervisores. Independientemente de si el hardware es emulado o no, las máquinas virtuales ejecutan un sistema operativo completo, con kernel y drivers para los periféricos (incluso los que usan la paravirtualización). Las aplicaciones se instalan en el sistema operativo de la máquina virtual. Desde el punto de vista del hipervisor, la máquina virtual es un proceso único.
Los contenedores funcionan directamente en el host, directamente en el kernel. Los procesos que este contiene son iguales que los otros, pero aislados y limitados en recursos. Si un contenedor tiene 10 procesos, habrá 10 procesos funcionando en el host.
El contenedor usa el kernel del host
3. Los espacios de nombres
Contenedores: espacios de nombres y grupos de control
El PID del primer proceso de un espacio de nombres es el número 1. Todos los procesos hijo forman parte automáticamente de este espacio de nombres y están aislados del resto de espacios de nombres. No ven lo que sucede fuera de su espacio: se trata del «PID namespace».
Dentro de un espacio de nombres...
El cloud
El cloud, o cloud computing, o computación en la nube, consiste en el uso de medios informáticos, generalmente servidores, remotos o a través de una red. En el caso del cloud público, la red sería Internet. La palabra cloud, o nube, indica que el usuario no sabe, o no necesita saber, la ubicación de los servidores.
El cloud también puede ser privado. En este caso, la infraestructura asociada es gestionada por la organización, aunque propondrá al conjunto de servicios o entidades medios idénticos a los de un cloud público: servidores, redes, publicaciones, etc.
Las diferencias entre la nube y un servicio clásico son:
-
Recursos de acceso libre: podemos crear, usar, modificar o simplemente eliminar un servidor según sus necesidades y medios, generalmente, de manera automática, con una respuesta inmediata.
-
El pago por uso o Pay-per-use: solamente se pagará lo que se consuma. El consumo lo mide el operador, no solamente para adaptar su capacidad (añadido de recursos físicos o lógicos), sino también para la facturación.
-
La mutualización: las infraestructuras físicas (servidores, discos, redes) son compartidas por el conjunto de los clientes y pueden ser heterogéneas. Las capas superiores están completamente virtualizadas: máquinas virtuales, contenedores, redes, repartidores de carga, etc.
-
La apertura: ya se trate de un cloud público o privado, el usuario accede a los servicios a través de terminales web, API, CLI, etc, lo que permite un alto nivel de automatización.
Un factor clave es la elasticidad. Se dice que el cloud es elástico, ya que es capaz de adaptarse más rápidamente a las necesidades, expandiendo o reduciendo sus servicios bajo demanda. También se habla de plasticidad y escalabilidad.
Nos concentraremos aquí en el cloud público.
1. Servicios Cloud (o en la nube)
Se distinguen distintos servicios propuestos por los operadores, que se pueden reconocer fácilmente gracias al sufijo "aaS", que significa "as a Service". Todos son servicios en la nube. He aquí los principales:
-
IaaS, Infrastructure as a Service. Es la virtualización de un parque informático: el operador propone servidores virtuales y los servicios asociados, principalmente la red y el almacenamiento....
Sistemas invitados
1. Hipervisor y adiciones
Por sistema invitado, entendemos el sistema operativo instalado en la máquina virtual. Dependiendo del sistema operativo host, habrá disponibles distintos programas. Para Linux:
-
Qemu
-
KVM, deriva de qemu, pero, al usar virtIO y un acceso al kernel, ofrece un mejor rendimiento,
-
Virtualbox, de Oracle también disponible en Windows y macOS,
-
VMWare Workstation, de VMWare, que también es multiplataforma,
-
Xen, hipervisor de tipo 1 que necesita una instalación particular.
Qemu y KVM disponen, por supuesto, de comandos accesibles en shell, y también, gracias a libvirt, dispone de una interfaz gráfica muy eficiente, que permite incluso administrar máquinas virtuales de otros hipervisores (como Virtualbox, Xen, VMware...).
Una distribución Slitaz virtualizada en un hipervisor VirtualBox dentro en una Debian en un sistema Virtualbox en una Ubuntu
Para conseguir un funcionamiento óptimo de los sistemas operativos invitados, se deben tener en cuenta algunos elementos:
-
La cantidad de memoria asignada deber ser la necesaria para el sistema y para el entorno gráfico. Un host con 16 GB de memoria puede hacer funcionar máquinas virtuales de 4 GB (para GNOME o KDE).
-
El número de procesadores debería de ser inferior o igual al número de procesadores del sistema host, aunque este último puede gestionar correctamente los recursos.
-
Para...
Validación de los conocimientos adquiridos: preguntas/respuestas
1. Preguntas
Si cree conocer suficientemente este capítulo, conteste a las siguientes preguntas:
Virtualización, contenedores y cloud
1 ¿Cuál es la diferencia entre un hipervisor de tipo 1 y un hipervisor de tipo 2?
2 ¿En qué se diferencian una máquina virtual y un contenedor?
3 Dentro de un contenedor, ¿cuál es el PID del primer proceso ejecutado?
-
A - 0
-
B - 1
-
C - Aleatorio en función del PID disponible en el host
4 ¿Qué debe haber dentro de un contenedor para poder hacer funcionar cualquier tipo de aplicación?
5 ¿Qué pasa si un proceso de un contenedor intenta usar más memoria de la que tiene asignada?
-
A - Nada, el proceso no podrá ni ejecutarse.
-
B - No se puede limitar la memoria de un contenedor.
-
C - Linux matará el proceso, lo que podría acabar también con el contenedor.
-
D - Linux reiniciará este proceso.
6 ¿Se encuentra el cloud, obligatoriamente, en Internet?
7 ¿Cómo se llama el principio cloud que propone un acceso a un servicio aplicativo específico como, por ejemplo, una base de datos?
8 ¿Para qué sirven los "guest additions"?
-
A - Para optimizar el sistema invitado en función del hipervisor.
-
B - No sirven para nada, el kernel ya contiene todo lo necesario.
-
C - Para acelerar la máquina...
Prácticas
1. Crear un contenedor
Objetivo: crear una imagen Docker que permita ejecutar código Python, y después instanciarla.
Las operaciones presentadas se realizan en Debian 12.
1. |
Primero instale Docker y Python (si es necesario). |
2. |
Cree un directorio hello donde pondrá las diferentes fuentes. |
3. |
Cree un script en Python simple llamado hello.py que muestre "Hello World", y compruebe su funcionamiento en local. |
4. |
Visite el Docker Hub, https://hub.docker.com/, y busque "python". El primer resultado debería ser la imagen oficial. Anote su nombre "python". Este servirá para la instrucción FROM del archivo Dockerfile. |
5. |
Cree un archivo Dockerfile usando la imagen encontrada, copie el archivo fuente y lance el comando Python asociado. |
6. |
Cree una imagen y llámela python-hello. Docker descargará la imagen python desde el Hub y ejecutará las diferentes etapas del Dockerfile para generar la imagen final. |
7. |
El comando docker image debe devolver (al menos) dos imágenes: la imagen python de base, y la suya. |
8. |
Instancie su imagen. |
Soluciones posibles
Objetivo: crear una imagen Docker que permita ejecutar código Python, y después instanciarla.
Las operaciones presentadas se realizan en Debian 12.
1. |
Primero instale Docker y Python (si es necesario).
|
2. |
Cree un directorio hello donde pondrá... |