Kong “simplemente una buena opción”

Eduardo Rosales Fernandez
GDG Cloud Santiago
Published in
5 min readFeb 26, 2020

--

Recientemente implemente este API Gateway en un cliente, y puede acumular bastante experiencia de sus ventajas y también de sus dolencias, las cuales me gustaría compartir y así colaborar con conocimientos a otras personas que se decidan a usarlo.

Cuando pensamos en una solución a un problema planteando una arquitectura de microservicios, tendemos a complicarnos mucho con la autenticación, seguridad, la trazabilidad, supervisión, etc…, que son muy importantes, pero que ya existen soluciones muy potentes y que podemos reutilizar sin temor de tener que pagar por licenciamiento, y buen ejemplo de API Gateway es Kong.

Este será el primer artículo de varios que me gustaría escribir sobre este gateway.

En este primer artículo veremos un poco de su arquitectura y su instalación en un cluster kubernetes.

Arquitectura.

Cuando desplegamos Kong dentro un cluster podemos usar las capacidades de kubernetes para escalar, mantener la observabilidad sobre las cargas de trabajo y todas las ventajas que nos ofrece kubernetes.

Al ser un gateway community no posee una interfaz de administración como la que posee la versión Enterprise o los demás API Managements, pero tiene algunas cosas buenas que podemos aprovechar al máximo, como:

  • Configuración declarativa: Configure Kong de la misma manera que k8s, usando kubectl con una API declarativa.
  • Anotaciones Simplificadas: Las anotaciones minimalistas hacen que el código sea más reutilizable y composable.
  • Alta disponibilidad: Kong maneja la conmutación por error automáticamente, Reducción del tiempo de inactividad potencial.

Estas ventajas las implementaremos y veremos cómo funcionan en el próximo artículo.

Instalación.

A continuación explicare como hacer una instalación del gateway de Kong en un cluster k8s y una UI llamada Konga(community) para que podamos jugar un poco con la creación de las apis y sus configuraciones.

Todos lo yaml que usemos en este artículo estarán disponibles de forma pública en el repositorio.

Requisitos para la instalación y configuración:
1- Poseer skills trabajando con kubernetes, helm y línea de comandos.
2- Tener un cluster kubernetes configurado y operativo.
3- kubernetes-cli y Helm deben de estar instalados y con el contexto del cluster configurado.
4- Se debe tener dos bases datos(postgres) accesibles desde el cluster para guardar las configuraciones del gateway y de la interfaz de administración(konga) o en su defecto una base de datos con dos schemas.

Teniendo los requisitos claros, comenzaremos con la instalación, para ello tendremos un archivo llamado “values.yaml”, el cual tendrá toda la configuración necesaria para el despliegue del gateway y los services necesarios para la administración y el consumo de las apis.

Consideraciones sobre el archivo “values.yaml” :
— El “values.yaml” debe ser editado y adecuado a las necesidades de cada ambiente en el que se desea implementar.
— Si se instala con helm en su versión 3.x no es necesario habilitar el parámetro “installCRDs: false”.

Teniendo las herramientas y las configuraciones descritas hasta ahora listas, comenzaremos con la instalación del gateway.
Recordar siempre revisar los yaml antes de aplicarlos, y de ser necesario actualizar sus datos(namespace, value de los secrets, etc…)
Pasos:
1- Desplegar los secretos que contendrán las credenciales de la base de datos.

kubectl apply -f kong-secret.yaml

2- Agregar el repo de charts para helm.

helm repo add kong https://charts.konghq.com
helm repo update

Al agregar este repositorio estamos diciéndole a helm de donde instalará KongGateway.

3- Instalación de kong:
Antes de ejecutar el comando para que se configure kong en el cluster debemos revisar los parámetros del archivo “values.yaml” y ajustar sus valores a lo que necesitamos y al ambiente en que lo ejecutaremos (desarrollo, qa, producción).
Ejemplo de los parámetros que debemos ajustar:
— Datos de conexión de la base de datos.
— Versiones del ingress controller.
— Secretos.
— Puertos.
Luego de ver revisado nuestro value, ya podemos ejecutar su instalación:

helm install kong-deploy kong/kong — version 0.36.2 — namespace kong -f values.yaml

En el comando especificamos el nombre(kong-deploy), el chart(kong/kong), la versión que deseamos instalar (0.36.2), en qué espacio de nombre se instalará (kong) y la configuración general definida en el “values.yaml”.

output:
NAME: kong-deploy
LAST DEPLOYED: Thu Ene 22 14:40:32 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Kong Admin can be accessed inside the cluster using:
DNS=kong-deploy-kong-admin.default.svc.cluster.local
PORT=8444
To connect from outside the K8s cluster:
HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
PORT=$(kubectl get svc --namespace default kong-deploy-kong-admin -o jsonpath='{.spec.ports[0].nodePort}')
2. Kong Proxy can be accessed inside the cluster using:
DNS=kong-deploy-kong-proxy.default.svc.cluster.localPORT=443To connect from outside the K8s cluster:
HOST=$(kubectl get nodes --namespace default -o jsonpath='{.items[0].status.addresses[0].address}')
PORT=$(kubectl get svc --namespace default kong-deploy-kong-proxy -o jsonpath='{.spec.ports[0].nodePort}')

-> Debemos de guardar la salida de este comando ya que usaremos algunos datos de el para la configuración de la UI de administración(konga).

4- Desplegar la UI de administración para kong(konga):
Lo primero que debemos hacer para desplegar konga es crear el secreto con las credenciales de la base de datos que usará konga.

kubectl apply -f konga-secret.yaml

Luego debemos hacer aplicar el manifests para desplegar konga, tener en cuenta que se deben actualizar el namespace y los secretos en caso de usar otros datos.

kubectl apply -f admingateway-deployment.yaml

Una vez esté ejecutando correctamente, desplegamos el service asociado a este deployment. De igual forma que los demás yaml debemos revisar su configuración por si deseamos cambiar algún parámetro.

kubectl apply -f admingateway-svc.yaml

5- Exposición con Ingress

Una vez que los pods de kong y konga se estén ejecutando correctamente crearemos un ingress para exponer el servicio para el acceso a las apis y a la UI de administración. \
-> Debemos revisar primero el “ingress-kong.yaml” y colocar los valores deseados como:
- namespace
- host
- es recomendable configurar un certificado ssl

kubectl apply -f ingress-kong.yaml

6- UI de administración Konga

Usando el host definido en el ingress, lo colocamos en un navegar y completamos la configuración básica (nuevo usuario y contraseña) para la UI de administración y agregar nuestro kong para administrarlo:

Tener en cuenta que debemos cambiar “Kong Admin URL” por el valor de dns que nos dio la salida de la instalación con helm en el paso 3.

Una vez terminado los pasos ya estamos listos para empezar a crear apis y darles autenticación, acl, asignar políticas y poder seguir generando microservicios si necesidad de preocuparnos por problemáticas comunes y que ya Kong Gateway nos resuelve.

En el próximo artículo implementaremos las proxy’s, veremos como crear consumers, configurar diferentes formas de autenticación, y lo más importante es que no tendremos que hacer ni una sola línea de código, pues usaremos las ventajas que mencionamos al inicio del post.

Hasta la próxima, no se lo pierdan!!!

Link de documentación: \
[GitHub Repositorio Oficial](https://github.com/Kong/charts/tree/master/charts/kong) \
[Instalación Oficial Kong](https://docs.konghq.com/1.4.x/kong-for-kubernetes/install)

--

--