En este tutorial te explico de forma muy sencilla cómo desplegar un sistema TodoApp a internet usando ArgoCD.
La idea de ArgoCD (GitOps) es simple: todo lo que quieres tener en Kubernetes está definido en tu repositorio de Git. ArgoCD se encarga de que el cluster siempre tenga exactamente lo que dice Git.
¿Qué vamos a hacer?
- Crear un servidor en DigitalOcean usando Terraform.
- Instalar Kubernetes ligero (k3s) en ese servidor.
- Instalar ArgoCD.
- Dejar que ArgoCD lea el repositorio y despliegue toda la aplicación (con dominio real + HTTPS).
Herramientas que necesitas
- Terraform
- Cuenta en DigitalOcean (con token de API)
- ArgoCD CLI (opcional pero recomendado)
- Un dominio propio (ejemplo:
todoapp.store) para usar HTTPS
export TF_VAR_do_token="dop_v1__token"
1. Clona el repositorio en nuestro equipo
git clone https://github.com/dalthonmh/todoapp
cd todoapp
2. Crea una clave SSH para DigitalOcean
Esta clave permite que Terraform cree el servidor y que después puedas entrar a él por SSH.
ssh-keygen -t ed25519 -C "todoapp" -f ~/.ssh/id_dalthonmh_digitalocean
Cuando te pregunte la passphrase, solo presiona Enter dos veces (sin poner contraseña).
No poner passphrase hace que sea más fácil trabajar de forma automática.
3. Actualiza el nombre de la clave en Terraform (si es necesario)
Abre el archivo infra/terraform/main.tf y revisa esta parte:
resource "digitalocean_ssh_key" "do_key" {
name = "do-ssh-key"
public_key = file("~/.ssh/id_dalthonmh_digitalocean.pub")
}
Cambia la ruta si usaste un nombre diferente para tu clave.
4. Crea el servidor en DigitalOcean
En tu computadora (no dentro del servidor), ejecuta:
cd infra/terraform
terraform init
terraform plan
terraform apply
Cuando termine, Terraform te mostrará la IP pública del servidor (Droplet). Copia esa IP.
Ejemplo:
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
cp01_ip = "165.22.44.85"
5. Conéctate al servidor por SSH
ssh -i ~/.ssh/id_dalthonmh_digitalocean root@IP_MAQUINA_VIRTUAL
Una vez dentro del servidor, clona el repositorio otra vez:
apt update && apt install git -y
git clone https://github.com/dalthonmh/todoapp
cd todoapp
6. Instala Kubernetes (k3s) y kubectl
Ejecuta estos comandos uno por uno:
# Instalar kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# Instalar k3s (Kubernetes ligero)
curl -sfL https://get.k3s.io | sh -
# Configurar acceso al cluster
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
# Verificar que funciona
kubectl get nodes
7. Crea alias útiles (opcional pero recomendado)
cat >> ~/.bashrc << 'EOF'
alias k=kubectl
complete -o default -F __start_kubectl k
source <(kubectl completion bash 2>/dev/null || true)
EOF
source ~/.bashrc
Prueba que funcione:
k get pods -A
8. Instala ArgoCD
# Crear el namespace
kubectl create namespace argocd
# Instalar ArgoCD
kubectl apply -n argocd \
--server-side --force-conflicts \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
9. Obtén la contraseña inicial de ArgoCD
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d && echo
Copia esta contraseña. La vas a usar para entrar a la interfaz web de ArgoCD.
10. Accede a la interfaz de ArgoCD (port-forward)
Ejecuta este comando en otra terminal (déjalo corriendo):
kubectl port-forward --address 0.0.0.0 svc/argocd-server -n argocd 8080:80
Ahora abre en tu navegador:
http://IP_MAQUINA_VIRTUAL:8080
Usuario: admin
Contraseña: la que copiaste en el paso anterior
11. Crea el proyecto de ArgoCD
Este proyecto define qué cosas puede gestionar ArgoCD.
kubectl apply -f infra/argocd/projects/todoapp-project.yaml
12. Configura tu dominio (para HTTPS)
Para tener un dominio real con certificado HTTPS:
-
En tu proveedor de dominio (Namecheap, etc.) registra los dns de Digital Ocean: Vamos a Domain List > Nameservers > Custom DNS
- ns1.digitalocean.com
- ns2.digitalocean.com
- ns3.digitalocean.com
-
En Digital Ocean vamos a Networking > Domains Agregamos el dominio que tenemos y dentro de la configuración del dominio creamos un registro de tipo A donde en value apunte a la IP público.
-
Espera unos minutos a que el DNS se propague.
-
Podemos probar con el comando:
dig +short todoapp.storeNos tiene que devolver la ip del droplet.
13. Instala cert-manager (para certificados HTTPS automáticos)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml
Espera 1-2 minutos a que todos los pods estén listos:
k get pods -n cert-manager
14. Despliega la aplicación con ArgoCD (App of Apps)
kubectl apply -f infra/argocd/bootstrap/app-of-apps-prod.yaml
Esto creará automáticamente dos aplicaciones:
todoapp-prod→ la aplicación completacomponents-prod→ el Ingress + configuración de dominio y TLS
15. Sincroniza la aplicación
Tienes dos formas:
Opción A: Desde la terminal (con ArgoCD CLI)
Primero inicia sesión:
argocd login localhost:8080 --username admin --password TU_CONTRASEÑA --insecure
Luego sincroniza:
argocd app list
argocd app sync todoapp-bootstrap-prod
Opción B: Desde el navegador
En la interfaz de ArgoCD (http://IP_MAQUINA_VIRTUAL:8080) verás las aplicaciones. Haz clic en Sync en cada una.
Espera a que todo quede en verde (Healthy + Synced).
16. ¡Listo!
Abre tu dominio en el navegador (ejemplo: https://todoapp.store). Deberías ver la TodoApp funcionando con HTTPS.
Cómo destruir todo cuando termines
Cuando ya no necesites el servidor:
cd infra/terraform
terraform destroy
Confirma con yes. Esto elimina el Droplet de DigitalOcean.