Alexa y Kubernetes. Desarrollo y despliegue local con DevSpace (VI)
Uso de DevSpace para el desarrollo local de nuestra Alexa Skill en entornos Kubernetes
- Requisitos previos
- DevSpace
- Archivo de configuración
- Iniciar el desarrollo y el desarrollo
- Probando peticiones localmente
- Destrucción o parar el desarrollo
- Recursos
- Conclusión
Es un hecho que el proceso de desarrollo en un entorno de Kubernetes no es fácil. Hay muchas herramientas que nos ayudan en este proceso. Para este caso de uso, usaremos DevSpace. Una herramienta para desarrolladores que facilita el ciclo del desarrollo en entornos Kubernetes.
DevSpace
Requisitos previos
Aquí tienes las tecnologías utilizadas en este proyecto:
- Node.js v12.x
- Visual Studio Code
- Docker 19.x
- MongoDB Atlas Account
- Kubectl CLI
- Kind
- go >=1.11
- DevSpace CLI
DevSpace
DevSpace es una herramienta de desarrollo de código abierto y solo client-side para Kubernetes:
- Podemos crear, pruebar y depurar aplicaciones directamente dentro de Kubernetes
- Desarrollar con hot reloading: actualizar los contenedores en ejecución sin reconstruir imágenes o reiniciar contenedores
- Unificar los flujos de trabajo de implementación dentro de nuestro equipo y en todo el desarrollo, staging y producción
- Automatizar las tareas repetitivas para la creación y el despliegue de imágenes
Así es como funciona DevSpace:
Devspace workflow
Beneficios
Mencionando la documentación de DevSpace: DevSpace nos permite almacenar todos nuestros workflows en un archivo de configuración declarativo: devspace.yaml
- Codificar el workflow sobre la creación de imágenes, el despliegue de nuestro proyecto y nuestras dependencias, etc.
- Versionado de nuestros workflows junto con su código (es decir, podemos poner en marcha cualquier versión anterior con un solo comando)
- Compartir nuestros workflow con nuestros compañeros de equipo
DevSpace ayuda a nuestro equipo a estandarizar los workflow de despliegue y desarrollo sin que todos los miembros de nuestro equipo se conviertan en expertos en Kubernetes.
- El experto en DevOps y Kubernetes de nuestro equipo puede configurar DevSpace usando
devspace.yaml
y simplemente lo commitea a través de git - Si otros desarrolladores de nuestro equipo revisan el proyecto, solo necesitan ejecutar el despliegue de devspace para levantar el proyecto (incluida la creación de imágenes y el despligue de otros proyecto relacionados, etc.) y tener una instancia del proyecto en ejecución.
- La configuración de DevSpace es altamente dinámica, por lo que podemos configurar todo usando variables de configuración que hacen que sea mucho más fácil tener una configuración base pero aún se pudan permitir diferencias entre desarrolladores (por ejemplo, diferentes subdominios para pruebas)
En lugar de reconstruir imágenes y volver a desplegar contenedores, DevSpace te permite recargar contenedores en ejecución mientras estás codificando:
- Simplemente editamos nuestros archivos con nuestro IDE y veremos cómo se recarga nuestra aplicación dentro del contenedor en ejecución.
- La sincronización de archivos bidireccional de alto rendimiento detecta los cambios de código de inmediato y sincroniza los archivos de inmediato entre el entorno de desarrollo local y los contenedores que se ejecutan en Kubernetes.
- Stream logs, conectar debuggers o abrir una terminal en los contenedores directamente desde nuestro IDE con un solo comando.
El deslpiegue y depuración de servicios con Kubernetes requiere mucho conocimiento y nos obliga a ejecutar repetidamente comandos como kubectl get pod
y copiar los ids de pod de ida y vuelta. Ya no vamos a perder el tiempo más y DevSpace automatizará las tediosas partes del trabajo con Kubernetes:
- DevSpace nos permite crear varias imágenes en paralelo, etiquetarlas automáticamente y desplegar toda nuestra aplicación (incluidas las dependencias) con un solo comando
- DevSpace inicie automáticamente la transferencia de puertos y la transmisión de registros, para que no tengamos que copiar y pegar identificadores de pod o ejecutar 10 comandos constantemente para que todo comience.
DevSpace se ha probado con muchas distribuciones de Kubernetes, que incluyen:
- Clústeres locales de Kubernetes como minikube, k3s, MikroK8s, kind
- Clústeres de Kubernetes administrados en GKE (Google), EKS (AWS), AKS (Azure), DOKS (Digital Ocean)
- Clústeres de Kubernetes autogestionados (por ejemplo, creados con Rancher)
Lo más importante de DevSpace es que es independiente de la nube. Eso significa que depende de su contexto de Kubernetes.
Archivo de configuración
Una vez que se ha explicado DevSpace, echemos un vistazo a nuestro archivo de configuración de DevSpace: devspace.yaml
:
version: v1beta9
images:
app:
image: xavidop/alexa-skill-nodejs-express
dockerfile: ./docker/Dockerfile
preferSyncOverRebuild: true
entrypoint:
- npm
- run
- dev
deployments:
- name: alexa-skill
helm:
chart:
name: ./helm/alexa-skill-chart
values:
image:
tag: tag(xavidop/alexa-skill-nodejs-express)
dev:
open:
- url: http://localhost:3000
autoReload:
paths:
- ./app/package.json
- ./docker/Dockerfile
sync:
- imageName: app
disableDownload: true
localSubPath: ./app
excludePaths:
- ./node_modules
Echemos un vistazo a este archivo paso a paso: 1. images
: aquí vamos a especificar el nombre de la imagen que vamos a utilizar y donde se almacena el Dockerfile
. Una característica interesante de DevSpace es que puedes sobrescribir el entrypoint de nuestra imagen Docker para depuración. 2. deployments
: aquí podemos especificar toda el despliegue que queremos despelgar en nuestro clúster de Kubernetes. Aquí puede especificar Charts de Helm con sus valores, objetos de Kubernetes o Charts de componente de Helm. Estos últimos son charts hechos on-the-fly. 3. dev
: aquí especificaremos toda la configuración que necesitamos para desarrollar nuestras aplicaciones. En este ejemplo especificamos la recarga automática de la imagen de Docker cuando hay un cambio en los archivos package.json
y Dockerfile
. Luego especificamos la carpeta de sincronización que queremos mantener sincronizada entre nuestra máquina y el Clúster de Kubernetes.
Una de las características interesantes que tiene DevSpace es que si tenemos dependencias con otros repositorios GIT, podemos agregarlo al objeto dependencies
en el archivo de configuración YAML de esta manera:
dependencies:
- source:
git: https://github.com/my-api-server
branch: stable
- source:
git: https://github.com/my-auth-server
revision: c967392
profile: production
- source:
git: https://github.com/my-database-server
tag: v3.0.1
subPath: /configuration
Iniciar el desarrollo y el desarrollo
Tenemos el archivo de configuración debidamente condfigurado. Ahora tenemos que ejecutar los siguientes comandos para comenzar nuestro desarrollo con DevSpace:
devspace use namespace alexa-skill
devspace dev
Cuando DevSpace se está ejecutando y todo está desplegado y todos los archivos sincronizados, DevSpace crea una WebUI donde podemos explorar nuestro despliegue. La web está disponible en http://localhost:8090/
Por ejemplo, podemos ver los logs de nuestros pods: DevSpace Logs
O podemos ejecutar una terminal de shell dentro de nuestros pods directamente a través del sitio web:
DevSpace Console
Ahora podemos comenzar a desarrollar nuestra Skill de Alexa localmente y sincronizarnos automáticamente con nuestro Clúster de Kubernetes gracias a DevSpace
Probando peticiones localmente
Seguro que ya conoceis la famosa herramienta llamada Postman. Las API REST se han convertido en el nuevo estándar para proporcionar una interfaz pública y segura para nuestros servicios web. Aunque REST se ha vuelto omnipresente, no siempre es fácil de probar. Postman, hace que sea más fácil probar y administrar las API REST HTTP. Postman nos brinda múltiples funciones para importar, probar y compartir API, lo que nos ayudará a nosotros y a nuestro equipo a ser más productivos a largo plazo.
Después de ejecutar nuestra aplicación, tendremos un endpoint disponible en http://localhost:3008. Con Postman podemos emular cualquier solicitud de Alexa.
Por ejemplo, podemos probar una LaunchRequest
:
{
"version": "1.0",
"session": {
"new": true,
"sessionId": "amzn1.echo-api.session.[unique-value-here]",
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]"
},
"attributes": {}
},
"context": {
"AudioPlayer": {
"playerActivity": "IDLE"
},
"System": {
"application": {
"applicationId": "amzn1.ask.skill.[unique-value-here]"
},
"user": {
"userId": "amzn1.ask.account.[unique-value-here]"
},
"device": {
"supportedInterfaces": {
"AudioPlayer": {}
}
}
}
},
"request": {
"type": "LaunchRequest",
"requestId": "amzn1.echo-api.request.[unique-value-here]",
"timestamp": "2020-03-22T17:24:44Z",
"locale": "en-US"
}
}
Devspace Request
Destrucción o parar el desarrollo
Si queremos eliminar toda la pila creada por DevSpace, simplemente ejecutamos:
devspace purge -d alexa-skill
Eliminando el despliegue de Devspace
Recursos
- Official Alexa Skills Kit Node.js SDK - The Official Node.js SDK Documentation
- Official Alexa Skills Kit Documentation - Official Alexa Skills Kit Documentation
- Official Express Adapter Documentation - Express Adapter Documentation
- Official Kind Documentation - Kind Documentation
- Official Kubernetes Documentation - Kubernetes Documentation
- Devspace Documentation - Devspace Documentation
Conclusión
Como se puede ver, DevSpace facilita nuestro proceso de desarrollo en un clúster de Kubernetes. Con solo un archivo de configuración y 3 comandos tenemos todo configurados y podemos comenzar a desarrollar nuestra Alexa Skill.
Espero que este proyecto de ejemplo te sea de utilidad.
Puede encontrar el código aquí
¡Eso es todo amigos!
Happy coding!