Suscríbase al feed

El modo de imagen de Red Hat Enterprise Linux utiliza las mismas herramientas, habilidades y patrones que las aplicaciones organizadas en contenedores para ofrecer un sistema operativo más fácil de compilar, enviar y ejecutar. En esta publicación, se abordarán los conceptos básicos de la función y se presentarán a los usuarios los principios esenciales para empaquetar sistemas operativos en las imágenes de contenedores de Open Container Initiative (OCI).

Los siguientes pasos y procesos te ayudarán a comprender mejor estas nociones desde una perspectiva práctica mediante la creación y la implementación de una imagen personalizada.

Requisitos:

  1. Todos los comandos deben ejecutarse en un sistema de Red Hat Enterprise Linux, versión 9 en adelante, con suscripción activa (puede ser en una computadora portátil, una máquina virtual, etc.) y con al menos 10 GB de espacio disponible en el disco. Ten en cuenta que es posible que se requiera más espacio según el tamaño y la cantidad de imágenes que se creen.
  2. Una cuenta de Red Hat con suscripciones de desarrollo o producción (las suscripciones gratuitas para desarrolladores están disponibles aquí).

Un registro de contenedores: en este ejemplo se usará quay.io como registro en el que se publica el contenido, pero puedes optar por otro servicio de registro alojado o ejecutar uno de manera local. Puedes crear una cuenta de quay.io de forma rápida y sencilla aquí.

Primeros pasos

Empieza por confirmar que tu sistema esté suscrito para obtener contenido de Red Hat Enterprise Linux.

$ sudo subscription-manager register

Luego, instalaremos Podman. Recomendamos usar la última versión disponible, pero cualquier versión 4 o superior funcionará. Ten en cuenta que otras herramientas de contenedores, como Docker o las herramientas de canal de contenedores, pueden funcionar en un entorno de producción. En este ejemplo, se enseñarán los conceptos con Podman, pero recuerda que otros recursos podrían ser más útiles para tu entorno.

$ sudo dnf -y install podman

Ahora es el momento de autenticarse a través de register.redhat.io. Para comenzar, visita la página https://access.redhat.com/terms-based-registry y haz clic en "New service account". Desde allí, haz clic en el nombre de la nueva entrada y copia y pega las instrucciones de "docker login" en la terminal, remplazando el comando docker con podman. Si necesitas más información, las instrucciones completas están aquí. La conversión de la imagen de contenedor a una imagen de disco con la herrameinta para compilar imágenes requerirá privilegios avanzados con podman. Realiza la autenticación en el registro con y sin sudo.

$ podman login registry.redhat.io
#repeat with sudo
$ sudo podman login registry.redhat.io

Las imágenes de contenedores bootc difieren técnicamente de los contenedores de aplicaciones de dos maneras importantes:

  • Las imágenes bootc usan OSTree dentro del contenedor.
  • Una imagen bootc tiene un kernel y otros paquetes necesarios para arrancar una máquina física o virtual.

Las imágenes base de contenedores para aplicaciones generalmente contienen un conjunto mínimo de paquetes que no están relacionados con la gestión del hardware. Y, a diferencia de Red Hat Universal Base Image (UBI), las imágenes bootc de Red Hat Enterprise Linux se distribuyen con los mismos términos de licencia que ese sistema operativo.

Extraigamos la imagen base rhel-bootc.

$ podman pull registry.redhat.io/rhel9/rhel-bootc:9.4

Creación de un archivo Containerfile

Ahora, veamos un ejemplo de un archivo Containerfile. Posiblemente lo conozcas como Dockerfile. Comenzaremos con algo sencillo e instalaremos una stack lamp. Guarda el siguiente texto en un archivo nuevo denominado Containerfile:

FROM registry.redhat.io/rhel9/rhel-bootc:9.4

#install the lamp components
RUN dnf module enable -y php:8.2 nginx:1.22 && dnf install -y httpd mariadb mariadb-server php-fpm php-mysqlnd && dnf clean all

#start the services automatically on boot
RUN systemctl enable httpd mariadb php-fpm

#create an awe inspiring home page!
RUN echo '<h1 style="text-align:center;">Welcome to image mode for RHEL</h1> <?php phpinfo(); ?>' >> /var/www/html/index.php

Hemos descrito un sistema operativo sencillo que ejecutará un servidor web en el puerto 80 y cuenta con una base de datos, además del lenguaje PHP. Compilemos la imagen de contenedor:

Compilación de una imagen

$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc:latest

Nota:

La opción -t etiquetará la imagen. En este ejemplo, se supone que se usa el registro quay.io. Recuerda hacer los ajustes necesarios para el registro que estés usando.

La opción -f le indicará a Podman que use el archivo Containerfile.

Prueba de la imagen

Ahora que tenemos nuestra imagen, probémosla enseguida. Dado que es un contenedor, se ejecuta rápidamente y podremos comprobar si tenemos algún error ortotipográfico, ya que aparecerá un mensaje. Para que sea más sencillo, lo llamaremos (lamp):

$ podman run -d --rm --name lamp -p 8080:80 quay.io/[my_account]/lamp-bootc:latest /sbin/init

El contenedor se ejecutará y, en este momento, no es necesario iniciar sesión. Abre un explorador y comprueba que se pueda ver la página web que se está publicando en http://[tu_dirección_IP]:8080. Si la página no se carga, vuelve a revisar las reglas del firewall. Si estás usando un sistema local, la dirección de loopback debería funcionar sin problemas. En este ejemplo, estamos ejecutando systemd. Sin embargo, para muchos casos de prueba, será más eficiente ejecutar una aplicación. Uno de los aspectos más importantes del uso de los contenedores para definir las imágenes del sistema operativo es lograr que las pruebas y las validaciones sean rápidas.

Puedes acceder a la instancia de contenedor en ejecución con podman exec, utilizando el nombre que establecimos anteriormente.

$ podman exec -it lamp /bin/bash

Con el mismo nombre, detén la instancia:

$ podman stop lamp

Envío del contenido a un registro

A continuación, inicia la sesión en quay.io para autenticarte, envía la imagen al registro y configura el repositorio para que sea de acceso público.

$ podman login quay.io
$ podman push quay.io/[my_account]/lamp-bootc:latest

En este punto, hemos creado una imagen en capas que podemos implementar, y hay varias maneras de instalarla en un host: podemos usar el instalador de Red Hat Enterprise Linux e implementar (a través de USB, PXE, etc.) un sistema de servidor dedicado (bare metal) o convertir la imagen de contenedor en una de arranque con la herramienta para compilar imágenes de RHEL. Ten en cuenta que una vez que el contenedor esté "instalado", las actualizaciones futuras se aplicarán directamente desde el registro de contenedores a medida que se publiquen. Por lo tanto, el proceso de instalación solo debe hacerse una vez.

Implementación a través de KVM/QEMU con una imagen de disco QCOW2

En este ejemplo, se usará la herramienta para compilar imágenes para convertir la imagen de contenedor en un disco formateado en QCOW2. Se supondrá que la imagen está en un repositorio de acceso público. Consulta la documentación de la herramienta para convertir imágenes de RHEL y aprende a utilizar una imagen de un repositorio privado. También hay otros formatos de imagen disponibles, además de QCOW2.

Primero, crea un archivo config.json que habilite la configuración del disco que se generó. Para este ejemplo, el archivo config.json incluirá los usuarios que deseas crear. Pega tu clave SSH y tu contraseña.

{
 "blueprint": {
   "customizations": {
     "user": [
       {
         "name": "cloud-user",
         "password": "changeme",
         "key": "ssh-rsa AAAAB3Nz..........",
         "groups": [
           "wheel"
         ]
       }
     ]
   }
 }
}

Luego, proporciona el archivo config.json junto con el contenedor lamp a la herramienta para compilar imágenes de RHEL:

$ sudo podman run --rm -it --privileged \
-v .:/output \
-v $(pwd)/config.json:/config.json \
--pull newer \
registry.redhat.io/rhel9/bootc-image-builder:9.4 \
--type qcow2 \
--config /config.json \
quay.io/[my_account]/lamp-bootc:latest

Una vez que la imagen esté lista, podemos ejecutarla usando libvirt (o QEMU directamente).

virt-install \
 --name lamp-bootc \
 --memory 4096 \
 --vcpus 2 \
 --disk qcow2/disk.qcow2 \
 --import \
 --os-variant rhel9.4

Con la máquina virtual en ejecución, deberías poder comprobar que el sitio se está ejecutando al ver  http://[tu_dirección_IP_ de_la_instancia] en un explorador.

Implementación en AWS con una imagen de disco de AMI

Para este ejemplo, necesitaremos confirmar que cloud-init esté disponible en el archivo lamp Containerfile que creamos anteriormente. Aquí es donde el flujo de trabajo de contenedores nos ayuda, y podemos crear una imagen en capas para nuestro caso práctico de forma sencilla. Haremos una demostración de una compilación en capas, pero puedes editar el archivo Containerfile original para incluir cloud-init si te resulta mejor.

FROM quay.io/[my_account]/lamp-bootc:latest
#install cloud-init for AWS
RUN dnf install -y cloud-init && dnf clean all

Compila y envía la imagen:

$ podman build -f Containerfile -t quay.io/[my_account]/lamp-bootc-aws:latest
$ podman push quay.io/[my_account]/lamp-bootc-aws:latest

Vamos a basarnos en cloud-init para introducir los usuarios y las claves SSH, lo que nos permitirá omitir el paso del archivo config.json del ejemplo de KVM anterior. (La creación de una configuración cloud-init no se incluye en este documento). Al usar esta configuración, mejoramos la estrategia de seguridad, ya que no es necesario tener credenciales codificadas en nuestra imagen. Luego, ejecuta la herramienta para compilar imágenes de RHEL y crea nuestra AMI:

$ sudo podman run --rm -it --privileged \
 --pull=newer \
 --security-opt label=type:unconfined_t \
 -v $XDG_RUNTIME_DIR/containers/auth.json:/run/containers/0/auth.json \
 -v $HOME/.aws:/root/.aws:ro \
 --env AWS_PROFILE=default \
 registry.redhat.io/rhel9/bootc-image-builder:9.4:latest \
 --type ami \
 --aws-ami-name lamp-bootc-aws \
 --aws-bucket bootc-bucket \
 --aws-region us-east-1 \
 quay.io/[my_account]/lamp-cloud-init-bootc:latest

Hay otras opciones disponibles para configurar las propiedades para AWS. Consulta este enlace para obtener más información.

Una vez que el proceso de publicación se complete con éxito, ejecuta tu imagen y prepárate para sorprenderte al ver http://[tu_dirección_IP_ de_la_instancia] en un explorador.

Instalación en un servidor dedicado (bare metal) a través de Kickstart

Como has visto, hay varias maneras de instalar nuestro contenedor. En esta sección se cubre el uso de Kickstart, que se utiliza mucho para las implementaciones en servidores dedicados (bare metal) que usan unidades ISO, PXE o USB. Se asume que cuentas con cierto conocimiento sobre los conceptos de Kickstart, ya que en esta guía no se entran en detalles sobre ese tema. En el siguiente ejemplo, introduce la información relacionada con los usuarios, las contraseñas y las claves SSH. Se admite que se agreguen opciones, pero ten en cuenta que la sección %packages no se puede usar con este flujo de trabajo porque estamos remplazando la instancia con la imagen de contenedor. Descarga la ISO de arranque 9.4 para tu arquitectura desde este sitio.

text
network --bootproto=dhcp --device=link --activate
# Basic partitioning
clearpart --all --initlabel --disklabel=gpt
reqpart --add-boot
part / --grow --fstype xfs
# Here's where we reference the container image to install - notice the kickstart
# has no `%packages` section!  What's being installed here is a container image.
ostreecontainer --url quay.io/[my_account]/lamp-bootc:latest
firewall --disabled
services --enabled=sshd
# optionally add a user
user --name=cloud-user --groups=wheel --plaintext --password=changemme
sshkey --username cloud-user "ssh-ed25519 AAAAC3Nza....."
# if desired, inject a SSH key for root
rootpw --iscrypted locked
sshkey --username root "ssh-ed25519 AAAAC3Nza....." #paste your ssh key here
reboot

Copia este archivo de configuración en un servidor web, actualiza la contraseña y la clave SSH, arranca todos los sistemas físicos o virtuales con los medios de instalación y agrega lo siguiente a los argumentos del kernel:

inst.ks=http://path_to_my_kickstart

Presiona Ctrl + x para arrancar con esta opción.

Si un servidor HTTP no está disponible, puedes usar el  módulo http server que se incluye en la mayoría de las instalaciones de Python. En el directorio que contiene el archivo Kickstart, ejecuta:

$ python -m http.server

Existe otro enfoque que no utiliza un servidor HTTP para alojar el archivo Kickstart, sino que lo inserta en la ISO del instalador. El paquete Lorax incluye una herramienta denominada mkksiso que puede integrar este archivo en una ISO. Esto es útil para arrancar directamente desde una memoria USB, sin tener que  editar el menú de arranque. Ejecuta: mkksiso --ks /PATH/TO/KICKSTART /PATH/TO/ISO /PATH/TO/NEW-ISO

Envío de una actualización

Un aspecto importante de este caso es que la instalación o la implementación son tareas que se llevan a cabo una sola vez. Gran parte del valor de este modelo se encuentra en el día 2, cuando los cambios se pueden realizar al enviar las imágenes al registro. Las actualizaciones son automáticas de forma predeterminada. Por supuesto, esto se puede configurar fácilmente para los períodos de mantenimiento o deshabilitar por completo. Para probarlo, realiza un cambio en tu archivo Containerfile y repite los pasos para enviar la compilación y que la nueva imagen esté disponible en tu registro.& El temporizador predeterminado para la unidad systemd se activará después de una hora de tiempo de actividad, pero puedes utilizar el comando "bootc upgrade" para obtener la actualización antes.

Próximos pasos

Ahora que has visto un ejemplo sencillo del modo de imagen de Red Hat Enterprise Linux, te recomendamos que veas algunos de tus propios casos prácticos y tengas en cuenta las posibilidades y las eficiencias operativas que se pueden obtener al usar herramientas de contenedores para crear versiones y gestionar las implementaciones de los sistemas operativos. Asegúrate de darle un vistazo a nuestro repositorio de ejemplos de bootc, que te permitirán habilitar una serie de plataformas y casos útiles. También te animamos a que consultes la documentación completa cuando estés listo para profundizar más en el tema. 


Sobre el autor

Ben Breard is a Senior Principal Product Manager at Red Hat, focusing on Red Hat Enterprise Linux and Edge Offerings.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

Navegar por canal

automation icon

Automatización

Las últimas novedades en la automatización de la TI para los equipos, la tecnología y los entornos

AI icon

Inteligencia artificial

Descubra las actualizaciones en las plataformas que permiten a los clientes ejecutar cargas de trabajo de inteligecia artificial en cualquier lugar

open hybrid cloud icon

Nube híbrida abierta

Vea como construimos un futuro flexible con la nube híbrida

security icon

Seguridad

Vea las últimas novedades sobre cómo reducimos los riesgos en entornos y tecnologías

edge icon

Edge computing

Conozca las actualizaciones en las plataformas que simplifican las operaciones en el edge

Infrastructure icon

Infraestructura

Vea las últimas novedades sobre la plataforma Linux empresarial líder en el mundo

application development icon

Aplicaciones

Conozca nuestras soluciones para abordar los desafíos más complejos de las aplicaciones

Original series icon

Programas originales

Vea historias divertidas de creadores y líderes en tecnología empresarial