Despliega tu aplicación Grails/Spring en un cluster Kubernetes, made easy

Hace poco escríbi un post técnico donde contaba cómo puedes desarrollar, depurar y terminar desplegando una aplicación Grails, SpringBot, o cualquier otro tipo de framework similar en un cluster Kubernetes, con la particularidad de que en lugar de usar el típico entorno en local con minikube , usaba un servicio cloud de Okteto

Con el servicio que ofrece Okteto no necesitaremos tener instalado en nuestra máquina prácticamente nada salvo un pequeño programa (okteto cli) que será el que nos conecte con nuestro namespace remoto. Además de ofrecer un entorno de desarrollo puramente kubernetes, este servicio nos permitirá desplegar la aplicación en un cluster real del que no necesitaremos saber grandes detalles, haciéndolo ideal para dar los primeros pasos de iniciación a Kubernetes.

El post completo, con todos los pasos y explicaciones lo puedes encontrar en https://okteto.com/blog/develop-and-deploy-a-grails-application-in-okteto-cloud/ así que en este post simplemente escribiré algunas indicaciones y mis impresiones después de unos meses "jugando" con él.

Sí, como has adivinado, el post que les envíe fue revisado y corregido por la gente de Okteto hasta darle una calidad excepcional.

Okteto

La primera vez que oí de Okteto fue hace unos meses, en una charla en el Codemotion de Madrid, donde Micael Gallego y Pablo Chico, y me pareció una herramienta muy buena para empezar a dar esos primeros pasos en Kubernetes que había intentando dar con Google Cloud Heroku, o Digital Ocean, con la ventaja de que Okteto me ofrecía un cluster de prestaciones "majas" de forma gratuíta

Puedes verla completa en:

Idea

Supongamos que tienes una idea para una aplicación semi-sencilla y que tu entorno de programación es Grails o SpringBot si no llegas a ser lo suficientemente bueno para usar Grails ;)

Sabes cómo desarrollarla en local, tienes tu PostgreSQL corriendo en tu máquina e incluso has dockerizado la aplicación pero sabes que subirla a producción es otra cosa. Dónde desplegar, cómo depurar, etc se vuelve arduo y a veces hay que poner una cantidad de dinero (pequeña pero hay que dar la tarjeta de crédito)

Como ya he dicho antes, con este servicio lo que vas a poder tener es un cluster en la nube manejado por Okteto donde poder desarrollar e incluso depurar tu aplicación y liberar versiones en producción

Pasos

Los pasos a seguir para crear un entorno desarrollo serían, de forma resumida:

  • Tener una cuenta en Github

  • Crear una cuenta en Okteto (usa Github como autentificador, por eso la cuenta anterior)

  • Instalar en local el cliente okteto cli

  • hacer login con el comando okteto login el cual baja las credenciales para poder conectarse a nuestra cuenta

  • crear un directorio vacío, copiar el fichero okteto.ini y ejecutar okteto up para crear un entorno de desarrollo en el cluster

  • crear nuestra aplicación desde la shell que se crea. El servicio de Okteto lo que irá haciendo es sincronizar todos los ficheros remotos con nuestro local, de tal forma que cualquier cambio en un entorno se refleje en el otro

  • desarrollar nuestra aplicación con el añadido de que podemos acceder a ella vía localhost o vía Intenet

  • una vez tenemos una versión para desplegar podemos dockerizarla directamente con okteto build y aplicarla al cluster con kubectl apply

Es decir: crear un entorno de desarrollo en el cluster, desarrollar y depurar en él nuestra aplicación como siempre y desplegarla (en Okteto o en otro proveedor de kubernetes)

Problemas a.k.a Retos

Probablemente tu aplicación va a requerir cierta infraestructura como base de datos, un sistema de ficheros donde leer o escribir, etc y lamentablemente el post publicado en el blog de Okteto, al ser una guía de primeros pasos, NO cubre nada de esto.

Por suerte desplegar una base de datos PostgreSQL en Okteto es sencillo y se puede hacer vía web con un par de clicks o bien vía comando kubectl y con ayuda de Internet para ver ejemplos.

Actualmente NO se pueden crear volumenes persistentes vía web, aunque parece que está muy próxima una actualización que lo permitirá, así que la reserva de volúmenes hay que hacerlo via kubectl por lo que te tocará aprender cómo definir uno. Por ejemplo, aplicando este fichero tendrías un volumen my-volume que puedes adjuntar a un pod:

storage.yml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-volume
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

y aplicarlo con `kubectl apply -f storage.yml'

Así mismo para no tener claves, passwords o api keys metidas en el código, necesitarás crear ConfigMap y SecretMap , como por ejemplo:

secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
stringData:
  TELEGRAM_TOKEN: "783725094:AAAAAAAAAAAAAAAAAAAAAAAAAA"

y aplicarlo con `kubectl apply -f secret.yml'

Conclusión

El desarrollar directamente en un cluster te ofrece la oportunidad de ir avanzando la aplicación a la vez que vas definiendo la arquitectura (k8s) de la misma. Además el poder depurarla en este te permite afinar esas situaciones complicadas de definir mediante tests (lo cual no quiere decir que no tengas que seguir desarrollando test)

Así mismo, aunque no lo he podido probar, puede ser una buena forma de trabajar en un equipo.

Por último creo que es un entorno que te permite practicar de forma directa muchos conceptos de kubernetes para ir adquiriendo experiencia. Yo mismo, por ejemplo, tras este par de meses usándolo he comenzado un curso online de Kubernetes y prácticamente la mitad de los conceptos que se explican me he tenido que pelear con ellos.

2019 - 2020 | Mixed with Bootstrap | Baked with JBake v2.6.4