Camel K – Plataforma ligera de integración en Kubernetes

two men standing near camels
Photo by Gregory Rogers on Pexels.com

Antes de comenzar con lo que es Camel K, comencemos por lo básico:

¿Qué es Apache Camel? Según la documentación, Apache Camel es un versátil framework de integración de código abierto. Permite a los desarrolladores definir reglas de enrutamiento y mediación (reglas de interpretación) en una variedad de lenguajes. Además de los lenguajes estándar Java o Spring XML, también existen lenguajes específicos de dominio (DSL) para las integraciones.

Entonces, ¿Qué es Camel K? Es una plataforma de integración ligera basada en Apache Camel. Permite que las integraciones se ejecuten de forma nativa en OpenShift o Kubernetes: las propias integraciones son objetos de Kubernetes, por lo que no es necesario crear un entorno de ejecución ni preocuparse por las dependencias de Maven, solo hay que instalar el operador y empezar a ejecutar las integraciones. Otros beneficios de usar Camel K en Kubernetes incluyen la capacidad de escalar sus integraciones usando la tecnología serverless Knative, actualizaciones de código en tiempo real y la capacidad de escalar fácilmente sus integraciones de acuerdo a sus necesidades.

Todo estas acciones son realizadas por el Operador de Kubernetes para Camel K que se ejecuta dentro del clúster permitiendo que el desarrollador tenga una mejor experiencia de uso, generando valor inmediato en las aplicaciones.

¿Qué obtengo al usar Camel K?

  1. Modo Desarrollo

Para ejecutar una aplicación camel spring boot o en otro DSL en Kubernetes, se requiere que un desarrollador construya las imágenes docker o s2i, genere los recursos de Kubernetes y luego aplique los recursos a un clúster en ejecución, lo que consume mucho tiempo. Camel K resuelve este problema en desarrollo con el modo dev. Simplemente utilizando la opción –dev mientras se ejecuta el código permite al desarrollador desplegar directamente en Kubernetes y también hacer cualquier cambio en el pod en ejecución cada vez que se actualiza el archivo de código fuente.

  1. Resolución de dependencias

Camel soporta múltiples DSL como Java o Groovy y Camel K también lo soporta. Lo que es nuevo en Camel K es que la característica de gestión automática de dependencias. El desarrollador no tiene que preocuparse de empaquetar un artefacto desplegable o las dependencias de Maven o Gradle de varios componentes. Resuelve automáticamente las dependencias necesarias de un archivo fuente durante el despliegue. Y además, sólo un archivo fuente es suficiente para ejecutar la integración en un pod.

  1. Administración del clúster

Existen muchas actividades de administración involucradas mientras se trabaja con Openshift o Kubernetes como la creación de Servicios, Rutas, ConfigMaps, etc.. Camel K reduce los esfuerzos de dichas actividades. Por ejemplo, si una ruta de camel tiene un comportamiento de un temporizador/quartz, Camel K detecta y crea un CronJob en OpenShift/Kubernetes. Esto ayuda a los desarrolladores a estar más orientados al negocio sin esperar a que los administradores creen dichos recursos.

  1. Ejecución con Quarkus

Camel K ofrece una opción para ejecutar la aplicación Camel usando Quarkus como runtime principal. De esta manera, la aplicación se beneficia de Quarkus en temas de un rápido tiempo de respuesta, el tiempo de arranque más rápido, y también en el tamaño del ejecutable final. Actualmente, soporta el modo JVM en su primera versión y en las siguientes versiones con soporte en modo nativo para Quarkus.

  1. Serverless

Camel K también proporciona una opción para desplegar una aplicación como serverless con Knative u OpenShift Serverless para que se escale automáticamente a cero o se escale para optimizaciones de carga o recursos. Despliega la aplicación como Knative Service y crea los recursos necesarios como route/ingress automáticamente.

Mi primer paseo en Camel K

Antes de comenzar, necesitarás un clúster de Kubernetes/Openshift (para este ejercicio utilice minikube), así como la herramienta kamel CLI instalada en tu máquina:

  1. Instalar Kamel CLI.

Descargue Kamel CLI del siguiente enlace y descomprima el archivo. Contiene un pequeño archivo binario llamado kamel que debes poner en la ruta de tu sistema. Por ejemplo, si usas Linux, puedes poner kamel en /usr/bin.

Verifique su instalación escribiendo en una terminal el comando kamel, debería de ver una salida similar a esta

$ kamel
Apache Camel K is a lightweight integration platform, born on Kubernetes, with serverless
superpowers.

Usage:
  kamel [command]
...
  1. Ejecutar minikube.
$ minikube start
$ minikube addons enable registry
  1. Crear un nuevo proyecto.
$ kubectl create ns camel-k
  1. Instalar Camel K en el namespace utilizando kamel CLI
$ kamel install -n camel-k

Valide que el operador de camel k se encuentre correctamente instalado.

$ kamel get pods -n camel-k
NAME                                READY   STATUS    RESTARTS   AGE
camel-k-operator-6998f57bc6-9pgb9   1/1     Running   0          25m

También el operador habrá generado un recurso IntegrationPlatform para el namespace (camel-k).

$ kubectl get integrationplatform -n camel-k
NAME      PHASE
camel-k   Ready
  1. Ahora crea la siguiente integración la cual utiliza los componentes de timer y log para imprimir un mensaje, en este caso el clásico «Hello World».
import org.apache.camel.builder.RouteBuilder;

public class helloworld extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("timer:java?period=1000&fixedRate=true").setHeader("example").constant("Java").setBody()
                .simple("Hello World! from Camel K using ${header.example}.").to("log:info");
    }
}
  1. Ahora ejecuta la integración utilizando el «modo desarrollo» con esto podemos ver los logs de ejecución directo en la terminal
$ kamel run helloworld.java --dev

Iniciará la construcción de la ruta de integración y antes de que te des cuenta ya estará ejecutando.

1] 2021-03-10 16:30:59,557 INFO  [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World! from Camel K using Java.]
[1] 2021-03-10 16:31:00,524 INFO  [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World! from Camel K using Java.]
[1] 2021-03-10 16:31:01,524 INFO  [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World! from Camel K using Java.]
....

Dentro de tu namespace (camel-k) se generará un nuevo contenedor con el nombre de la ruta y también puede revisar que integraciones se encuentran en ejecución.

$ kubectl get pods -n camel-k
NAME                                READY   STATUS              RESTARTS   AGE
camel-k-operator-6998f57bc6-9pgb9   1/1     Running             0          17h
helloworld-68c5d744b9-wkzr4         0/1     ContainerCreating   0          6s

$ kamel get -n camel-k
NAME		PHASE	KIT
helloworld	Running	kit-c14f7gaf49fnd22ulhj0
  1. Ahora haga un cambio en su integración, modificando el mensaje de salida en el log por «Hello World! using dev mode», y Camel K se encargar de reemplazar en automático la integración entregando la nueva versión.
[2] 2021-03-10 16:44:01,120 INFO  [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World! using dev mode]
[2] 2021-03-10 16:44:02,093 INFO  [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World! using dev mode]
...

Resumen

Camel K lleva a Apache Camel a otro nivel en el entorno de Kubernetes, mientras que hace uso de todas las bondades de Camel. Sin embargo, se trata de un framework completamente nuevo y en constante evolución cada día se añaden nuevas características como Kameletes, que hablaremos de ellos en otra publicación

Para más información visite developers.redhat.com y si quieres echar un vistazo más de cerca a Camel K visita la pagina del proyecto en su Github

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *