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
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
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"
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:
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
Top comments (0)