El objetivo de este proyecto es desarrollar y desplegar una aplicación completa, abarcando todas las etapas del ciclo de vida de desarrollo y adoptando una mentalidad DevOps que incluya prácticas de seguridad.
Antes de comenzar con el despliegue, sigue estos pasos iniciales:
- Brainstorming: Lee de forma detallada
TODO
el enunciado. Piensa y esquematiza la infraestructura, y plantéate cómo enfrentar el ejercicio final. Reúnete con tus compañeros y realiza unbrainstorming
entre todos. Debatan y compartan sus ideas. - Definir la estructura del proyecto: Organiza los repositorios y planifica la metodología de despliegue.
- Esquema de infraestructura: Crea un esquema detallado de la infraestructura que incluirá máquinas virtuales, un clúster de Kubernetes y recursos de red. (Draw.io, Excalidraw)
- Revisión de la aplicación: Examina el código de la aplicación asignada para familiarizarte con sus requisitos y componentes. Revisar ficheros de versiones (pom.xml, package.json)
- Configuración de GitHub Actions: Configura GitHub Actions para gestionar el desarrollo, pruebas, despliegue y operaciones (CI/CD) con Ansible, Terraform y Kubernetes. Debes hacer uso de
workflows
ycustom actions
. - Metodología de despliegue: La aplicación se debe poder desplegar en un entorno de desarrollo y en un entorno de producción, por lo que la estructura general y las configuraciones deben permitirlo. ¿Cómo incorporamos este requisito al CI/CD? (Extra Mile)
- Pruebas automatizadas: Añade pruebas automatizadas (unitarias, de integración y de extremo a extremo) en los pipelines para asegurar la calidad del código. (Extra Mile)
Utiliza Terraform para definir la infraestructura requerida, prestando atención a la modularidad y parametrización:
-
Definición de Infraestructura:
- VM para base de datos
- VM para backups y DR
- Clúster de Kubernetes
- Container Registry
-
Configuración de Networking:
- Ambas VMs deben estar en la misma red virtual.
- El clúster de Kubernetes debe estar en otra red virtual diferente.
-
Almacenamiento de
tfstate
: Asegúrate de que el archivotfstate
esté en el Storage Account disponible en el Resource Group asignado (nomenclatura:rg-<nombre>-dvfinlab
).
Notas:
Las máquinas virtuales deben ser de tipoStandard_B1ms
. Los nodos de Kubernetes usan máquinas tipoStandard_B2s
.A fin de garantizar una mayor seguridad, ¿cuáles recursos deberían disponer de una IP pública y cuáles no?
¿Cómo podemos llegar a esos recursos privados desde GitHub Actions?
- Desarrollo de Dockerfiles: Crea Dockerfiles utilizando el enfoque Multistage Build para construir las imágenes de backend y frontend de la aplicación.
- Publicación en el Container Registry: Las imágenes se deben subir al Container Registry y ser consumidas desde allí para su despliegue.
Nota: ¿De qué recurso de networking se debe hacer uso para que el backend y el frontend logren comunicarse entre sí?
-
Manifiestos de Kubernetes:
- Asegura que haya dos réplicas para cada micro.
- Configura memoria y CPU dedicadas para cada pod.
- Asegura que un pod no reciba tráfico hasta que esté completamente operativo.
- Configura un nodo de Kubernetes con escalabilidad a dos nodos. (Extra Mile)
-
Creación y Despliegue de Helm Chart:
- Crea un chart de Helm que use los manifiestos de Kubernetes como template para desplegar la aplicación.
- Utiliza variables, operaciones, bucles y todo lo que considere necesario para lograr que el chart sea reutilizable en diferentes entornos.
- Se va a hacer uso de Harbor para almacenar el chart creado y desde allí se desplegará en el clúster de Azure.
- Aprovisionamiento y Configuración de la BBDD: Automatiza la instalación y configuración del motor de base de datos PostgreSQL en la VM correspondiente, usando Ansible.
- Automatización de Backups: Desarrolla playbooks de Ansible para la gestión de backups y envía copias de seguridad cifradas al Storage Account proporcionado.
- Pruebas de Disaster Recovery: Verifica regularmente el plan de recuperación para asegurarte de que las restauraciones funcionan correctamente.
- Restricción de Acceso: Solo el backend debe tener acceso a la base de datos, y solo el frontend debe ser accesible desde el cliente.
- Cifrado de comunicaciones: Asegura que todas las comunicaciones entre servicios estén encriptadas. (Extra Mile)
- Políticas de Seguridad en Kubernetes: Implementa Network Policies y Pod Security Policies para controlar el acceso entre servicios. (Extra Mile)
- Implementación de Monitoreo y Logging: Añade soluciones de monitoreo y registro de logs para todas las capas de la aplicación. (Extra Mile)
- Herramientas Sugeridas: Utiliza Prometheus y Grafana para monitoreo, y ELK Stack (Elasticsearch, Logstash y Kibana) para obtener métricas y logs detallados. (Extra Mile)
Se le entregarán 3 repositorios: el presente, el del backend de la app y el del frontend de la app. Los ficheros Dockerfile y configuraciones de networking que considere oportunas, irán en los repositorios de la aplicación. El resto de entregables irán en este repositorio y deben respetar la estructura de directorios presente, para lograr una correcta entrega de todos los elementos y facilitar las correcciones a los tutores. Las soluciones que no respeten esta estructura mínima y no estén dentro de la carpeta que corresponda, serán considerados como no entregados
. Si considera que debe agregar algún fichero o directorio a la estructura, puede hacerlo, siempre que se respete lo dicho antes.