- 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
- 
Los componentes de un entorno de virtualización son el hypervisor (virtual machine monitor ó VMM) y la maquina virtual (virtual machine ó VM de sus siglas en inglés). 
- 
El hypervisor es una capa de hardware, firmware o software que funciona como anfitrión (host), creando y hospedando las máquinas virtuales clientes (guests). 
- 
El hypervisor puede ser: - Nativo o de tipo 1 (bare metal) funcionando entre la capa de hardware y la del sistema operativo.
- De tipo 2 (hosted), alojado dentro del sistema operativo de ese PC (VirtualBox, VMWare).
 
- 
Nativos de tipo 1: - Red Hat Openshift https://www.redhat.com/en/technologies/cloud-computing/openshift,
- Oracle VM Server for x86 https://docs.oracle.com/en/virtualization/oracle-vm/index.html,
- Citrix XenServer http://xenserver.org/,
- VMware ESX/ESXi https://www.vmware.com/ar/products/esxi-and-esx.html,
- Microsoft Hyper-V https://docs.microsoft.com/es-es/virtualization/hyper-v-on-windows/reference/hyper-v-architecture).
- Proxmox Virtual Environment (VE) https://www.proxmox.com/en/.
 
- 
En GNU/Linux se pueden utilizar: - KMV https://www.linux-kvm.org/page/Main_Page (si nuestro procesador soporta virtualización).
- QEMU https://www.qemu.org/.
  
- 
Por otro lado Openstack https://www.openstack.org/, que forma parte de la OpenInfra Foundation https://openinfra.dev/, es el sofware open source más desplegado en ambientes cloud del mundo. 
- 
Es una infraestructura cloud para máquinas virtuales, Bare Metal, y contenedores que gestiona, mediante APIs o un panel web, grandes grupos de recursos informáticos, de almacenamiento y de red. 
- 
Como hypervisor de tipo 2 (hosted) se puede utilizar la versión open source de VirtualBox. 
- 
Para la gestión de las plataformas virtualizadas se utiliza generalmente la API libvirt https://libvirt.org/. 
- 
Open source virtualization tools planet: https://planet.virt-tools.org/. 
- 
Para crear máquinas virtuales en Ubuntu, Canonical recomienda Multipass https://multipass.run/. 
- 
Permite ejecutar instancias de Ubuntu utilizando los metadatos de cloud-init de la misma manera que se hace en AWS, Azure, Google, IBM y Oracle. 
- 
Multipass se puede instalar en Linux, Windows y macOS; y con un simple comando permite crear ambientes virtuales. 
- 
Utiliza Hyper-V en Windows, QEMU e HyperKit en macOS y LXD en Linux. 
- 
Documentación: https://ubuntu.com/server/docs/virtualization-multipass. 
sudo snap install multipass # instalar en Ubuntu
multipass launch 22.04 # crear una VM con Ubuntu 22.04Verificar 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/cpuinfoVirtualizació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. 

- 
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-idInstalació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 infoCloud-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-idAcceso 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'- 
Donde “usuario” es nuestro nombre de usuario (o root también) e “ip_servidor” es la IP del servidor, por ejemplo 10.0.0.2. 
- 
Mayor información la podéis encontrar en: 
- 
https://help.github.com/articles/generating-an-ssh-key/ (idioma inglés). 
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!!!


