— Nube y DevOps

Multinube, contenedores, entrega

La nube es una capa de commodity que ensamblo — no un proveedor al que estoy atado.

Despliego en GCP, Azure y AWS, con runtimes de edge y backends gestionados, eligiendo el servicio más fuerte para cada rol y orquestando entre proveedores. Contenedores, CI/CD e infraestructura como código están en el centro; Linux corre por debajo a nivel de administrador.

La postura

No elijo una nube y doblego cada problema hacia ella. Elijo el servicio más fuerte para cada rol y orquesto entre proveedores.

Multinube, para mí, no es una palabra de moda — es una negativa deliberada a dejar que un proveedor posea la arquitectura. GCP, Azure y AWS cada uno hace algunas cosas mejor que los otros, y los runtimes de edge y los backends gestionados cubren roles que ninguno de los tres grandes cubre limpiamente. El trabajo es elegir bien por rol y mantener todo portátil.

Lo que lo hace posible es la capa de debajo: contenedores e infraestructura como código en el centro, para que una carga definida una vez pueda apuntar a cualquier proveedor en el que ya viva un proyecto. La nube se convierte en un commodity que puedo intercambiar, en lugar de una dependencia alrededor de la que tengo que planificar.

Y bajo el orquestador sigue habiendo un host. Opero Linux a nivel de administrador — ajuste del kernel, endurecimiento con sysctl, systemd, runtimes de contenedores y la red bajo los servicios — porque las partes que la mayoría hereda como valores por defecto son las partes que preferiría operar de forma deliberada.

0

nubes principales en las que despliego — GCP, Azure y AWS — elegidas por rol, no por costumbre

0

proveedores de los que dejo depender a la arquitectura; la nube es una capa de commodity que puedo intercambiar

0

runtimes de edge que ejecuto en la frontera de la red — Cloudflare Workers y Vercel Edge

0

backends de base de datos gestionados que mantengo listos — Supabase, Firebase, PlanetScale, Neon

Topología multinube

Una aplicación, tres nubes, sin lock-in.

Una carga que mantengo portátil: contenedores e infraestructura como código en el centro, desplegables al proveedor en el que ya corra un proyecto. Cada proveedor se conecta para el rol que hace mejor, y el edge se sitúa al frente de todos ellos.

Núcleo de la app Docker · K8s · IaC GCP Vertex AI · Cloud Run · GKE · Pub/Sub Azure AKS · Functions · Container Apps AWS Lambda · EKS · S3 · RDS · SQS BaaS Supabase · Firebase · Neon · PlanetScale Edge — CF Workers · Vercel Edge

Selección de servicios — la herramienta más fuerte por rol

Entrenamiento y serving de modelos
Vertex AI (GCP)
Consultas analíticas a escala
BigQuery (GCP)
Bus de eventos / difusión
Pub/Sub (GCP) · SQS/SNS (AWS)
Contenedores con escalado a cero
Cloud Run (GCP) · Container Apps (Azure)
Kubernetes completo
GKE · AKS · EKS
Funciones dirigidas por eventos
Cloud Functions · Azure Functions · Lambda
Almacenamiento de objetos
Cloud Storage (GCP) · S3 (AWS)
Base de datos relacional
RDS (AWS) · Neon · PlanetScale
Cómputo en el edge
Cloudflare Workers · Vercel Edge
CDN
CloudFront (AWS)

Para cada rol elijo el proveedor que lo hace mejor, y luego orquesto entre ellos — la nube debería ser un commodity que puedo intercambiar, nunca una dependencia que posee el producto.

Proveedor por proveedor

Para qué sirve realmente cada nube.

Las cuatro pestañas de abajo no son un ranking. Cada una es un conjunto de roles que un proveedor dado hace bien, y la disciplina es emparejar una carga con el que encaja en lugar de forzar todo sobre una sola cuenta. GCP para datos y modelos, Azure dentro del ecosistema de Microsoft, AWS como el estándar amplio, y el edge y los backends gestionados para la vía rápida.

Google Cloud — donde suele vivir el trabajo de datos y modelos

En GCP coloco las cargas de trabajo que tocan datos y modelos. Vertex AI para entrenamiento y serving, BigQuery para consultas analíticas sobre tablas grandes, y Pub/Sub como bus de mensajes cuando los servicios necesitan difundir eventos sin conocerse entre sí.

Para cómputo recurro a Cloud Run cuando un contenedor debe escalar a cero entre peticiones, Cloud Functions para pequeños manejadores dirigidos por eventos, y GKE cuando una carga necesita toda la superficie de Kubernetes. Firestore y Cloud Storage cubren el estado de documentos y los objetos.

  • Vertex AI para entrenamiento y serving de modelos
  • Cloud Run · Cloud Functions · GKE para cómputo en todo el espectro de escalado
  • Pub/Sub · BigQuery · Firestore · Cloud Storage para mensajería, analítica, estado y objetos
Contenedores y Kubernetes

La unidad de despliegue es la misma donde sea que aterrice.

ingress serviciobalanceo clúster — GKE · AKS · EKS pod · img@sha pod · img@sha pod · img@sha

Docker · Kubernetes · seguridad de contenedores

Una imagen inmutable, planificada por Kubernetes, idéntica en todos los proveedores.

Todo se envía como contenedor. Una carga se empaqueta como una imagen Docker inmutable, construida una vez, y esa imagen exacta es la que corre en cada entorno — no hay recompilación que pudiera diferir silenciosamente entre staging y producción.

Kubernetes la planifica de la misma forma ya sea que el clúster sea GKE, AKS o EKS, así que la carga es portátil por construcción. La seguridad está integrada en la imagen en lugar de añadida después: imágenes base mínimas, usuarios sin root, sistemas de archivos de solo lectura, capacidades de Linux descartadas, y un escaneo antes de subir nada.

  • Una imagen inmutable, construida una vez, ejecutada en todas partes
  • Planificada de forma idéntica en GKE, AKS o EKS
  • Imágenes base mínimas, sin root, solo lectura, capacidades descartadas
  • Escaneada antes de llegar a un registro
DockerKubernetesSeguridad de contenedores

Carga de Kubernetes — forma de operación

Orquestador
Kubernetes — GKE, AKS o EKS
Unidad de despliegue
Imagen de contenedor inmutable, build único
Escalado
Autoescalado horizontal de pods por métricas
Config y secretos
ConfigMaps y Secrets, montados en tiempo de ejecución
Ingress
Balanceador de carga gestionado · CDN al frente
Despliegue
Rolling, canary o blue-green
Origen de imagen
Registro con etiquetas inmutables y firmadas
CI/CD

La imagen se construye una vez y se promueve sin cambios.

Un pipeline que trato como infraestructura no negociable. A partir de un commit, la imagen se construye y prueba una vez, se escanea, se sube con una etiqueta inmutable, y se promueve a través de cada puerta — para que lo que corre en producción sea byte a byte lo que pasó las pruebas.

commit build+ test scan push aplicarIaC promovercanary

Del commit a producción — GitHub Actions / GitLab CI

  1. 01 Commit Un push al repositorio es el único disparador; nada se construye a mano.
  2. 02 Build + test GitHub Actions o GitLab CI construye la imagen del contenedor una vez y corre la suite de pruebas contra ella.
  3. 03 Escaneo Se escanea la imagen en busca de vulnerabilidades conocidas y se revisa el árbol de dependencias antes de poder avanzar.
  4. 04 Push La imagen firmada se sube a un registro con una etiqueta inmutable — nunca se sobrescribe.
  5. 05 Aplicar IaC La infraestructura como código planifica el cambio, muestra el diff y luego lo aplica para que el entorno coincida con el repositorio.
  6. 06 Promoción La misma imagen se despliega tras un conmutador canary o blue-green, con la versión anterior a un comando de distancia.
Una pequeña pieza de lo real

El pipeline, como archivo.

Un flujo de GitHub Actions recortado — construir la imagen una vez, probarla, escanearla, luego subirla con una etiqueta inmutable. La misma imagen se promueve después a cada entorno; nada se recompila aguas abajo.

name: build-and-deploy
on:
  push:
    branches: [ main ]

jobs:
  ship:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    env:
      IMAGE: ghcr.io/${{ github.repository }}:${{ github.sha }}
    steps:
      - uses: actions/checkout@v4

      - name: Build image (once)
        run: docker build -t "$IMAGE" .

      - name: Test
        run: docker run --rm "$IMAGE" go test ./...

      - name: Scan for vulnerabilities
        run: trivy image --exit-code 1 --severity HIGH,CRITICAL "$IMAGE"

      - name: Push immutable tag
        run: |
          echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
          docker push "$IMAGE"
Un contenedor, como archivo

La imagen, definida tal como se envía.

Un Dockerfile multietapa — compilar en una imagen de build completa, luego copiar solo el binario a un runtime mínimo que corre como usuario sin root. Superficie pequeña, nada en la imagen que el programa no necesite.

# --- build stage: full toolchain, thrown away after compile ---
FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o /out/app ./cmd/app

# --- runtime stage: minimal, non-root, only the binary ---
FROM gcr.io/distroless/static:nonroot
COPY --from=build /out/app /app
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/app"]
Infraestructura como código

Declarada, planificada, revisada, aplicada.

códigodeclarado plandiff revisaraprobar aplicarvivo = repo la verificación de deriva vuelve al código

El entorno vive en el repositorio

Nadie hace clic para que producción exista.

Cada pieza de infraestructura — redes, clústeres, colas, bases de datos — se declara como código y vive en control de versiones junto a la aplicación. Un cambio se propone como un diff, se planifica como una ejecución en seco, se revisa como cualquier otro código, y luego se aplica.

El punto es que el repositorio es la única fuente de verdad. Una replanificación periódica detecta cualquier deriva manual, de modo que el entorno en vivo siempre se reconcilia con lo que el código dice que debería ser. Un entorno se vuelve reproducible en lugar de ser el producto de clics recordados en una consola.

  • Redes, clústeres, colas y bases de datos como código
  • El plan muestra el diff antes de que algo cambie
  • Revisado como código, no clicado en una consola
  • Las verificaciones de deriva mantienen al repositorio como autoridad
IaCReproducibleVersionado

Infraestructura como código — de declarar a reconciliar

  1. 01 Escribir La infraestructura se declara como código — redes, clústeres, colas, bases de datos — en control de versiones junto a la aplicación.
  2. 02 Planificar Una ejecución en seco calcula el diff entre el estado declarado y el estado en vivo, de modo que cada cambio es visible antes de ocurrir.
  3. 03 Revisar El plan se revisa como cualquier otro cambio de código; nadie hace clic en una consola para mutar producción.
  4. 04 Aplicar El plan se aplica; el entorno en vivo coincide ahora exactamente con el repositorio.
  5. 05 Verificar deriva Replanificaciones periódicas detectan cambios manuales, de modo que el estado declarado sigue siendo la única fuente de verdad.
El host por debajo

Linux a nivel de administrador.

Por encima del orquestador hay Kubernetes; por debajo sigue habiendo un host Linux, y esa es una capa que opero de forma deliberada en lugar de heredar.

Los contenedores no eliminan el sistema operativo — se asientan sobre él. Opero Linux a nivel de administrador: ajuste del kernel para la carga, endurecimiento con sysctl para apretar la superficie del kernel en ejecución, systemd para definir servicios con políticas de reinicio y límites de recursos, los propios runtimes de contenedores, y la red que transporta cada paquete desde el edge hasta un pod.

Este es el mismo instinto que recorre el resto de mi trabajo. Las partes que la mayoría acepta como valores por defecto — los parámetros del kernel, las reglas de firewall, la imagen base a partir de la que se construye un contenedor — son las partes que preferiría entender y fijar a propósito, porque ahí es donde la fiabilidad y la seguridad nacen silenciosamente.

01

Ajuste del kernel

Ajustar los parámetros del kernel para la carga de trabajo — límites de descriptores de archivo, búferes de red, comportamiento del planificador — en lugar de aceptar los valores por defecto de la distribución.

02

Endurecimiento con sysctl

Endurecer la superficie del kernel en ejecución mediante sysctl: ajustes de la pila de red, protecciones del espacio de direcciones y desactivar lo que un servidor no tiene motivo de exponer.

03

systemd

Servicios definidos como unidades systemd con políticas de reinicio, límites de recursos y orden de dependencias, para que el host se comporte de forma predecible entre reinicios.

04

Runtimes de contenedores

Trabajar a nivel del runtime — Docker y la capa OCI debajo — incluyendo namespaces, cgroups y los internos de la imagen, no solo los comandos de alto nivel.

05

Redes

La red bajo los servicios: enrutamiento, reglas de firewall, DNS, terminación TLS y la ruta que toma un paquete desde el edge hasta un pod.

06

Seguridad de contenedores

Imágenes base mínimas, usuarios sin root, sistemas de archivos de solo lectura, capacidades descartadas y escaneo de imágenes — reduciendo lo que un contenedor comprometido puede alcanzar.

Observabilidad

Un sistema en el que no puedes ver es uno que no puedes operar.

Una vez que una carga está repartida entre funciones, contenedores y colas en más de un proveedor, no puedes operarla por intuición. La observabilidad es la parte que convierte un sistema distribuido de vuelta en algo sobre lo que puedes razonar — métricas para tendencias, logs para detalle, trazas para la ruta que tomó una petición, y alertas que avisan ante síntomas que un usuario realmente sentiría.

Trato la pila de observabilidad como parte del build, no como algo añadido después del primer incidente. Las cuatro pestañas de abajo son las capas que instrumento, y el orden importa: una métrica apunta al problema, una traza lo estrecha a un salto, y los logs explican qué pasó en esa petición exacta.

Números a lo largo del tiempo, para que las tendencias se vean antes de convertirse en incidentes

Las métricas son la señal barata y siempre activa: tasas de petición, tasas de error, percentiles de latencia, saturación de recursos. Son lo que lee un autoescalador y lo que dispara una alerta, porque son numéricas y continuas.

Instrumento las cosas que se corresponden con una experiencia de usuario — la latencia que una petición realmente experimenta, la tasa de error que un cliente realmente sufre — en lugar de solo contadores a nivel de host que parecen sanos mientras el producto está fallando.

  • Tasa de peticiones, tasa de error, percentiles de latencia
  • Saturación de recursos que impulsa el autoescalado
  • Señales ligadas a la experiencia de usuario, no solo contadores de host
métricastasa · latencia logsestructurados trazaspor petición recolectarcentralizar tablerostendencias en el tiempo alertasavisos ante síntomas
Las capas, de abajo arriba

Del kernel a la nube, una sola pila.

Host, contenedor, pipeline, nube — leído de abajo arriba, el trabajo es una pila continua en lugar de cuatro preocupaciones separadas.

Cada capa descansa sobre la de debajo. Un host Linux endurecido carga un runtime de contenedores; una imagen inmutable corre en Kubernetes; un pipeline de CI/CD y la infraestructura como código hacen todo reproducible; y un despliegue multinube lo distribuye sin atarse a un solo proveedor.

Separadas, parecen especialidades distintas. Operadas juntas, son una sola disciplina: deliberada en cada capa, portátil entre proveedores, y reproducible desde un repositorio en lugar de desde la memoria.

  1. Host Linux a nivel de administrador Ajuste del kernel, endurecimiento con sysctl, unidades systemd, runtimes de contenedores y la red por debajo — la capa que la mayoría hereda, operada de forma deliberada.
  2. Contenedor Docker y Kubernetes Cargas empaquetadas como imágenes de contenedor inmutables y ejecutadas en Kubernetes — GKE, AKS o EKS — para que la unidad de despliegue sea la misma donde sea que aterrice.
  3. Pipeline CI/CD e infraestructura como código GitHub Actions y GitLab CI construyen y promueven la imagen; la infraestructura declarada como código hace todo el entorno reproducible en lugar de construido a mano.
  4. Nube Multinube, por rol GCP, Azure y AWS — más runtimes de edge y backends gestionados — seleccionados por rol y orquestados juntos, sin que ningún proveedor único posea la arquitectura.
Cómo trabajo

Los principios bajo la plataforma.

Los proveedores y las herramientas cambian con el proyecto; los principios no. Estas son las reglas que aplico ya sea que el objetivo sea GCP, Azure, AWS, el edge o un backend gestionado — la parte que hace la plataforma reproducible en lugar de incidental.

01

Elegir el servicio más fuerte por rol

Para cada rol — serving de modelos, el bus de eventos, la base de datos, el edge — elijo el proveedor que lo hace mejor, y luego orquesto entre ellos. El resultado es un sistema ensamblado con las piezas correctas, no con las convenientes.

02

Nunca depender de una sola nube

Los contenedores y la infraestructura como código están en el centro para que la misma carga pueda apuntar a GCP, Azure o AWS. La nube es un commodity que puedo intercambiar, no una dependencia que posee el producto.

03

Construir la imagen una vez, promoverla sin cambios

Una imagen se construye una sola vez y se mueve a través de cada puerta hacia producción byte a byte. Lo que corre en producción es exactamente lo que pasó las pruebas, no una recompilación que podría diferir.

04

Declarar la infraestructura, nunca hacer clic en ella

Redes, clústeres, colas y bases de datos se declaran como código, se planifican, se revisan y se aplican. Nadie muta producción en una consola, así que el repositorio sigue siendo la única fuente de verdad.

05

Endurecer el host por debajo

Operar Linux a nivel de administrador — ajuste del kernel, endurecimiento con sysctl, systemd, runtimes de contenedores, redes — significa que la capa bajo el orquestador es deliberada, no dejada en sus valores por defecto.

06

Hacer el sistema observable

Métricas, logs y trazas son parte del build, no algo añadido después de un incidente. Un sistema en el que no puedes ver es un sistema que no puedes operar.

Elegir el servicio más fuerte por rol, mantener la carga portátil con contenedores y código, construir la imagen una vez, y endurecer el host por debajo — todo lo demás es detalle.

Open to the right work

Si necesitas una plataforma que corra entre nubes sin pertenecer a ninguna de ellas, ese es el trabajo que hago.

If you are holding a problem that doesn't fit inside one field, that is the conversation I want.

NextCybersecurity