Apisix en Okteto
Tags: apisix, kubernetes, apigateway, okteto
Published: 2023-06-22 05:27:02

---
title: Apisix en Okteto
published: true
date: 2023-05-15 00:00:00 UTC
tags: apisix,kubernetes,apigateway,okteto
canonical_url: https://jorge.aguilera.soy/blog/2023/apisix-3.html
---

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

<dl>
<dt>INFO</dt>
<dd>
<p>Este post NO es la continuación de <a href="apisix-1.html">apisix-1.html</a> o <a href="apisix-2.html">apisix-2.html</a>
sino que esta vez vamos a usar un cluster que no estará en nuestro local.</p>
</dd>
<dt>INFO</dt>
<dd>
<p>El código de estos post los puedes encontrar en el repo <a href="https://github.com/jagedn/apisix-example">https://github.com/jagedn/apisix-example</a></p>
</dd>
</dl>

## 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](https://jorge.aguilera.soy/images/diag-b9f840ad8e7db980307124f7b2c7b1cc.png)

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](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](https://jorge.aguilera.soy/images/2023/okteto_apisix_1.png)

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](https://jorge.aguilera.soy/images/2023/okteto_apisix_2.png)

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)

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

 ![okteto apisix 3](https://jorge.aguilera.soy/images/2023/okteto_apisix_3.png)

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](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](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