Saltar a contenido

Portabilidad en la nube

Los manifiestos de Kubernetes de KanjiIQ son aproximadamente 90% portables entre proveedores de nube. Esta página detalla la ruta de migración a AWS y GCP, destacando lo que permanece igual y lo que necesita cambiar.

Lo que permanece igual (en todas partes)

Estos recursos funcionan de forma idéntica en cualquier clúster de Kubernetes compatible con CNCF:

  • Deployments: Specs de pod, definiciones de contenedores, límites de recursos, sondas de salud
  • Services: Servicios ClusterIP, mapeo de puertos, selectores
  • Secrets: Secrets opacos con stringData
  • PersistentVolumeClaims: Solicitudes de almacenamiento (los proveedores de nube gestionan el resto)
  • Namespaces: Límites de aislamiento
  • Imágenes Docker: Compatibles con OCI, se ejecutan en cualquier runtime de contenedores

Migración a AWS (EKS)

Mapeo de arquitectura

graph TB
    subgraph Current["Current: Hetzner k3s"]
        A1[k3s] --> A2[Traefik]
        A1 --> A3[PostgreSQL on k8s]
        A1 --> A4[Forgejo Registry]
        A1 --> A5[cert-manager]
    end

    subgraph AWS["Target: AWS EKS"]
        B1[EKS] --> B2[ALB Ingress Controller<br/>or Traefik]
        B1 --> B3[RDS PostgreSQL]
        B1 --> B4[ECR]
        B1 --> B5[ACM<br/>or cert-manager]
    end

    Current -.->|Migration| AWS

Componente por componente

Actual Equivalente en AWS Cambio requerido
k3s EKS Aprovisionamiento del clúster (eksctl/Terraform)
Traefik ALB Ingress Controller o mantener Traefik Cambio de anotaciones del Ingress
PostgreSQL en k8s RDS Actualizar el secret DATABASE_URL; eliminar manifiestos PG
Forgejo Registry ECR Actualizar URLs de imágenes en Deployments; actualizar CI/CD
cert-manager ACM Reemplazar anotaciones de cert-manager con ARN de ACM
Forgejo Actions GitHub Actions o CodePipeline Reescribir archivos de flujo de trabajo
PV local EBS (gp3) PVC funciona tal cual; EKS auto-aprovisiona EBS

Cambios en manifiestos

Ingress (si se cambia a ALB):

# Before (Traefik)
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
  ingressClassName: traefik

# After (AWS ALB)
metadata:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
spec:
  ingressClassName: alb

Base de datos (cambio a RDS):

# Update the secret with RDS endpoint
stringData:
  database-url: "postgresql://user:[email protected]:5432/jlpt_flashcard"

Luego eliminar 02-postgres-pvc.yaml y 03-postgres-deployment.yaml — RDS se encarga de todo.

Esfuerzo estimado

  • Configuración del clúster: 1-2 días (EKS + red)
  • Adaptación de manifiestos: 1 día (ingress, secrets, URLs de imágenes)
  • Reescritura de CI/CD: 1 día (GitHub Actions o CodePipeline)
  • Migración de datos: 1 día (pg_dump -> importación a RDS)
  • Cambio de DNS: 1 hora
  • Total: ~4-5 días

Migración a GCP (GKE)

Mapeo de componentes

Actual Equivalente en GCP Cambio requerido
k3s GKE Aprovisionamiento del clúster (gcloud/Terraform)
Traefik GKE Ingress o mantener Traefik Cambio de anotaciones del Ingress
PostgreSQL en k8s Cloud SQL Actualizar DATABASE_URL; eliminar manifiestos PG
Forgejo Registry Artifact Registry Actualizar URLs de imágenes
cert-manager Certificados gestionados por Google o mantener cert-manager Cambio de anotaciones
Forgejo Actions Cloud Build o GitHub Actions Reescribir pipelines
PV local Persistent Disk PVC funciona tal cual

Cambios en manifiestos

Ingress (GKE nativo):

metadata:
  annotations:
    networking.gke.io/managed-certificates: kanjiiq-cert
spec:
  ingressClassName: gce

Esfuerzo estimado

  • Configuración del clúster: 1-2 días
  • Adaptación de manifiestos: 1 día
  • Reescritura de CI/CD: 1 día
  • Migración de datos: 1 día
  • Total: ~4-5 días

Estrategia multi-nube

Para organizaciones que requieren despliegue multi-nube:

Mantener portable

  1. Mantener Traefik en lugar de ingress cloud-native (funciona de forma idéntica en EKS, GKE, AKS)
  2. Mantener cert-manager en lugar de ACM/Google certs (TLS agnóstico de la nube)
  3. Mantener PostgreSQL en k8s si se quiere evitar dependencia de proveedor (contrapartida: mayor carga operativa)
  4. Usar un registro agnóstico de la nube como Harbor (autoalojado, funciona con cualquier k8s)

Aceptar servicios de la nube

Para operaciones simplificadas, adoptar servicios gestionados por nube:

  • Base de datos: RDS (AWS) / Cloud SQL (GCP) — significativamente menos carga operativa
  • Registro: ECR (AWS) / Artifact Registry (GCP) — integración estrecha con IAM
  • TLS: ACM (AWS) / Managed Certs (GCP) — certificados sin mantenimiento

La elección correcta depende de si se prioriza la portabilidad (mantener agnóstico de la nube) o la simplicidad operativa (usar servicios gestionados).