Apisix en Okteto

En este post sobre APISIX vamos a desplegarlo en nuestro namespace de Okteto

INFO

Este post NO es la continuación de apisix-1.html o apisix-2.html sino que esta vez vamos a usar un cluster que no estará en nuestro local.

INFO

El código de estos post los puedes encontrar en el repo https://github.com/jagedn/apisix-example

Recapitulando

En posts anteriores vimos cómo instalar un cluster en nuestro local con k3d y cómo desplegar en este cluster APISIX. Así mismo creamos un servicio whoami y unas rutas para acceder a él a través de nuestro apigateway APISIX

Apigateway

En este post vamos a hacer lo mismo pero en lugar de usar un cluster en nuestro local, usaremos nuestro namespace en Okteto por lo que nuestra aplicación estará accesible en Internet.

La idea es desplegar en nuestro namespace dos servicios (custom-service y product-service) pero queremos que no se puedan acceder a ellos de forma directa, sino a través de nuestro ApiGateway que será donde tendremos las configuraciones de rutas, autentificaciones, etc que nos ofrece Apisix.

Arquitectura

Así pues nuestra arquitectura actual es algo parecido a

Diagram

Obviamente este es un ejemplo simple con dos servicios donde vamos a usar la imagen de Docker whoami, pero en un caso real los servicios serían aplicaciones dialogando con bases de datos e incluso entre ellas, todo de forma interna.

Okteto

Ya he publicado algunos post sobre Okteto y cómo crearnos una cuenta, obtener las credenciales y tal, así que desde aquí asumo que tienes tu namespace preparado y configurado. En mi caso va a ser example-pvidasoftware

Product y Customer Service

Para desplegar los dos servicios vamos a usar una funcionalidad de Okteto que nos permite desplegar mediante un docker-compose.yml (recuerda tienes todo el codigo en el repositorio https://github.com/jagedn/apisix-example)

El docker-compose es similar en ambos casos y es tan simple como:

version: "3"

services:
  customer-service:
    image: containous/whoami

Nos situamos en la carpeta product-service y ejecutamos

$ okteto deploy

y lo mismo desde la carpeta customer-service

Si vemos la consola de Okteto veremos que hemos desplegado dos stacks

okteto apisix 1

Al no especificar ningun puerto ni endpoints, ninguno de los servicios está accesible desde fuera del cluster (a no ser que hagas un port-forward a tu maquina claro)

Desplegando Apisix en Okteto

Si recuerdas, en los post anteriores instalamos Apisix usando el Helm chart oficial. El "problema" con Okteto es que no contamos con todos los permisos para hacer el mismo despliegue así que mi primera opción fue desplegarlo usando un docker-compose y especificando las imágenes oficiales más la configuración de ejemplo.

Sin embargo después de investigar un poco he visto que existe una forma más sencilla usando el Helm y simplemente hay que "tunearlo" un poco (El fichero de configuración completo está en el repositorio. Sólo busca las líneas marcadas con "JORGE" y reemplaza a tu gusto)

En primer lugar añadiremos a nuestra configuración la URL del repositorio oficial "https://charts.apiseven.com"

okteto apisix 2

volvemos a nuestro namespace y pinchamos en "Launch Dev Environment" seleccionando un helm char y buscando Apisix en la lista.

Okteto nos permite personalizar la configuración mediante un campo de entrada donde podremos borrar toda la configuracion por defecto y poner la nuestra (o buscar los campos directamente y modificarlos)

Básicamente los campos que he modificado son:

  • etcd.persistentce.size a 1Gb. Por defecto son 8Gb y al crear 3 volumenes me deja sin espacio

  • ingress.hosts.host. Tienes que cambiarlo según tu namespace. Yo por ejemplo he tenido que poner "example-pvidasoftware.cloud.okteto.net"

  • dashboard.true. Este es solo para tener la consola habilitada y poder crear rutas de forma sencilla, pero puedes deshabilitarlo con lo que te ahorras recursos (pero te tocará crear las rutas mediante curl y json)

    1. y ejecutamos …​ y esperamos unos 3-4 minutos

Si todo va bien deberías tener algo parecido a:

okteto apisix 3

Como ves he subrayado la url pública y único punto de entrada a nuestra aplicación.

Creando rutas

Como he comentado he habilitado el dashboard de apisix, pero al no publicar el puerto no se puede acceder a él desde fuera así que usando kubectl haremos un port-forward para poder acceder como si se estuviera ejecutando en nuestra máquina.

Accedemos a la consola en http://localhost:9000 con el usuario admin/admin (obviamente tú habrás puesto otros porque eres una persona más cuidadosa que yo) y creamos

  • upstream customer-service

  • upstream product-service

  • route /customer/* al upstream customer-service

  • route /product/* al upstream product-service

Probando

Si accedemos a https://apisix-gateway-example-pvidasoftware.cloud.okteto.net/customer/1 veremos que nos devuelve algo como

Hostname: customer-service-6fdbbdc48-nts96
GET /customer/1 HTTP/1.1
Host: apisix-gateway-example-pvidasoftware.cloud.okteto.net
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
X-Forwarded-Host: apisix-gateway-example-pvidasoftware.cloud.okteto.net
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Scheme: https
X-Request-Id: 861e9d2c73dba0fa01e8f9ea677129f3
X-Scheme: https

y lo mismo con la ruta de product

Conclusión

Una vez que tenemos Apisix corriendo en nuestro cluster podemos desplegar en él los microservicios sabiendo que están "por detrás" de nuestro ApiGateway, con toda la potencia y facilidad que ofrece

Follow comments at Telegram group Or subscribe to the Channel Telegram channel

2019 - 2024 | Mixed with Bootstrap | Baked with JBake v2.6.7