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.
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:
| 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.
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
Para inicializar el entorno de desarrollo completo en tu máquina local, hemos preparado un script de automatización.
Asegúrate de tener instaladas las siguientes herramientas:
- Docker (Contenedores)
- Kind (Kubernetes in Docker)
- Kubectl (CLI de Kubernetes)
- Helm (Gestor de paquetes de Kubernetes)
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.shEjemplo 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.
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.
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 |
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;
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