En este post vamos a hablar del framework S2I de OpenShift para la generación de imágenes de despliegue a partir de código fuente. S2I es un framework desarrollado por RedHat para OpenShift pero que igualmente puede ser utilizado para la creación de contenedores software sobre plataformas de contenedores Docker, al apoyarse S2I en esta tecnología.
Introducción
Dentro de los componentes que comprenden la plataforma de OpenShift para poder levantar contenedores de aplicación sobre ciertos pods, es concretamente sobre los objetos de construcción (BuildConfig) donde puede hacerse uso del framework S2I para la generación y registro de la imágenes de despliegue.
S2I es una de las estrategias de construcción utilizadas por este tipo de objetos (en el resto de estrategias de despliegue podremos profundizar en otros artículos), donde a partir de ciertos repositorios de código fuente binario, es posible generar una imagen de despliegue final:
S2I hace uso como entrada para la generación de la imagen de despliegue, de una imagen Docker de construcción, una serie de scripts y el código fuente de la aplicación. La imagen de construcción al igual que los scripts pueden ser reutilizados, al existir ya de base varias imágenes de construcción y scripts estándar en función de la naturaleza y tecnología de la aplicación.
En la imagen anterior se puede ver todos los elementos comentados en los que se apoya la herramienta S2I para generar una imagen de despliegue, además del flujo de ejecución que es llevado a cabo. Como se puede observar, inicialmente el código fuente es subido al repositorio de control de versiones, para que posteriormente sea compilado y empaquetado, generando como resultado un artefacto de despliegue. A partir de los script s2i y la imagen de construcción descargada del registry de imágenes será generada la imagen de despliegue resultante final, registrada en el registry de imágenes y levantado el contenedor sobre el nodo de OpenShift correspondiente.
Proceso de Construcción
Durante el proceso de construcción, S2I debe recoger el código fuente junto con los scripts y alojarlos dentro de la imagen de construcción. Para realizar esto, S2I crea un fichero tar que contendrá tanto el código fuente como los scripts y los incluirá dentro de la imagen de construcción. Será entonces, antes de ejecutar los scripts de assemble, cuando S2I descomprimirá el fichero tar alojando su contenido en la ubicación indicada sobre los flags de configuración de destino o la etiqueta io.openshift.s2i.destination indicada en la imagen de construcción.
La localización por defecto es el directorio /tmp
Algo que es necesario comentar es que la imagen de construcción debe disponer de la utilidad del sistema de compresión tar e interprete de línea de comandos para abordar la generación de la imagen de despliegue. En caso contrario S2I se verá obligado a crear un contenedor auxiliar donde incluir el código fuente y los scripts S2I y ejecutar el proceso para la generación de la imagen de despliegue:
S2I Script
Los scripts S2I pueden ser implementados en cualquier lenguaje de programación y serán ejecutados dentro de la imagen de construcción. Entre los scripts S2I podemos identificar:
- assemble (obligatorio): Construye el artefacto de la aplicación a partir del código fuente y lo aloja en el directorio apropiado dentro de la imagen. Ejemplo:
- run (obligatorio): Script encargado de ejecutar la aplicación. Ejemplo:
- save-artifacts (opcional): script que engloba todas las dependencias que pudieran acelerar el proceso de compilación del artefacto. Dichas dependencias son reunidas en un fichero tar y se transmiten en la salida estándar. Ejemplo:
- usage (opcional): script donde se indicara como hacer uso correcto de la imagen. Ejemplo:
- test/run (opcional): script a partir del cual se permite generar un proceso sencillo en el que se pueda verificar si la imagen esta funcionando correctamente.
Imagen de Construcción
Como se comentaba en puntos anteriores, S2I hace uso de una imagen de construcción (image builder), donde en fase de construcción serán insertados los scripts S2I junto con el código fuente de la aplicación para generar la imagen de despliegue resultante que levantará el contenedor final.
Para completar el proceso de construcción a partir de la builder image será necesario además contemplar dentro de la propia imagen la instalación de los paquetes de construcción necesarios en función de la naturaleza de la aplicación. Para el ejemplo concreto que nos atañe haremos uso de Maven y la distribución de la JDK para la ejecución de la aplicación y etiquetado de las características del contenedor. Alguna de estas características están enfocadas para su uso sobre la plataforma de OpenShift, como por ejemplo io.openshift.expose-services que expondrá el puerto sobre el que se publicará el servicio y usuario que será utilizado para explotar el servicio sobre el contenedor.
Ejemplo:
La implementación de la imagen de construcción será llevada a cabo en los ficheros para la generación de imágenes a medida propios de Docker, denominados Dockerfile.
Estructura de directorios fuentes S2I
La estructura de directorios que contendrán los scripts y ficheros S2I generados adhoc para explotar por ejemplo una aplicación Spring Boot será la siguiente:
- s2i/bin/ : Directorio que contendrá todos los scripts S2I que serán utilizados para la generación de la imagen de despliegue, es decir, assemble, run, save-artifacts
- Dockerfile: Fichero Docker, alojado en el directorio raíz del repositorio que contendrá la lógica de construcción para generar a partir de los scripts S2I y el código fuente la imagen de despliegue resultante final.
Creación de la Imagen de Despliegue
Para llevar a cabo la creación de una imagen de despliegue a partir de código fuente haciendo uso de la herramienta S2I, primeramente será necesario instalarla, pudiendo ser descargada desde aquí.
Dado que S2I se apoya en Docker como herramienta para la generación y gestión de contenedores, será necesario tener igualmente instalado Docker en la máquina sobre la que vayamos a generar la herramienta. La distribución binaria de Docker para su instalación puede ser descargada desde aquí.
Una vez instalado S2I, generaremos un directorio (por ejemplo s2i-springboot) que contendrá todos los script S2I y la imagen de construcción que será utilizada para generar la imagen de despliegue resultante final. Para ello lanzamos el comando create de S2I,
s2i create image_name destination_directory. A partir de dicha sentencia nos será generado en el directorio de salida indicado como parámetro, la estructura de directorios comentada en secciones anteriores junto con los script S2I y el fichero Dockerfile base.
Una vez generada la estructura de directorios con los scripts base y el fichero Dockerfile, será necesario registrar en el registry de Docker, la imagen de construcción en la que nos apoyaremos para generar nuestra imagen de despliegue final, donde para ello ejecutamos el comando:
docker build -t atsistemas/springboot-polaris .
Vemos como la imagen ha sido compilada correctamente y registrada en el registry de Docker con el nombre atsistemas/springboot-polaris:latest
Con la imagen de construcción registrada, haremos uso de S2I, y junto los scripts s2i y la imagen generaremos la imagen de despliegue resultante final con el código fuente de la aplicación Spring Boot a utilizar. Para este ejemplo utilizaremos el código fuente de una aplicación Spring Boot muy sencillita Polaris.
Finalmente y para llevar a cabo la creación de nuestra imagen de despliegue, ejecutaremos el siguiente comando: s2i build https://github.com/atSistemas/polaris atsistemas/springboot-polaris springboot-polaris-app donde la url es la localización del código fuente, atsistemas/springboot-polaris es el nombre de la imagen de construcción y springboot-polaris-app es el nombre de la imagen de despliegue.
Comentar que el código fuente no tiene por qué estar ubicado en un repositorio remoto. También sería posible apuntar al código fuente de un determinado proyecto ubicado en la máquina local donde tenemos instalado s2i, sustituyendo la url del repo por el path del filesystem donde se encuentra el código fuente.
Como resultado podemos ver cómo ha sido registrada en el registry de Docker la imagen de despliegue generada:
Por último, podemos lanzar la ejecución del contenedor a partir de la imagen de despliegue generada con el siguiente comando docker run -p 8080:8080 springboot-polaris-app
Una vez hayamos visto por consola que se ha levantado el contenedor, podremos acceder al servicio accediendo a la URL http://127.0.0.1:8080/
¡Ya habéis levantado vuestro contenedor creado desde s2i! ¡Enhorabuena!
Esto es todo amigos, nos vemos pronto con más cositas interesantes. Aquí os dejo la URL del repositorio de los script s2i.
¡Síguenos en Twitter para estar al día de próximos posts!