La tecnología FaaS (Function-as-a-Service) ha revolucionado la forma en que se desarrollan y despliegan las aplicaciones en la nube, eliminando la necesidad de gestionar la infraestructura subyacente. FaaS se centra en la ejecución de funciones individuales en respuesta a eventos específicos, lo que brinda flexibilidad y eficiencia en el desarrollo de aplicaciones. En este artículo, explicaremos qué es FaaS e implementaremos un caso de uso de ejemplo usando dos plataformas populares: OpenFaaS y Knative.
¿Qué es FaaS?
FaaS, o Funciones como Servicio, es un modelo de computación sin servidor que permite a los desarrolladores escribir y desplegar funciones individuales que se ejecutan en respuesta a eventos específicos. En lugar de preocuparse por la infraestructura subyacente, los desarrolladores se centran en escribir código para funciones individuales, lo que permite una arquitectura más modular y escalable.
Introducción a OpenFaaS:
OpenFaaS es una plataforma de código abierto que simplifica el desarrollo y despliegue de FaaS. Proporciona una capa adicional sobre tecnologías como Docker y Kubernetes(también puede ser implementada en otras plataformas), permitiendo a los desarrolladores empaquetar sus funciones en contenedores y desplegarlas en cualquier entorno. OpenFaaS ofrece una interfaz intuitiva para administrar y desplegar funciones.
Introducción a Knative:
Knative es una plataforma de código abierto basada en Kubernetes que permite ejecutar y gestionar cargas de trabajo sin servidor. Proporciona componentes esenciales para el desarrollo y despliegue de FaaS, como la escala automática, la gestión de eventos y el enrutamiento basado en HTTP.
Ahora vamos a ver como implementar un único caso de uso con estas dos herramientas
Caso de uso:
Caso de uso en el cual FaaS nos sería de gran utilidad:
Supongamos que tienes una aplicación web que permite a los usuarios subir imágenes y, cuando una imagen se carga, deseas que se realice automáticamente una compresión de la imagen para reducir su tamaño antes de almacenarla.
Implementación en OpenFaaS:
Vamos a ver como implementar este caso de uso utilizando OpenFaaS con NodeJs.
1- Asegúrate de tener Docker instalado en tu sistema. Puedes descargar Docker desde https://www.docker.com/get-started/
2- Instala la CLI de OpenFaaS (faas-cli) siguiendo las instrucciones para tu sistema operativo en https://docs.openfaas.com/cli/install/
3- Una vez que tengas Docker y la CLI de OpenFaaS instalados, inicializa un clúster de Kubernetes local (puedes usar minikube).
4- Asegúrate de tener el cliente de OpenFaaS (faas-cli) instalado en tu sistema. Puedes seguir las instrucciones de instalación aquí: Installation – OpenFaaS
5- creamos la función con el siguiente comando:
Este comando no solo crea el archivo que contendrá nuestro código sino que además crea los archivos y estructura de carpetas necesarios para el despliegue y ejecución. Dentro de esta estructura nos encontramos el archivo “handler.js», el cual contendrá el código de nuestra función.
6- Agregamos el código a nuestra función.
7- Ahora ejecutamos el siguiente comando para construir y ejecutar nuestra función
8- Revisamos la configuración de OpenFaaS:
Cuando generamos un proyecto en OpenFaaS se nos genera un archivo “.yml” que contiene la configuración de las funciones. Por ejemplo:
9- Para probar nuestra función podemos ejecutar el siguiente curl:
Implementación en Knative:
1- Configuración del entorno
Asegúrate de tener un clúster de Kubernetes instalado y configurado correctamente para utilizar Knative. Puedes seguir la documentación oficial de Knative para hacerlo: https://knative.dev/docs/getting-started/
2- Crear el archivo de la función
Crea un archivo llamado «comprimir-imagen.js» que contendrá el código de la función. Puedes utilizar el siguiente código para comprimir imágenes utilizando «sharp»:
3- Crear el archivo de despliegue (Knative Service YAML)
Crea un archivo llamado «comprimir-imagen-svc.yaml» que contendrá la configuración para el despliegue de la función en Knative. Aquí hay un ejemplo de cómo podría ser el archivo archivo
Asegúrate de reemplazar «<TU_USUARIO_DOCKERHUB>» por tu nombre de usuario de Docker Hub u otro registro de contenedores que estés utilizando.
4- Empaquetar y desplegar la función
Para empaquetar y desplegar la función en Knative, sigue estos pasos:
Asegúrate de tener el cliente de Kubernetes (kubectl) instalado y configurado para apuntar a tu clúster de Kubernetes.
Crea un contenedor de Docker con tu función. Utiliza el siguiente comando para compilar la imagen y subirla a tu registro de contenedores:
5- Despliega la función en Knative utilizando el siguiente comando:
6- Acceder a la función utilizando el dominio de Knative.
Knative proporciona automáticamente un dominio para acceder a las funciones desplegadas. Para obtener el dominio, ejecuta el siguiente comando:
Busca el nombre de tu servicio (por ejemplo, «comprimir-imagen») en la lista y copia el valor de «URL».
Una vez que tengas el dominio de tu función, puedes invocar utilizando herramientas como «curl» o Postman. Supongamos que el dominio es «comprimir-imagen.default.example.com». Se puede invocar la función de la siguiente manera:
De esta forma podemos implementar 2 funciones FaaS que nos resuelven una necesidad en concreto.
Algunos puntos a diferenciar entre OpenFaaS y Knative:
- OpenFaaS es más flexible en cuanto a la infraestructura subyacente y puede ser desplegado en diferentes entornos (Kubernete, OpenShift, K3s, o sin cluster), mientras que Knative se enfoca en entornos Kubernetes.
- OpenFaaS tiene una curva de aprendizaje más suave y una interfaz fácil de usar, lo que la hace ideal para principiantes, mientras que Knative ofrece un mayor nivel de control y escalabilidad, pero puede requerir un mayor conocimiento a nivel infraestructura, esto no lo hace ideal para usuarios finales.
- OpenFaaS tiene una colección de plantillas predefinidas para facilitar el desarrollo, mientras que Knative posee una gran comunidad de desarrollo con muchos ejemplos.
- OpenFaaS proporciona una interfaz de línea de comandos y una interfaz web intuitiva para administrar y desplegar funciones, mientras que Knative ofrece una API más avanzada y un control más granular sobre el enrutamiento y la escala de las aplicaciones.
- Algunas funciones básicas como el auto escaldado son pagas en OpenFaaS, mientras que en Knative no, esas características y otras, ya vienen incluidas por defecto.
Conclusión
Después de investigar e implementar algunos casos de uso, llegamos a las siguientes conclusiones:
OpenFaaS se destaca por su facilidad de uso y su enfoque en la simplicidad. Su CLI simplifica la creación, implementación y administración de funciones. Algunas características avanzadas como el autoescalado son pagas, pero dependiendo de las necesidades OpenFaaS sigue siendo una opción viable.
Por otro lado, Knative es una plataforma más completa que OpenFaaS, y su configuración inicial puede ser un poco más compleja. Requiere un clúster de Kubernetes con soporte para Knative, lo que implica más pasos para la instalación y configuración inicial. Sin embargo, una vez configurado, Knative ofrece una experiencia más completa y flexible para desplegar y escalar funciones. Por ejemplo, al instalar Knative, ya podemos configurar el autoescalado, sin necesidad de comprar ninguna licencia, además de que podemos manejar versiones de funciones y hacer desarrollos orientados a eventos, algo que en OpenFaaS es pago.
Estas dos herramientas nos permiten implementar funciones sin servidor en clusters Kubernetes o localmente. Ambas tienen sus propias características y enfoques, lo que las hace adecuadas para diferentes casos de uso y preferencias. El desafío está en saber cual elegir en función de las necesidades y conocimientos que tengamos.