Arquitectura de Microservicios con Kong API Gateway y Konga
En este nuevo artículo sobre Arquitectura de Microservicios con Kong Api Gateway y Konga nos vamos a centrar, en el funcionamiento y gestión de Kong haciendo uso de Konga como interfaz. Además mostraremos un ejemplo de funcionamiento con un servicio Mock securizado en Kong. Todos los pasos y herramientas necesarias serán mostradas en este tutorial.
¿Qué es un API Gateway?
Podríamos definir un API Gateway como una herramienta de gestión que actúa como un API entre el cliente y una serie de servicios que funcionan como backend.
Un API Gateway funciona con un proxy inverso que interceptará todas las llamadas que se le hagan, las redireccionará al servicio específicado y devolverá un resultado.
¿Por qué usar un API Gateway?
Cuando creas una arquitectura de microservicios, hay que tener en cuenta muchos factores, por ejemplo:
- Querrás proteger tu infraestructura, a través de autenticación o autorización.
- Poner tasas de acceso y limitar peticiones.
- Monetizar tus API’s.
- Sistemas de monitorización y analíticas
- Añadir más servicios a tu arquitectura etc….
Los puntos de arriba son solo alguno de los casos a tener en cuenta en nuestra arquitectura, y obviamente queremos intentar hacer lo más sencilla posible nuestra arquitectura teniendo en cuenta que lo arriba comentado tendrá muchos servicios de backend. Es en estos momentos cuando entra en juego un API Gateway como una manera de desacoplar la arquitectura de backend a nuestro cliente. Un API Gateway podrá «romper» estas llamadas en múltiples llamadas y respuestas, manteniendo una trazabilidad, control y gestión de todas las peticiones.
¿Qué es Kong?
Kong es un API Gateway open source escrito en Lua. Se ha creado sobre Nginx, y expone un API Rest que puede ser usada para gestionar nuestra infraestructura de una manera dinámica.
Kong nos va a permitir securizar nuestra Arquitectura, siendo la primera barrera, delegando así la securización en Kong en lugar de bajarlo a los microservicios; obtener logs y métricas, tener un punto único para nuestras APIs etc….
Uno de los puntos fuertes de Kong es la posibilidad de añadir nuevas funcionalidades gracias a la posibilidad de añadir plugins incluso si quieres podrás crear uno desde 0 programandolo en LUA.
Kong expone un API REST de manera que nos va a permitir gestionarlo, así como modificar servicios o añadir Plugins. Por lo que para poder realizar la administración de este API de una manera más sencilla podemos utilizar Konga, la cual nos proporciona una interfaz gráfica con la que podemos interactuar.
Ejemplo de Kong y Konga con un servicio Mock
Desplegar Kong y Konga con Docker
Vamos a mostrar como usar Kong y Konga con un servicio Mock, pero para ello el primer paso es levantar una instancia de cada uno. Para ello vamos a construir un docker-compose en el que tendremos una base de datos PostgreSql a la que kong se conectará y un servicio de Konga que interactuará con Kong.
version: '3' services: kong-db: image: postgres:11-alpine volumes: - db-data-kong-postgres:/var/lib/postgresql/data networks: - kong-net ports: - "15432:5432" environment: POSTGRES_DB: postgres POSTGRES_USER: kong POSTGRES_PASSWORD: kong kong-migration: image: kong depends_on: - kong-db container_name: kong-migration networks: - kong-net restart: on-failure environment: - KONG_DATABASE=postgres - KONG_PG_HOST=kong-db - KONG_PG_DATABASE=kong command: kong migrations bootstrap kong: image: kong container_name: kong environment: - LC_CTYPE=en_US.UTF-8 - LC_ALL=en_US.UTF-8 - KONG_DATABASE=postgres - KONG_PG_HOST=kong-db - KONG_PG_USER=kong - KONG_PG_PASSWORD=kong - KONG_CASSANDRA_CONTACT_POINTS=kong-db - KONG_PROXY_ACCESS_LOG=/dev/stdout - KONG_ADMIN_ACCESS_LOG=/dev/stdout - KONG_PROXY_ERROR_LOG=/dev/stderr - KONG_ADMIN_ERROR_LOG=/dev/stderr - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl restart: on-failure ports: - 8000:8000 - 8443:8443 - 8001:8001 - 8444:8444 links: - kong-db:kong-db networks: - kong-net depends_on: - kong-migration konga: image: pantsel/konga ports: - 1337:1337 links: - kong:kong container_name: konga networks: - kong-net environment: - NODE_ENV=production volumes: db-data-kong-postgres: networks: kong-net: external: false
El fichero anterior es un docker-compose, en el que añadimos los servicios que vamos a necesitar para levantar kong y konga:
- Kong-db: Una base de datos de tipo postgresql a la que kong se conectará para persistir la información.
- kong-migration: Servicio de migración e inicialización de kong en la base de datos.
- Kong: Inicialización del servicio de kong, en la base de datos específicada.
- Konga: Interfaz de kong que se conecta por el puerto 1337.
Configuración de Kong a través de Konga
Una vez tenemos todos los servicios anteriores funcionando tenemos que configurar la comunicación de konga con Kong para ello vamos a la url:
Y aparecerá una ventana en la que habrá que añadir un usuario admin.
Una vez nos hemos logado, tendremos que añadir la comunicación con kong, añadiendo http://kong:8001
Por lo que si ahora vamos a connection podremos ver que se encuentra conectado con Kong.
En el caso en el que no se encuentre activa la conexión habría que pulsar sobre activate.
Crear un Servicio y Rutas en Kong
A continuación vamos a crear un servicio y una ruta en kong haciendo uso de Mockbin, un servicio que genera endpoints HTTP y respuestas.
Para ello pulsamos sobre services y add new service:
En el servicio tenemos que rellenar el host o url y puerto, además si queremos tener un path cuando se invoque el servicio. Una vez hemos rellenado el servicio hay que añadir las rutas. En este punto definiremos los verbos y si tendremos algún path.
En nuestro caso y a modo de ejemplo vamos a añadir el path /mock de manera que para acceder a este servicio a través de kong se hará con la url http://localhost:8000/mock.
Una vez hemos terminado de definir la ruta ya podríamos acceder a través del endpoint http://localhost:8000/mock.
Hay que tener en cuenta que en la parte de rutas es en donde hemos creado los tipos de los verbos. GET, PUT, etc…
Securizando recursos en Kong
Como comentamos al principio, una de las funcionalidades de tener un API Gateway es la posibilidad de securizar nuestra infraestructura.
Kong através de sus plugins permite y facilita diferentes maneras para poder añadir seguridad a tu infraestructura, como por ejemplo añadir un plugin de OIDC y conectar kong con Keycloak. Pero para nuestro ejemplo vamos únicamente a añadir el plugin de authentication a nuestro servicio.Para ello vamos a nuestro servicio y en la pestaña de plugin pulsamos sobre add plugin.
Y añadimos el plugin de key auth con los valores por defecto. Si ahora hacemos la siguiente petición:
curl -i http://localhost:8000/mock
Obtendremos un 401.
Es normal obtener un Unauthorized, ya que no hemos configurado el API Key del plugin para nuestro servicio, por lo que vamos a configurarlo.
Por lo que lo siguiente que vamos a realizar es crear un consumer para obtener sus credenciales, para ello vamos a la sección de consumers y pulsamos en create consumer y añadimos un nombre.
Y después sobre credentials y create API KEY:
Si ahora ejecutamos la petición anterior ya debería funcionar:
curl -i -H "apikey:{{tu-api-key}}" http://localhost:8000/mock
Estas son algunas de las posibilidades que da Kong, puedes seguir investigando y mirando, por ejemplo con el plugin de OIDC, o añadiendo seguridad a grupos con el plugin ACL, para permitir que solo un grupo de consumidores ejecuten alguna operación etc…
Conclusión de Arquitectura de Microservicios con Kong API Gateway y Konga
En toda arquitectura de microservicios debería llevar como primer filtro un API Gateway. En esta entrada Arquitectura de Microservicios con Kong API Gateway y Konga, hemos podido ver las mejoras y funcionalidades de añadir un API Gateway.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!