- 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.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.
-
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'
-
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!!!