diff --git a/projects/05-container-service-deployment/README.MD b/projects/05-container-service-deployment/README.MD
new file mode 100644
index 000000000..caa4544b5
--- /dev/null
+++ b/projects/05-container-service-deployment/README.MD
@@ -0,0 +1,204 @@
+# API Deployment on Container Service
+
+## Índice
+
+- [1. Consideraciones generales](#1-consideraciones-generales)
+- [2. Preámbulo](#2-preámbulo)
+- [3. Resumen del proyecto](#3-resumen-del-proyecto)
+- [4. Paso a paso general para el despliegue en Amazon ECS o Azure Container Apps](#4-Paso-a-paso-general-para-el-despliegue-en-Amazon-ECS-o-Azure-Container-Apps)
+- [5. Paso a paso detallado para el despliegue en Amazon ECS](#5-Paso-a-paso-detallado-para-el-despliegue-en-Amazon-ECS)
+- [6. Paso a paso detallado para el despliegue en Azure Container Apps](#6-Paso-a-paso-detallado-para-el-despliegue-en-Azure-Container-Apps)
+- [7. Consideraciones para pedir tu Project Feedback](#7-Consideraciones-para-pedir-tu-Project-Feedback)
+- [8. Objetivos de aprendizaje](#8-Objetivos-de-aprendizaje)
+
+---
+
+## 1. Consideraciones generales
+
+- Para poder implementar este proyecto debes implementar primer
+el [API Deployment on Docker File](../05-dockerfile-deployment/README.MD).
+- Este proyecto lo resolvemos de manera --individual--.
+- El rango de tiempo estimado para completar el proyecto es de 1 a 2 Sprints.
+
+## 2. Preámbulo
+
+
+
+
+Contenedores +
+ +_Photo by_ +[Frank Mckenna](https://unsplash.com/@frankiefoto?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash) + +AWS ECS (Elastic Container Service) y Azure Container Apps son servicios +diseñados para simplificar el despliegue y la gestión de aplicaciones basadas +en contenedores, permitiendo a las desarrolladoras centrarse en el código en +lugar de la infraestructura. Ambos proporcionan escalabilidad automática, +gestionando la capacidad de los recursos según la demanda de la aplicación. +Además, tanto ECS como Azure Container Apps se integran de manera eficiente +con otros servicios en sus respectivos ecosistemas de nube, facilitando +una experiencia cohesiva y flexible para construir y desplegar aplicaciones +en la nube. Sin embargo, mientras que ECS se basa en la infraestructura de +clústeres, Azure Container Apps ofrece una experiencia sin servidor, +simplificando aún más la gestión. + +La currícula de Laboratoria incluye 4 proyectos enfocados en +desplegar la [Fleet Management API](../05-fleet-management-api/README.md) +que desarrollaste en la nube. Cada proyecto se distingue por utilizar +diferentes métodos de despliegue, lo que te permitirá aprender y aplicar +diversas estrategias para desplegar tu aplicación en producción en un entorno real. + +## 3. Resumen del proyecto + +En este proyecto desplegarás la aplicación usando +**Amazon Elastic Container Service (ECS)** o +**Azure Container Apps**. + +Para este proyecto necesitarás la imagen Docker que construiste +en el proyecto [API Deployment on Docker File](../05-dockerfile-deployment/README.MD). +Si aún no la tienes, por favor implementa primero este proyecto. + +## 4. Paso a paso general para el despliegue en Amazon ECS o Azure Container Apps + +Amazon ECS y Azure Container Apps son servicios muy similares. En ambos +podemos seguir el siguiente paso a paso general para +desplegar la Fleet Management API independientemente del lenguaje de +programación en que esta implementada + +- Paso 1: Subir la imagen docker a un Registro de Contenedores +(Azure Container Registry o Amazon ECR) +- Paso 2: Desplegar la aplicación en el caso de Azure creando una Container App y en el caso +de Amazon ECS creando un cluster EC2, definiendo una tarea ECS y un servicio ECS. +- Paso 3: Configurar el acceso externo para acceder a tu API utilizando la URL pública proporcionada por Azure o AWS. +- Paso 4: Monitorizar y gestionar la aplicación + +## 5. Paso a paso detallado para el despliegue en Amazon ECS + +### 1. Sube la imagen Docker a Amazon ECR (Elastic Container Registry) + +Amazon ECR es un servicio en la nube que te permite almacenar tus imágenes +Docker de forma segura y eficiente. Amazon ECR actúa como un +"repositorio" para imágenes Docker, similar a cómo GitHub actúa como un +repositorio para código fuente. ECR se integra fácilmente con otros servicios de +AWS, como Amazon ECS (Elastic Container Service). Esto simplifica el despliegue de +tus aplicaciones en contenedores dentro del entorno de AWS. + +En este proyecto almacenaremos en Amazon ECR la imagen docker que hemos +definido para empaquetar nuesta aplicación. Tómate un tiempo +para familiarizarte con ECR. Puedes seguir el +[tutorial oficial de ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Cómo creas un repositorio en Amazon ECR? +- [ ] ¿Cómo te autenticas en Amazon ECR desde tu máquina local? +- [ ] ¿Cómo subes una imagen Docker a Amazon ECR? +- [ ] ¿Cómo gestionas las imágenes en Amazon ECR? +- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Amazon ECR? + +Finalmente, sube la imagen Docker que constuiste para empaquetar tu +aplicación en un repositorio de Amazon ECR. + +### 2. Crear un clúster tipo EC2, una tarea y servicio en ECS + +El siguiente paso es entonces desplegar la imagen docker +en cluster de instancias EC2 usando Amazon ECS (Elastic Container Service). + +Tómate un tiempo para familiarizarte con ECS. Puedes seguir el +[workshop oficial de ECS](https://ecsworkshop.com/introduction/) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Cómo se crea un clúster en Amazon ECS? +- [ ] ¿Qué es una tarea en ECS y cómo se configura? +- [ ] ¿Qué es un servicio en ECS y cómo garantiza que las tareas se mantengan en funcionamiento? +- [ ] ¿Cómo se despliega un servicio en ECS? +- [ ] ¿Qué es el autoescalado en ECS y cómo se configura? +- [ ] ¿Cómo se integra ECS con otros servicios de AWS como ECR? +- [ ] ¿Cómo se realiza un despliegue de una nueva versión de una aplicación utilizando ECS? +- [ ] ¿Cómo solucionas problemas si tu aplicación en Amazon ECS no se está ejecutando correctamente? + +Finalmente, usa ECS para desplegar la imagen docker de tu aplicacion +creando un clúster, una tarea y un servicio. + +### 3. Monitorizar y gestionar la aplicación + +Usa la la IP pública de tu clúster EC2 para probar tu API con una +coleccion de Postman. Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +## 6. Paso a paso detallado para el despliegue en Azure Container Apps + +### 1. Sube la imagen Docker a Azure Container Registry + +Azure Container Registry (ACR) es un servicio en la nube que +te permite almacenar tus imágenes Docker de forma segura y +eficiente. ACR actúa como un "repositorio" para imágenes Docker, +similar a cómo GitHub actúa como un repositorio para código fuente. +ECR se integra fácilmente con otros servicios de Azure, como Azure Container Apps. +Esto simplifica el despliegue de tus aplicaciones en contenedores dentro +del entorno de Azure. + +En este proyecto almacenaremos en ACR la imagen docker que hemos +definido para empaquetar nuesta aplicación. Tómate un tiempo +para familiarizarte con ACR. Puedes seguir el +[tutorial oficial de ACR](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Cómo creas un nuevo registro en Azure Container Registry? +- [ ] ¿Cómo te autenticas en Azure Container Registry desde tu máquina local? +- [ ] ¿Cómo subes una imagen Docker a Azure Container Registry? +- [ ] ¿Cómo gestionas las imágenes en Azure Container Registry? +- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Azure Container Registry? + +Finalmente, sube la imagen Docker que constuiste para empaquetar tu +aplicación en un registro de Azure Container Registry. + +### 2. Crear una container App en Azure Container Registry + +El siguiente paso es entonces desplegar la imagen docker +en una Container App usando Azure Container Apps. + +Tómate un tiempo para familiarizarte con Azure Container Apps. Puedes seguir el +[workshop oficial de Azure Container Apps](https://learn.microsoft.com/en-us/training/modules/deploy-manage-container-app-using-azure-container-apps/) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +Para confirmar que una desarrolladora domina **Azure Container Apps**, puedes hacer las siguientes preguntas: + +- [ ] ¿Cómo se crea una nueva aplicación en Azure Container Apps desde el portal de Azure? +- [ ] ¿Qué requisitos previos debes cumplir antes de desplegar una aplicación en Azure Container Apps? +- [ ] ¿Cómo configuras el contenedor en una aplicación de Azure Container Apps? +- [ ] ¿Cómo actualizas una aplicación desplegada en Azure Container Apps con una nueva versión de la imagen del contenedor? +- [ ] ¿Cómo configuras el acceso y la seguridad para tu aplicación en Azure Container Apps?** +- [ ] ¿Cómo solucionas problemas si tu aplicación en Azure Container Apps no se está ejecutando correctamente? + +Finalmente, usa ECS para desplegar la imagen docker de tu aplicacion +creando un clúster, una tarea y un servicio. + +### 3. Monitorizar y gestionar la aplicación + +Usa la la IP pública de tu Azure Container App para probar tu API con una +coleccion de Postman. Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +## 7. Consideraciones para pedir tu Project Feedback + +Antes de agendar tu Project Feedback con tu coach, asegúrate de +tener una coleccion de Postman para probar la API que +desplegaste en Amazon ECS o Azure Container Apps. + +## 8. Objetivos de aprendizaje + +> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir +> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml), +> al crear el repo del proyecto para un cohort en particular usando +> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches). +> +> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml) +> que contempla nuestra currícula. diff --git a/projects/05-dockerfile-deployment/README.MD b/projects/05-dockerfile-deployment/README.MD new file mode 100644 index 000000000..4448a613d --- /dev/null +++ b/projects/05-dockerfile-deployment/README.MD @@ -0,0 +1,159 @@ +# API Deployment on Docker File + +## Índice + +- [1. Consideraciones generales](#1-consideraciones-generales) +- [2. Preámbulo](#2-preámbulo) +- [3. Resumen del proyecto](#3-resumen-del-proyecto) +- [4. Implementaciones de ejemplo](#4-Implementaciones-de-ejemplo) +- [5. Paso a paso para empaquetar tu aplicación en un contenedor de Docker](#5-Paso-a-paso-para-empaquetar-tu-aplicación-en-un-contenedor-de-Docker) +- [6. Consideraciones para pedir tu Project Feedback](#6-Consideraciones-para-pedir-tu-Project-Feedback) +- [7. Objetivos de aprendizaje](#7-Objetivos-de-aprendizaje) + +--- + +## 1. Consideraciones generales + +- Este proyecto lo resolvemos de manera --individual--. +- El rango de tiempo estimado para completar el proyecto es de 1 a 2 Sprints. + +## 2. Preámbulo + ++Logo de Docker +
+ +Docker permite empaquetar una aplicación junto con todas sus dependencias +(como bibliotecas, configuraciones y archivos necesarios) en una unidad +estándar conocida como contenedor. Esto asegura que la aplicación funcione +de manera consistente sin importar dónde se ejecute, ya sea en una máquina local, +en la nube o en un servidor de producción. A diferencia de las máquinas virtuales, +los contenedores no necesitan un sistema operativo completo, sino que comparten +el núcleo del sistema operativo del host, lo que los hace más eficientes en términos +de recursos y más rápidos de iniciar. + +La currícula de Laboratoria incluye 4 proyectos enfocados en +desplegar la [Fleet Management API](../05-fleet-management-api/README.md) +que desarrollaste en la nube. Cada proyecto se distingue por utilizar +diferentes métodos de despliegue, lo que te permitirá aprender y aplicar +diversas estrategias para desplegar tu aplicación en producción en un entorno real. + +## 3. Resumen del proyecto + +En este proyecto empaquetarás la [Fleet Management API](../05-fleet-management-api/README.md) +en un **contenedor de Docker** a través de un Dockerfile. + +## 4. Implementaciones de ejemplo + +En caso que no hayas implementado aún la +[Fleet Management API](../05-fleet-management-api/README.md) +puedes usar las siguientes implementaciones mínimas para +completar este proyecto. Elige la implementación en el +lenguaje de programación que más te interese: + +- [Implementación en NodeJS](https://github.com/Laboratoria/minimum-impl-fleet-management-api-nodejs) +- [Implementación en Python](https://github.com/Laboratoria/minimum-impl-fleet-management-api-python) +- [Implementación en Java](https://github.com/Laboratoria/minimum-impl-fleet-management-api-java) + +## 5. Paso a paso para empaquetar tu aplicación en un contenedor de Docker + +### 1. Familiarizate con Docker + +Docker es una herramienta que se usa para crear, desplegar y ejecutar +aplicaciones en contenedores. Por lo tanto es importante +que aprendas a administrar contendedores. Tómate un tiempo +para familiarizarte con Docker. Puedes seguir el +[tutorial oficial de Docker](https://www.docker.com/101-tutorial/) o cualquier +otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Qué es un contenedor? +- [ ] ¿Qué es una Docker Image? +- [ ] ¿Qué es un Image Registry? +- [ ] ¿Cómo ejecutar un contenedor? +- [ ] ¿Cómo detener un contenedor? +- [ ] ¿Cómo publicar un puerto de un contenedor? +- [ ] ¿Cómo ejecutar un comando dentro de un contenedor? +- [ ] ¿Qué es un Dockerfile? +- [ ] En un Dockerfile, ¿para qué sirve el comando FROM? +- [ ] En un Dockerfile, ¿para qué sirve el comando EXPOSE? +- [ ] En un Dockerfile, ¿para qué sirve el comando USE? +- [ ] En un Dockerfile, ¿para qué sirve el comando RUN? +- [ ] En un Dockerfile, ¿para qué sirve el comando WORKDIR? +- [ ] En un Dockerfile, ¿para qué sirve el comando COPY? +- [ ] En un Dockerfile, ¿para qué sirven los comandos CMD y ENTRYPOINT? +- [ ] En un Dockerfile, ¿para qué sirve el comando ENV? +- [ ] ¿Cómo compartir imágenes en Docker Github? + +### 2. Construye una imagen Docker con Dockerfile + +Una vez estes familiarizada con Docker, el siguiente paso es escribir +un Dockerfile para construir una imagen que empaquete tu API. Puedes seguir este +[tutorial](https://medium.com/@anshita.bhasin/a-step-by-step-guide-to-create-dockerfile-9e3744d38d11) +o cualquier otro disponible en internet. + +Para escribir un `Dockerfile` adecuado que empaquete una aplicación, +es importante responder a varias preguntas clave sobre tu aplicación y su entorno. +Aquí tienes una lista de preguntas a considerar: + +1. ¿Cuál es el lenguaje de programación y entorno de ejecución de tu aplicación? +2. ¿Cuál es el sistema operativo preferido o requerido? +3. ¿En qué directorio está ubicado el código fuente de tu aplicación? ¿Necesitas +copiar todo el directorio o solo ciertos archivos? +4. ¿Qué herramientas o paquetes necesitas instalar para que tu aplicación funcione? +¿Usas un archivo como `package.json` (Node.js), `requirements.txt` (Python), +`pom.xml` (Maven, Java) o `build.gradle` (Gradle, Java)? +5. ¿Cuál es el punto de entrada de tu aplicación? ¿Qué comando necesitas ejecutar +para iniciar tu aplicación? +6. ¿En qué puerto(s) escucha tu aplicación para recibir conexiones? Esto es necesario +para la instrucción `EXPOSE`. +7. ¿Existen variables de entorno que deban configurarse para que tu aplicación +funcione correctamente? +8. ¿Hay datos que deben mantenerse persistentes entre reinicios de contenedores? +Si es así, puedes necesitar configurar volúmenes. +9. ¿Existen permisos o configuraciones del sistema que deban aplicarse para que tu +aplicación se ejecute correctamente? +10. ¿Necesitas realizar alguna configuración específica o ejecución de scripts antes +de que tu aplicación esté lista? + +Con ayuda de las respuestas a estas preguntas escribe un Dockerfile que empaquete +tu aplicación con todas sus dependencias, configure el entorno de trabajo y +exponga el puerto necesario, asegurando que la aplicación esté lista para +ejecutarse en un contenedor Docker. + +Luego construye la imagen Docker desde el Dockerfile (`docker build`) y ejecuta +un contenedor basado en la imagen construida (`docker run`). + +Prueba que la API funcione correctamente desde una colección de Postman. +Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +### 3. Publica tu Imagen en Docker Hub + +Crea una cuenta en Docker Hub e inicia sesión desde tu terminal (`docker login`). +Etiqueta tu imagen Docker (`docker tag`) y publícala en Docker Hub (`docker push`) +para su distribución y uso. + +## 6. Consideraciones para pedir tu Project Feedback + +Antes de agendar tu Project Feedback con tu coach, asegúrate de: + +- [ ] Hacer push del Dockerfile al repositorio de proyecto Fleet Management API +- [ ] Construir una colección de Postman para probar la API. +Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +## 7. Objetivos de aprendizaje + +> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir +> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml), +> al crear el repo del proyecto para un cohort en particular usando +> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches). +> +> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml) +> que contempla nuestra currícula. diff --git a/projects/05-kubernetes-deployment/README.MD b/projects/05-kubernetes-deployment/README.MD new file mode 100644 index 000000000..4fac31083 --- /dev/null +++ b/projects/05-kubernetes-deployment/README.MD @@ -0,0 +1,291 @@ +# API Deployment on Kubernetes + +## Índice + +- [1. Consideraciones generales](#1-consideraciones-generales) +- [2. Preámbulo](#2-preámbulo) +- [3. Resumen del proyecto](#3-resumen-del-proyecto) +- [4. Implementaciones de ejemplo](#4-Implementaciones-de-ejemplo) +- [5. Paso a paso general para el despliegue en Amazon EC2](#6-Paso-a-paso-general-para-el-despliegue-en-Amazon-EC2) +- [6. Paso a paso detallado para el despliegue en Amazon EC2](#6-Paso-a-paso-detallado-para-el-despliegue-en-Amazon-EC2) +- [7. Consideraciones para pedir tu Project Feedback](#7-Consideraciones-para-pedir-tu-Project-Feedback) +- [8. Objetivos de aprendizaje](#8-Objetivos-de-aprendizaje) + +--- + +## 1. Consideraciones generales + +- Este proyecto lo resolvemos de manera --individual--. +- El rango de tiempo estimado para completar el proyecto es de 2 a 3 Sprints. + +## 2. Preámbulo + ++Logo de kubernetes +
+ +Kubernetes es una herramienta que facilita la +gestión de aplicaciones contenedorizadas al automatizar +el despliegue, el escalado y la recuperación ante fallos. +Con Kubernetes puedes aumentar +o disminuir el número de contenedores en función de la carga de +trabajo, asegurando que tu aplicación pueda manejar picos de +tráfico sin problemas. +Kubernetes distribuye los contenedores en varios nodos del +clúster, asegurando que la aplicación siga funcionando incluso +si algunos nodos fallan. También puede reiniciar automáticamente +los contenedores que fallan o reemplazarlos si un nodo completo se cae. + +La currícula de Laboratoria incluye 4 proyectos enfocados en +desplegar la [Fleet Management API](../05-fleet-management-api/README.md) +que desarrollaste en la nube. Cada proyecto se distingue por utilizar +diferentes métodos de despliegue, lo que te permitirá aprender y aplicar +diversas estrategias para desplegar tu aplicación en producción en un entorno real. + +## 3. Resumen del proyecto + +En este proyecto empaquetarás la [Fleet Management API](../05-fleet-management-api/README.md) +en un **cluster de kubernetes** a través de **Azure Kubernetes Service** +o en **Amazon Elastic Kubernetes Service**. + +Para este proyecto necesitarás la imagen Docker que construiste +en el proyecto [API Deployment on Docker File](../05-dockerfile-deployment/README.MD). +Si aún no la tienes, por favor implementa primero este proyecto. + +## 4. Paso a paso general para el despliegue en Amazon EKS o Azure AKS + +- Paso 1: Subir la imagen docker a un Registro de Contenedores +(Azure Container Registry o Amazon ECR). +- Paso 2: Crear y Configurar el Clúster de Kubernetes En Azure +Kubernetes Service (AKS) o Amazon Elastic Kubernetes Service (EKS). +- Paso 3: Crear un archivo de despliegue de Kubernetes. +- Paso 4: Crear un archivo de servicio de Kubernetes +- Paso 5: Desplegar los recursos en Kubernetes y verificar el estado del despliegue +- Paso 7: Obtén la dirección IP del balanceador de carga para acceder a laa API. +- Paso 8: Monitorizar los Logs + +## 5. Kubernetes + +Kubernetes es una herramienta que facilita la +gestión de aplicaciones contenedorizadas al automatizar +el despliegue, el escalado y la recuperación ante fallos. +Por lo tanto es importante que te familiarices con los +conceptos básicos de Kubernetes como pods, servicios, +despliegues, nodos, y clústeres. +Para ello será necesario entonces que instales en tu computadora +local [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) +y [minikube](https://minikube.sigs.k8s.io/docs/start/). + +Para familiarizarte puedes seguir el +[tutorial oficial de Kubernetes](https://kubernetes.io/docs/tutorials/kubernetes-basics/) +o cualquier otro disponible en internet. Asegúrate que al final +tengas respuestas claras para las siguientes preguntas: + +- [ ] ¿Qué problemas de la vida real resuelve Kubernetes? +- [ ] ¿Qué es la alta disponibilidad y la recuperación ante fallos? +- [ ] ¿Qué es un Pod en Kubernetes? +- [ ] ¿Qué es un Nodo en un clúster de Kubernetes? +- [ ] ¿Qué es un Clúster en Kubernetes? +- [ ] ¿Qué es una Definición de Tarea en Kubernetes? +- [ ] ¿Cómo se crean y gestionan los recursos en Kubernetes? +- [ ] ¿Qué es un Servicio en Kubernetes y cuál es su función? +- [ ] ¿Qué es un Deployment en Kubernetes y cómo se usa? +- [ ] ¿Cómo se escala una aplicación en Kubernetes? +- [ ] ¿Qué mecanismos proporciona Kubernetes para la alta disponibilidad y la recuperación ante fallos? + +### 1. Crear un archivo de despliegue de Kubernetes. + +Una vez creado el cluster Kubernetes en EKS, +el siguiente paso es escribir un +[archivo de despliegue de Kubernetes (`deployment.yaml`)](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) +Para ello, es importante responder a varias preguntas clave +sobre tu aplicación y su entorno. +Aquí tienes una lista de preguntas a considerar: + +- [ ] ¿Cuál es el nombre de la aplicación? +- [ ] ¿Qué imagen de contenedor se usará? +- [ ] ¿Qué puertos necesita exponer la aplicación? +- [ ] ¿Cuántas réplicas de la aplicación se deben desplegar inicialmente? +- [ ] ¿Cuál es la política de actualización deseada? +- [ ] ¿Qué recursos (CPU y memoria) necesita la aplicación? +- [ ] ¿Cuáles son las variables de entorno necesarias para la aplicación? +- [ ] ¿Se necesitan volúmenes persistentes o temporales? + +Con ayuda de las respuestas a estas preguntas escribe un `deployment.yaml` +para definir un despliegue para la API. + +### 2. Crear un archivo de servicio de Kubernetes + +Una vez creado el cluster Kubernetes en EKS, +el siguiente paso es escribir un +[archivo de servicio de Kubernetes (`services.yaml`)](https://kubernetes.io/docs/concepts/services-networking/service/) +Para ello, es importante responder a varias preguntas clave +sobre tu aplicación y su entorno. +Aquí tienes una lista de preguntas a considerar: + +Para escribir un archivo `services.yaml` adecuado para desplegar una aplicación en Kubernetes, deberías responder las siguientes preguntas: + +- [ ] ¿Cuál es el nombre de la aplicación y del servicio?** +- [ ] ¿Qué tipo de servicio necesitas (`ClusterIP`, `NodePort`, `LoadBalancer`, `ExternalName`)? +- [ ] ¿Qué puertos necesitas exponer?** +- [ ] ¿Cuál es el selector para asociar el servicio con los pods correctos?** +- [ ] ¿Qué protocolos se usarán (TCP/UDP)?** +- [ ] ¿El servicio necesita ser accesible externamente ()`NodePort` o `LoadBalancer`)? + +Con ayuda de las respuestas a estas preguntas escribe un `services.yaml` +para definir un servicio para la API. + +## 6. Paso a paso detallado para el despliegue en Amazon ECS + +### 1. Sube la imagen Docker a Amazon ECR (Elastic Container Registry) + +Amazon ECR es un servicio en la nube que te permite almacenar tus imágenes +Docker de forma segura y eficiente. Amazon ECR actúa como un +"repositorio" para imágenes Docker, similar a cómo GitHub actúa como un +repositorio para código fuente. ECR se integra fácilmente con otros servicios de +AWS, como Amazon ECS (Elastic Container Service). Esto simplifica el despliegue de +tus aplicaciones en contenedores dentro del entorno de AWS. + +En este proyecto almacenaremos en Amazon ECR la imagen docker que hemos +definido para empaquetar nuesta aplicación. Tómate un tiempo +para familiarizarte con ECR. Puedes seguir el +[tutorial oficial de ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Cómo creas un repositorio en Amazon ECR? +- [ ] ¿Cómo te autenticas en Amazon ECR desde tu máquina local? +- [ ] ¿Cómo subes una imagen Docker a Amazon ECR? +- [ ] ¿Cómo gestionas las imágenes en Amazon ECR? +- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Amazon ECR? + +Finalmente, sube la imagen Docker que constuiste para empaquetar tu +aplicación en un repositorio de Amazon ECR. + +### 2. Crear un cluster en Amazon Elastic Kubernetes Service + +El siguiente paso es entonces crear un cluster Kubernetes +en Amazon Elastic Kubernetes Service. + +Tómate un tiempo para familiarizarte con EKS. Puedes seguir este +[tutorial de EKS](https://medium.com/edureka/amazon-eks-ac646c23abf8) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [] ¿Cómo se crean y gestionan los clústeres en EKS? +(`AWS CLI`, `AWS Management Console`, `eksctl`) +- [] ¿Cómo se configura la autenticación y autorización en EKS? +- [] ¿Qué es `kubectl` y cómo se utiliza en el contexto de EKS? +- [] ¿Cómo se gestionan los upgrades de un clúster EKS? +- [] ¿Cómo se configura y gestiona el autoescalado en EKS? +- [] ¿Cómo se diagnostican y resuelven problemas en un clúster EKS? + +Finalmente, usa EKS para crear un clúster Kubernetes para la API. + +### 3. Desplegar los recursos en Kubernetes y verificar el estado del despliegue + +Con ayuda del comando `kubectl apply` aplica los archivos +`deployment.yaml` y `service.yaml` al cluster Kubernetes. + +Verifica el estado del despliegue con `kubectl get deployments` y +`kubectl get services`. Realiza los ajustes necesarios +en los archivos hasta obtener un estado correcto en el +deployment y service. + +### 4. Monitorizar y gestionar la aplicación + +Una vez que el servicio se haya creado, obtén la dirección +IP del balanceador de carga para acceder a tu API con +`kubectl get services`. + +Usa la la IP pública de tu clúster para probar tu API con una +coleccion de Postman. Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +## 6. Paso a paso detallado para el despliegue en Azure Kubernetes Service + +### 1. Sube la imagen Docker a Azure Container Registry + +Azure Container Registry (ACR) es un servicio en la nube que +te permite almacenar tus imágenes Docker de forma segura y +eficiente. ACR actúa como un "repositorio" para imágenes Docker, +similar a cómo GitHub actúa como un repositorio para código fuente. +ECR se integra fácilmente con otros servicios de Azure, como Azure Container Apps. +Esto simplifica el despliegue de tus aplicaciones en contenedores dentro +del entorno de Azure. + +En este proyecto almacenaremos en ACR la imagen docker que hemos +definido para empaquetar nuesta aplicación. Tómate un tiempo +para familiarizarte con ACR. Puedes seguir el +[tutorial oficial de ACR](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [ ] ¿Cómo creas un nuevo registro en Azure Container Registry? +- [ ] ¿Cómo te autenticas en Azure Container Registry desde tu máquina local? +- [ ] ¿Cómo subes una imagen Docker a Azure Container Registry? +- [ ] ¿Cómo gestionas las imágenes en Azure Container Registry? +- [ ] ¿Cómo haces `pull` a tu computadora de una imágen subida a Azure Container Registry? + +Finalmente, sube la imagen Docker que constuiste para empaquetar tu +aplicación en un registro de Azure Container Registry. + +### 2. Crear un cluster en Azure Kubernetes Service + +El siguiente paso es entonces crear un cluster Kubernetes +en Azure Kubernetes Service. + +Tómate un tiempo para familiarizarte con AKS. Puedes seguir este +[tutorial de AKS](https://www.freecodecamp.org/news/how-to-use-azure-kubernetes-service-for-container-orchestration/) +o cualquier otro disponible en internet. Asegúrate que al final tengas respuestas +claras para las siguientes preguntas: + +- [] ¿Cómo se crean y gestionan los clústeres en AKS? (`Azure Portal`, `Azure CLI`). +- [] ¿Cómo se configura la autenticación y autorización en un clúster AKS? +- [] ¿Qué es `kubectl` y cómo se utiliza en el contexto de AKS? +- [] ¿Cómo se gestionan los upgrades de un clúster AKS? +- [] ¿Cómo se configura el autoescalado en AKS? +- [] ¿Cómo se diagnostican y resuelven problemas en un clúster AKS? + +Finalmente, usa AKS para crear un clúster Kubernetes para la API. + +### 3. Desplegar los recursos en Kubernetes y verificar el estado del despliegue + +Con ayuda del comando `kubectl apply` aplica los archivos +`deployment.yaml` y `service.yaml` al cluster Kubernetes. + +Verifica el estado del despliegue con `kubectl get deployments` y +`kubectl get services`. Realiza los ajustes necesarios +en los archivos hasta obtener un estado correcto en el +deployment y service. + +### 4. Monitorizar y gestionar la aplicación + +Una vez que el servicio se haya creado, obtén la dirección +IP del balanceador de carga para acceder a tu API con +`kubectl get services`. + +Usa la la IP pública de tu clúster para probar tu API con una +coleccion de Postman. Puedes utilizar esta +[colección de ejemplo](https://github.com/Laboratoria/curriculum/tree/main/projects/05-fleet-management-api#7-testing). + +## 7. Consideraciones para pedir tu Project Feedback + +Antes de agendar tu Project Feedback con tu coach, asegúrate de +tener una coleccion de Postman para probar la API que +desplegaste en Amazon EKS o Azure AKS. + +## 8. Objetivos de aprendizaje + +> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir +> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml), +> al crear el repo del proyecto para un cohort en particular usando +> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches). +> +> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml) +> que contempla nuestra currícula. diff --git a/projects/05-virtual-machines-deployment/README.MD b/projects/05-virtual-machines-deployment/README.MD new file mode 100644 index 000000000..f64ff739c --- /dev/null +++ b/projects/05-virtual-machines-deployment/README.MD @@ -0,0 +1,131 @@ +# API Deployment on Virtual Machines + +## Índice + +- [1. Consideraciones generales](#1-consideraciones-generales) +- [2. Preámbulo](#2-preámbulo) +- [3. Resumen del proyecto](#3-resumen-del-proyecto) +- [4. Implementaciones de ejemplo](#4-Implementaciones-de-ejemplo) +- [5. Paso a paso general para el despliegue en Amazon EC2 o Azure VMs](#5-Paso-a-paso-general-para-el-despliegue-en-Amazon-EC2-o-Azure-VMs) +- [6. Paso a paso detallado para el despliegue en Amazon EC2](#6-Paso-a-paso-detallado-para-el-despliegue-en-Amazon-EC2) +- [7. Paso a paso detallado para el despliegue en Azure VMs](#7-Paso-a-paso-detallado-para-el-despliegue-en-Azure-VMs) +- [8. Consideraciones para pedir tu Project Feedback](#8-Consideraciones-para-pedir-tu-Project-Feedback) +- [9. Objetivos de aprendizaje](#9-Objetivos-de-aprendizaje) + +--- + +## 1. Consideraciones generales + +- Este proyecto lo resolvemos de manera --individual--. +- El rango de tiempo estimado para completar el proyecto es de 1 a 2 Sprints. + +## 2. Preámbulo + ++Virtual Machines +
+ +_Photo by_ +[_Alexandre Debiève_](https://github.com/user-attachments/assets/506d6905-593f-4774-be0a-26f28c35af9b) + +AWS EC2 y Azure Virtual Machines son servicios de computación en la +nube que permiten a las desarrolladoras crear, gestionar y escalar máquinas +virtuales conocidos como instancias. Ambos servicios proporcionan una +infraestructura flexible y segura para ejecutar una amplia variedad de +aplicaciones y servicios, con características similares como escalabilidad, +diversidad de tipos de instancias, soporte para múltiples sistemas +operativos, opciones de pago por uso, y avanzadas configuraciones de redes +y seguridad. La elección entre AWS EC2 y Azure VMs a menudo depende de +las necesidades específicas del proyecto, la familiaridad con la plataforma +y otros factores como integración con servicios existentes. + +La currícula de Laboratoria incluye 4 proyectos enfocados en +desplegar la [Fleet Management API](../05-fleet-management-api/README.md) +en la nube. Cada proyecto se distingue por utilizar +diferentes métodos de despliegue, lo que te permitirá aprender y aplicar +diversas estrategias para desplegar tu aplicación en producción en un entorno real. + +## 3. Resumen del proyecto + +En este proyecto desplegarás la Fleet Management API en una máquina +virtual usando **Amazon EC2** o **Azure Virtual Machines (Azure VMs)**. + +En lugar de depender únicamente de tu computadora local para ejecutar aplicaciones, +tanto en Amazon EC2 como en Azure VMs, puedes utilizar servidores remotos, llamados +instancias, que ofrecen más potencia y flexibilidad. Puedes elegir entre +diferentes tipos de instancias según las necesidades +de tu aplicación. Hay instancias optimizadas para tareas que requieren +mucha memoria, mucho procesamiento, almacenamiento rápido, etc. Puedes conectarte +a tu instancia desde tu computadora local usando herramientas como SSH +(para Linux) o Remote Desktop (para Windows). Una vez conectada, +puedes usar la instancia como lo harías con tu computadora local: +instalar software, subir código, ejecutar aplicaciones, etc. + +## 4. Implementaciones de ejemplo + +En caso que no hayas implementado aún la +[Fleet Management API](../05-fleet-management-api/README.md) +puedes usar las siguientes implementaciones mínimas para +completar este proyecto. Elige la implementación en el +lenguaje de programación que más te interese: + +- [Implementación en NodeJS](https://github.com/Laboratoria/minimum-impl-fleet-management-api-nodejs) +- [Implementación en Python](https://github.com/Laboratoria/minimum-impl-fleet-management-api-python) +- [Implementación en Java](https://github.com/Laboratoria/minimum-impl-fleet-management-api-java) + +## 5. Paso a paso general para el despliegue en Amazon EC2 o Azure VMs + +Amazon EC2 y Azure Virtual Machines son servicios muy similares. En ambos +podemos seguir el siguiente paso a paso general para +desplegar la Fleet Management API independientemente del lenguaje de +programación en que esta implementada. + +- Paso 1: Crear una cuenta en el proveedor de infraestructura +- Paso 2: Lanzar una máquina virtual +- Paso 3: Configurar la máquina virtual +- Paso 4: Conectar a la máquina virtual desde tu computadora usando SSH +- Paso 5: Instalar las dependencias de la API en la máquina virtual +- Paso 6: Subir el código de tu API en la máquina virtual +- Paso 7: Configurar y ejecutar la API en la máquina virtual +- Paso 8: Probar la API desde tu computadora + +## 6. Paso a paso detallado para el despliegue en Amazon EC2 + +El paso a paso detallado para el despliegue en Amazon EC2 +depende del lenguaje de implementacion de la API. Te +sugerimos las siguientes guías: + +- [Despliegue de API NodeJS](https://dev.to/drsimplegraffiti/from-code-to-the-cloud-a-step-by-step-guide-to-deploying-your-nodejs-app-on-aws-ec2-4300) +- [Despliegue API Python](https://www.geeksforgeeks.org/how-to-deploy-python-application-in-aws/) +- [Despliegue de API Java](https://medium.com/@amitu2016/deploying-spring-boot-web-app-on-aws-using-ec2-and-s3-4db1d0f55c78) + +## 7. Paso a paso detallado para el despliegue en Azure VMs + +El paso a paso detallado para el despliegue en Azure VMs +depende del lenguaje de implementacion de la API. Te +sugerimos las siguientes guias: + +- [Despliegue de API NodeJS](https://learn.microsoft.com/en-us/azure-stack/user/azure-stack-dev-start-howto-vm-nodejs) +- [Despliegue API Python](https://www.geeksforgeeks.org/how-to-deploy-python-application-in-aws/) +- [Despliegue de API Java](https://learn.microsoft.com/en-us/azure-stack/user/azure-stack-dev-start-howto-vm-java) + +## 8. Consideraciones para pedir tu Project Feedback + +Antes de agendar tu Project Feedback con tu coach, asegúrate de +tener una coleccion de Postman para probar la API que +desplegaste en Amazon EC2 o Azure VMs. + +## 9. Objetivos de aprendizaje + +> ℹ️ Esta sección será automáticamente generada en el idioma pertinente, a partir +> de los objetivos de aprendizaje declarados en [`project.yml`](./project.yml), +> al crear el repo del proyecto para un cohort en particular usando +> [`./scripts/create-cohort-project.js`](../../scripts#create-cohort-project-coaches). +> +> Acá puedes ver una [lista de todos los objetivos de aprendizaje](../../learning-objectives/data.yml) +> que contempla nuestra currícula.