¡Compártelo!

Fabric8: Gestión de imágenes y contenedores Docker desde Maven

En este post vamos a hablarte de una herramienta que puede resultarte de gran utilidad: Fabric8 Maven Plugin. Pero antes, vamos a presentarte la plataforma a la que pertenece: Fabric8.

Introducción

Fabric8 es una plataforma open source centrada en facilitar el desarrollo de aplicaciones y microservicios basados en el cloud. Para ello, ofrece un conjunto de herramientas centralizadas sobre una misma aplicación sandbox: frameworks avanzados, aplicaciones de integración continua y plugins propios, entre otros elementos. Uno de estos plugins es Fabric8 Maven Plugin.

F8-m-p está diseñado para administrar todo lo relacionado con Docker, Kubernetes y Openshift a través de Maven: crear imágenes Docker, desplegarlas en un contenedor local, crear descriptores de recursos para Kubernetes y OpenShift, o administrar y controlar los despliegues en Kubernetes.

Con esta carta de presentación, te recomendamos que te quedes con nosotros para meternos de lleno en las utilidades que nos ofrece. ¡Allá vamos!

Instalación y configuración de Fabric8 Maven Plugin

Al tratarse de un plugin de Maven, en primer lugar tenemos que definirlo como tal en el POM de nuestra aplicación.

<plugin>
       <groupId>io.fabric8</groupId>
       <artifactId>fabric8-maven-plugin</artifactId>
       <version>3.5.41</version>
</plugin>

La configuración de Fabric8 Maven Plugin podemos llevarla a cabo de varias formas:

1. Zero Config

Por defecto, se genera una imagen Docker según el tipo de proyecto que se detecte automáticamente (por ejemplo, un proyecto Spring Boot).

2. Configuración del plugin en XML:

Se trata de una configuración basada en XML definida en el POM de nuestra aplicación.

La definición de esta configuración se divide en distintas etiquetas:

  • <images>: es la principal forma de definir y configurar la creación de imágenes de Docker. Permite configurar cada imagen individualmente. Como, por ejemplo, su modo de creación, o construcción, con etiquetas como <build>.
  • <resources>: define las propiedades de los endpoints y los recursos que serán usados por Kubernetes u Openshift. En otras palabras: configuración y creación de los servicios y los despliegues.
  • <generator>: se trata de otra forma de generar imágenes a través de un componente Java, integrado en el plugin, que es el encargado de generar la imagen según el tipo de aplicación indicada. Por ejemplo: Spring Boot.
  • <enricher>: permite configurar los enrichers o enriquecedores, que son los encargados de definir los objetos de recursos de Kubernetes. Su funcionamiento interno es similar al de los <generator>.

Un ejemplo de configuración XML podría ser:

<plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>fabric8-maven-plugin</artifactId>
                <version>3.5.41</version>
                <configuration>
                    <resources>
                        <labels>
                            <all>
                                <property>
                                    <name>myapp</name>
                                    <value>${fabric8.namespace}</value>
                                </property>
                            </all>
                        </labels>
                    </resources>
                    <generator>
                        <includes>
                            <include>spring-boot</include>
                        </includes>
                        <config>
                            <spring-boot>
                                <registry>eu.gcr.io</registry>
                                <name>myapp:%v</name>
                            </spring-boot>
                        </config>
                    </generator>
                    <enricher>
                        <config>
                            <fmp-controller>
                                <pullPolicy>Always</pullPolicy>
                            </fmp-controller>
                        </config>
                    </enricher>
                </configuration>
            </plugin>

Dentro de las propiedades de la etiqueta <resources>, se encuentra la etiqueta  <value>${fabric8.namespace}</value>,  que toma el nombre del clúster en el cual se va a operar de manera automática.

En la etiqueta <generator> se encuentra las etiquetas para declarar que va a ser un proyecto Spring-Boot. En la etiqueta  <name>myapp:%v</name> se encuentra el valor %v, un valor que toma de manera automática la versión del proyecto.

Dentro de la configuración de <enricher> se halla <fmp-controller> que crea el controlador predeterminado si falta. En <pullPolicy> declaramos la forma en la que se va a extraer la imagen. En el caso del ejemplo se le otorga el valor Always, ya que la versión del proyecto es SNAPSHOT. En caso contrario, el valor se quedaría en blanco. En las nuevas versiones de Openshift/Kubernetes que esté en blanco implica que el valor sea IfNotPresent.

3. Configuración a través de DockerFile y archivos YAML:

Este método utiliza una configuración externa en formato YAML que ha de encontrarse en el directorio src/main/fabric8.
Se debe de crear un archivo deployment.yml, que será donde se realice la configuración para el despliegue en Kubernetes.

Ejemplo de archivo deployment.yml:

spec:
  replicas: 1
  template:
    spec:
      volumes:
        - name: config
          gitRepo:
            repository: 'git repository url'
            revision: 'commit id'
            directory: .
      containers:
        - volumeMounts:
            - name: config
              mountPath: /app/config
          env:
            - name: KUBERNETES_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
      serviceAccount: ribbon

¿Cómo utilizar Fabric8-maven-plugin?

Para crear una imagen Docker mediante fabric8-maven-plugin, debemos haber realizado previamente la configuración del plugin de alguna de las 3 maneras que hemos indicado en el apartado anterior.

Es recomendable, sobre todo si no se había realizado antes, realizar un mvn clean install antes de generar las imágenes deseadas.
Cuando hayamos configurado el plugin, utilizaremos el comando mvn fabric8:build para generar la nueva imagen. Una vez ejecutado este comando, y si el proyecto no tuviese ningún error, se generará una nueva imagen Docker en el directorio “/target/docker/…” del paquete principal del proyecto.

Pero eso no es todo. Además, Fabric8 nos ofrece el comando fabric8:watch. Lo emplearemos para que, cuando se realicen cambios en el código, la aplicación se vuelva a desplegar en Kubernetes actualizando dichos cambios.

En este caso, es necesario incluir las Devtools mediante la configuración del plugin en el pom.xml para tener acceso a esta utilidad:

<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<excludeDevtools>false</excludeDevtools>
			</configuration>
		</plugin>

Para ello, también es necesario añadir y configurar la propiedad spring.devtools.remote.secret al application.properties del proyecto.

Esto es así porque con las devtools es posible la ejecución de la aplicación de forma remota, por lo que es necesario configurar una contraseña secreta para la conexión en remoto: spring.devtools.remote.secret=mysecret.

Fabric8-maven-plugin vs. Docker-maven-plugin

Anteriormente, Fabric8 contaba con un único plugin para utilidades sobre Docker. Actualmente, aunque se puede definir y utilizarlo de forma individual, sus utilidades se encuentran integradas en el plugin fabric8, más extenso y actualizado.

Algunas de estas utilidades heredadas son las de despliegue, push hacia un repositorio externo o la creación automática de imágenes. La generación de imágenes ha sido renovada por el nuevo plugin, pero las características de despliegue o subida a repositorio se han mantenido iguales.

Una vez generadas las imágenes, podemos utilizarlas directamente a través de Docker. Aunque ahora, desde consola podemos subir la imagen a un repositorio público o privado de Docker utilizando el comando fabric8:push.

Por último, con el comandofabric8:deploy se construye la imagen Docker,  se generan los descriptores de recursos de Kubernetes y se despliega en el cluster. El comando deploy, está diseñado para ejecutarse después de fabric8:build y fabric8:resource.

Conclusión

Fabric8 ha conseguido crear un potente plugin que, ya sea de forma autónoma, o integrado en su plataforma, supone una gran herramienta para el manejo y la administración de imágenes y contenedores.

Por sí misma nos facilita las tareas de despliegue ya que, con una configuración mínima, permite al desarrollador crear y administrar imágenes Docker así como configurar contenedores para su ejecución y despliegue.

En Profile ya hemos empleado este plugin para integrar en los proyectos la configuración necesaria para el soporte en ciertas tareas de despliegue y administración de imágenes.

Esperamos que este breve tutorial te haya resultado útil y te ayude a adentrarte en el mundo de la orquestación y el despliegue.

Bibliografía

Artículos relacionados

No code

Qué es el No Code: Principales herramientas

La capacidad de crear soluciones tecnológicas sin la necesidad de escribir código se ha convertido en una tendencia cada vez más relevante. Esto se debe en gran parte al surgimiento de herramientas No Code, que permiten a personas con diversos niveles de habilidad técnica dar

Object Pooling

Patrones de diseño en los videojuegos: Object Pooling

El uso de patrones de diseño, como el Object Pooling, es una práctica muy recomendable cuando se quieren realizar desarrollos de software escalables, robustos y que tengan un buen rendimiento. Además, nos puede ayudar a mantener una estructuración de todo el código fuente para ayudar

jdk 21

Jdk 21: mejoras en la última versión LTS de Java

Cada 6 meses Java lanza una nueva versión de nuestro lenguaje favorito. Da igual si la estábamos esperando con ganas o si nos pilla por sorpresa, es algo que celebrar dentro de la comunidad. Esta vez la versión 21 incluye diferentes características estables, otras en