
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?
- 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.
- 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.
- 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.
- 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.
- 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:
- 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]
...
- Ejecutar minikube.
$ minikube start
$ minikube addons enable registry
- Crear un nuevo proyecto.
$ kubectl create ns camel-k
- 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
- 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");
}
}
- 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
- 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