Máquinas virtuales y contenedores: estado del arte 2024

  • En este artículo veremos: Virtualización en GNU/Linux, Componentes de un entorno virtualizado, Verificar requisitos de hardware e instalar paquetes, Virtualización de aplicaciones, LXD, Docker vs. LXC, Instalación de Docker y ejemplos, Cloud-init, D-Bus machine-id, Acceso seguro usando OpenSSH...

Máquinas virtuales

  • La virtualización es una tecnología que nos posibilita crear innumerables máquinas virtuales (no físicas) en un único hardware, sea éste un PC o un servidor; o en un servicio de cloud computing.

  • Una máquina virtual es una representación lógica de un PC que compartirá los recursos del mismo.

  • La ventaja de usar esta tecnología se basa en que nos permite optimizar los recursos de hardware mediante la consolidación de servidores y aplicaciones, con el consecuente ahorro de dinero y tiempo en la gestión de los mismos.

  • Si bien aquí se habla de virtualización de sistemas operativos y aplicaciones, también podemos virtualizar sistemas de archivos (GSF, HDFS, DSF), almacenamiento (discos duros), bancos de datos, redes definidas por software (SDN) o funciones de red (NFV).

  • En líneas generales existen tres tipos de virtualización:

  • Total (simulación casi total del hardware en la máquina virtual),

  • Parcial (el software a veces se tiene que adaptar),

  • Paravirtualización (el hardware no es simulado).

  • Las tres técnicas difieren en la complejidad de la implementación, el alcance del soporte al sistema operativo y el nivel de acceso a los recursos comunes.

  • De ellas, la virtualización total ofrece el mejor desempeño y escalabilidad comparada con las otras opciones.

Componentes de un entorno virtualizado

sudo snap install multipass # instalar en Ubuntu
multipass launch 22.04 # crear una VM con Ubuntu 22.04

Verificar requisitos de hardware e instalar paquetes

  • Para poder configurar la virtualización en un ordenador se necesita una CPU que la soporte.
  • En las distribuciones GNU/Linux se puede verificar con el siguiente comando:
grep -E 'svm|vmx' /proc/cpuinfo

Virtualización de aplicaciones con contenedores

  • Últimamente han nacido plataformas para la distribución de aplicaciones aisladas del sistema operativo que permiten a éstas ser ejecutadas dentro de un contenedor (container); entre ellas Docker, Podman https://podman.io/, LXC/LXD, systemd-nspawn, y Kata Containers https://katacontainers.io/.

  • Los contenedores utilizan el mecanismo control groups (cgroups) dentro del kernel de Linux para gestionar los recursos de la aplicación.

  • Docker https://www.docker.com/ es una de ellas y lo que hace es crear un contenedor con las bibliotecas y códigos de la aplicación para que ésta pueda ser ejecutada en una máquina virtual o en la nube usando el servicio cloud Docker Hub https://hub.docker.com/.

  • En nuestro PC podemos instalar LXC (ver tutorial https://fortinux.com/tutoriales/tutorial-instalar-lxc-en-gnulinux/), Docker o Vagrant https://www.vagrantup.com/ para ejecutar sistemas operativos o aplicaciones virtuales.

contenedores vagrantup

  • Por otro lado, para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores se utiliza la plataforma desarrollada por Google de código abierto Kubernetes (K8s).

  • Kubernetes es un sofware de orquestación el cual agrupa los contenedores que conforman una aplicación en unidades lógicas para una fácil administración y descubrimiento.

  • Fuente: https://kubernetes.io/es/.

LXD

  • LXD https://canonical.com/lxd es un hypervisor liviano de contenedores y máquinas virtuales.
  • LXC https://linuxcontainers.org/ es el programa que crea y administra contenedores en un sistema local proporcionando una API para permitir que los administradores de nivel superior, como LXD, administren contenedores y máquinas virtuales.
  • En cierto sentido, se podría comparar LXC con QEMU y a LXD con libvirt.

Docker vs LXC

  • En la actualidad hay dos tecnologías populares utilizadas para crear containers: Docker y LXC.

  • En líneas generales LXC ha hecho foco en las operaciones de IT y Docker en el desarrollo y test de las aplicaciones.

  • Docker provee:

    • Una manera simple de empaquetar y entregar aplicaciones junto con sus dependencias,
    • Relativa facilidad de uso y bajos requisitos de administración,
    • Un amplio conjunto de herramientas y utilidades.
  • LXC, siendo una tecnología más antigua de containers, permite:

    • Una VM ligera con su propio hostname, dirección IP, sistema de ficheros, y el init.d completo del SO,
    • Provee acceso SSH directo,
    • Se desempeña casi igual que bare metal,
    • Puede ejecutar eficientemente una o más aplicaciones con múltiples procesos.
    • Es nativa de Linux, muy estable, confiable, eficiente y soportada por el SO mismo.
  • Un contenedor basado en LXC puede ejecutar casi cualquier aplicación basada en Linux sin sacrificar el rendimiento o la facilidad operativa de uso.

  • Esto convierte a LXC en una plataforma ideal para contener aplicaciones empresariales de uso intensivo de datos y sensibles al rendimiento.

  • Fuente: http://lpicentral.blogspot.com/2019/06/linux-containers-comparison-lxc-docker.html.

  • Recursos: https://ubuntu.com/blog/lxd-vs-docker.

Instalación de Docker y ejemplos

  • Para instalar Docker en Rocky Linux:
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf update
sudo dnf install docker-ce docker-ce-cli containerd.io
  • Para configurarlo:
sudo systemctl enable docker
sudo systemctl start docker
systemctl status docker 
sudo usermod -aG docker $USER # agregar usuario al grupo docker
newgrp docker                 # recargar sesión
  • Verificar si se puede acceder y descargar imágenes del Docker Hub:
docker run hello-world
  • Para buscar la imagen de CentOS escribir:
docker search centos
  • Para descargar la última versión se usa el comando pull:
docker pull centos
  • Para ejecutarla y acceder a la shell:
docker run -it centos
ls -la 
exit
  • Para verificar las imágenes que han sido descargadas:
docker images
  • Para verificar los containers activos e inactivos:
docker ps -a
  • Para iniciar/parar un container activo:
docker start/stop container-id

Instalación de Docker en CentOS

  • En CentOS primero se debe eliminar podman https://podman.io/ y la herramienta buildah, que cumplen en líneas generales las mismas funciones que Docker.

  • En caso de querer utilizar podman para gestionar containers usando los comandos de Docker simplemente se crea un alias: alias docker=podman.

  • Pasos para instalar y usar Docker:

  • Actualizar la base de datos de paquetes:

sudo yum erase podman buildah
sudo yum check-update
sudo yum -y update
  • Agregar el repositorio oficial de Docker, descargar la última versión, e instalarla:
curl -fsSL https://get.docker.com/ | sh
  • Iniciar el demonio Docker:
sudo systemctl start docker
  • Verificar que se está ejecutando:
sudo systemctl status docker
  • Configurar Docker para iniciar en cada reinicio del SO:
sudo systemctl enable docker
  • Agregar el usuario al grupo de Docker:
sudo usermod -aG docker $(whoami)
docker
docker info

Cloud-init

  • Las imágenes en la nube son plantillas de sistemas operativos y cada instancia comienza como un clon idéntico de todas las demás instancias.

  • Son los datos del usuario los que le dan a cada instancia en la nube su personalidad y cloud-init es la herramienta que aplica los datos del usuario a sus instancias automáticamente.

  • Para ello se utilizan ficheros de texto plano YAML (YAML Ain’t Markup Language) con una sintaxis llamada cloud-config.

  • Se usa cloud-init para configurar:

    • Default locale,
    • Hostname,
    • Generar y configurar las llaves SSH privadas,
    • Definir puntos de montajes temporales,
    • etc.
  • Documentación oficial: https://cloud-init.io/.

D-Bus machine-id

  • El fichero /etc/machine-id contiene el ID de máquina única del sistema local que se establece durante la instalación.
  • Este parámetro debe ser único, pero cuando el usuario clona la máquina virtual, el "ID de máquina" de la máquina virtual clonada no cambia.
cat /etc/machine-id
  • Para cambiarlo, primero se elimina el machine-id original:

  • Crear el nuevo valor de machine-id:

sudo systemd-machine-id-setup
  • Verificar el nuevo machine-id:
cat /etc/machine-id

Acceso seguro usando OpenSSH

  • Para acceder a una máquina virtual remota se usa OpenSSH: se instala el servidor en remoto y en local el cliente compartiendo las claves.

  • Para crear el par de claves SSH públicas y privadas, primero se crean las llaves en nuestro ordenador:

ssh-keygen -t dsa -C "email@ejemplo.com" 
  • Pulsamos la tecla INTRO cuando pregunta en que fichero salvar la llave, escribimos una clave y ya se tiene el par de llaves creado.
  • Luego establecemos una conexión con el otro ordenador, servidor o VM para copiar la llave:
cat ~/.ssh/id_dsa.pub | ssh usuario@ip_servidor 'cat >> .ssh/authorized_keys'

Imagen de portada: Foto de Pixabay por foudefoot60 from Pixabay

Si buscas un formador para realizar este curso u otra actividad formativa (webinar, workshops, bootcamps, etc.) en tu organización, me puedes ubicar a través de la página de contacto. Muchas gracias.

Si te ha gustado el artículo puedes ayudarme haciendo una donación con criptomonedas. Gracias!!!