Skip to content

alexlafuente/GymPalDevOps

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GymPal - DevOps Infrastructure

Kubernetes ArgoCD Kind

Bienvenido al repositorio de infraestructura de GymPal, la red social para entusiastas del fitness. Este repositorio contiene toda la configuración de Infraestructura como Código (IaC) necesaria para desplegar la plataforma utilizando prácticas modernas de GitOps.

Arquitectura del Sistema

El despliegue se orquesta mediante Argo CD siguiendo el patrón App of Apps. La infraestructura se define declarativamente y se sincroniza automáticamente con el estado del clúster.

En este repositorio se definen los recursos custom de Kubernetes (CRDs) propios de ArgoCD, manifiestos de tipo Application, que encapsulan lógicamente y gestionan los siguientes componentes:

Componentes Principales

Componente Descripción
Ingress NGINX Controlador de entrada para gestionar el tráfico HTTP/HTTPS.
Cert-Manager Gestión automática de certificados TLS (Self-signed para local).
Argo CD Motor de GitOps para CD (Continuous Delivery).
GymPal Apps Despliegue automático del Frontend y Backend desde GymPalGitOps.

Las aplicaciones de negocio (frontend y backend) se gestionan como aplicaciones hijas bajo el patrón App of Apps; sus Helm Charts y valores se mantienen en el repositorio GymPalGitOps, que actúa como source-of-truth para la configuración por microservicio.

Las aplicaciones de infraestructura (Ingress, Cert-Manager...) se definen y versionan desde este repositorio (GymPalDevOps) y normalmente referencian Helm Charts públicos oficiales, aunque si hubiéramos querido configurarlos manualmente o centralizar la configuración, también hubieran apuntado a charts o valores almacenados en GymPalGitOps.


Estructura del Repositorio

GymPalDevOps/
├── bootstrap/              # Configuración del patrón "App of Apps"
│   ├── manifests/          # Manifiestos crudos (ej. ClusterIssuer)
│   ├── templates/          # Templates de Helm para las aplicaciones ArgoCD
│   └── values/             # Valores de configuración para los charts
├── kind-config.yaml        # Configuración del clúster Kind (puertos 80/443)
├── bootstrap.yaml          # Manifiesto inicial para arrancar la "App Padre"
└── README.md               # Este archivo

Guía de Inicio Rápido (Entorno Local)

Para inicializar el entorno de desarrollo completo en tu máquina local, hemos preparado un script de automatización.

Prerrequisitos

Asegúrate de tener instaladas las siguientes herramientas:

  • Docker (Contenedores)
  • Kind (Kubernetes in Docker)
  • Kubectl (CLI de Kubernetes)
  • Helm (Gestor de paquetes de Kubernetes)

Inicialización Automática

Ejecuta el script init.sh situado en la raíz de este proyecto. Este script levantará el clúster, instalará Argo CD y desplegará la plataforma completa.

chmod +x init.sh
./init.sh

Ejemplo de output esperado tras la ejecución del script init.sh:

Iniciando despliegue de infraestructura GymPal...
[1/6] Verificando herramientas necesarias...
✅ Todas las herramientas están listas.
[2/6] Configurando clúster local...
✅ Clúster creado.
[3/6] Instalando Argo CD...
Esperando a que Argo CD Server esté disponible...
✅ Argo CD operativo.
[4/6] Aplicando CRDs de Cert-Manager...
[5/6] Desplegando plataforma GymPal (Bootstrap)...
✅ Manifiesto bootstrap aplicado. Argo CD comenzará la sincronización.
[6/6] Obteniendo credenciales...
¡Despliegue finalizado con éxito!
==================================================
Credenciales Argo CD:
   Usuario: admin
   Pass:    <generated_password>
URLs (Añadir a /etc/hosts):
   127.0.0.1  argocd.gympal.com
   127.0.0.1  app.gympal.com
==================================================
Comprobando estado de las aplicaciones...
NAME                    SYNC STATUS   HEALTH STATUS
gympal-frontend         Synced        Healthy
gympal-backend          Synced        Healthy

Note

Es probable que las aplicaciones tarden unos minutos en sincronizarse completamente y en mostrarse como "Healthy" en Argo CD, ya que deben descargar imágenes, iniciar pods y aplicar configuraciones.


Configuración de DNS Local

Dado que estamos utilizando un entorno local con Ingress, es necesario mapear los dominios al localhost.

Para lograrlo, debes añadir las siguientes entradas a tu archivo /etc/hosts:

  • Linux/Mac: sudo vi /etc/hosts
  • Windows: C:\Windows\System32\drivers\etc\hosts (editar con permisos de administrador)
127.0.0.1 argocd.gympal.com
127.0.0.1 app.gympal.com

Note

Se utilizan certificados autofirmados generados por cert-manager. Tu navegador mostrará una advertencia de seguridad que deberás aceptar.


Sync Waves (Orden de Despliegue)

Argo CD utiliza "Sync Waves" para asegurar que las dependencias se desplieguen en orden:

Wave Componente Descripción
-1 CRDs de Cert-Manager Necesario para gestionar certificados TLS.
0 Namespaces y ClusterIssuers (base-manifests) Espacios de nombres y configuración TLS.
1 Ingress NGINX Controlador de entrada para el tráfico.
2 Cert-Manager Gestión automática de certificados TLS.
3 Frontend (gympal-frontend) Aplicación Frontend de GymPal.
4 Backend (gympal-backend) Aplicación Backend de Gym

Diagrama de Arquitectura

El siguiente diagrama ilustra la arquitectura completa del sistema, incluyendo el flujo de CI/CD desde el desarrollo hasta el despliegue en Kubernetes utilizando GitOps con Argo CD.

---
config:
  theme: forest
---
graph TD
    subgraph "Desarrollo (Code Sources)"
        Dev[Desarrolladores]
        RepoBack["Repo: PTI-GymPalBack"]
        RepoFront["Repo: GymPalFrontend"]
    end

    subgraph "Integración Continua (GitHub Actions)"
        CI_Back["Workflow Backend"]
        CI_Front["Workflow Frontend"]
        Reg["GitHub Container Registry<br/>(GHCR)"]
    end

    subgraph "GitOps (Source of Truth)"
        RepoGitOps["Repo: GymPalGitOps<br/>(Helm Charts)"]
        RepoInfra["Repo: GymPalDevOps<br/>(ArgoCD Config)"]
    end

    subgraph "Infraestructura (Kubernetes/Kind)"
        subgraph "Control Plane"
            ArgoCD[ArgoCD Controller]
        end
        subgraph "Data Plane"
            PodBack[Pod: Backend]
            PodFront[Pod: Frontend]
            Ingress[Nginx Ingress]
        end
    end
    Dev -->|Push Code| RepoBack
    Dev -->|Push Code| RepoFront
    
    RepoBack -->|Trigger| CI_Back
    RepoFront -->|Trigger| CI_Front
    
    CI_Back -->|Build & Push Image| Reg
    CI_Front -->|Build & Push Image| Reg
    
    CI_Back -->|Update values.yaml tag| RepoGitOps
    CI_Front -->|Update values.yaml tag| RepoGitOps
    
    RepoInfra -->|Bootstrap App of Apps| ArgoCD
    ArgoCD -->|Watch/Sync| RepoGitOps
    
    ArgoCD -->|Deploy/Update| PodBack
    ArgoCD -->|Deploy/Update| PodFront
    
    classDef repo fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
    classDef ci fill:#fff3e0,stroke:#e65100,stroke-width:2px;
    classDef k8s fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
    
    class RepoBack,RepoFront,RepoGitOps,RepoInfra repo;
    class CI_Back,CI_Front,Reg ci;
    class ArgoCD,PodBack,PodFront,Ingress k8s;
Loading

Flujo de CI/CD Detallado (Diagrama de Secuencia)

El siguiente diagrama de secuencia detalla el flujo completo desde que un desarrollador realiza un push en el repositorio de código hasta que la nueva versión de la aplicación se despliega automáticamente en el clúster de Kubernetes mediante GitOps.

---
config:
  theme: dark
  themeVariables:
    fontFamily: 'Inter, Arial, sans-serif'
    fontSize: 16px
    primaryColor: "#222831"
    primaryTextColor: "#F8F8F2"
    primaryBorderColor: "#00ADB5"
    lineColor: "#F8F8F2"
    secondaryColor: "#393E46"
    secondaryTextColor: "#FFFFFF"
    tertiaryColor: "#2C333A"
    tertiaryTextColor: "#EEE"
---
sequenceDiagram
    autonumber
    actor Dev as Desarrollador
    participant GH as GitHub Repo (Code)
    participant GA as GitHub Actions (CI)
    participant GHCR as GH Container Registry
    participant GitOps as Repo GymPalGitOps
    participant Argo as ArgoCD (K8s)

    Dev->>GH: Push commit a branch 'main'
    activate GH
    GH->>GA: Dispara Workflow 'publish.yml'
    deactivate GH
    activate GA
    Note over GA: Setup QEMU & Docker Buildx
    GA->>GA: Build Docker Image (amd64/arm64)
    GA->>GHCR: Push Image (tag: sha_short)
    activate GHCR
    GHCR-->>GA: Image Stored OK
    deactivate GHCR
    Note over GA: Checkout Repo GitOps con SSH Key
    GA->>GA: yq -i '.image.tag = "sha"' values.yaml
    GA->>GitOps: Commit & Push "Update image tag"
    deactivate GA
    activate GitOps
    Note right of GitOps: El estado deseado ha cambiado
    GitOps-->>Argo: Webhook / Polling detecta cambio
    deactivate GitOps
    activate Argo
    Argo->>Argo: Comparar Estado (Diff)
    Argo->>Argo: Sincronizar (Sync)
    Note right of Argo: Rolling Update de Pods en el clúster
    deactivate Argo
Loading

About

GymPal DevOps repository

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages