AlpinaShop ya construye, despliega y se observa sola. El módulo 7 empieza por la parte que el curso ha ido esquivando: hay sistemas de AlpinaShop que no están en Google Cloud y no van a estarlo. En la tienda física de Sabadell hay un servidor con un ERP en MySQL que gestiona el inventario, la caja y las facturas; y en el almacén hay un terminal de radiofrecuencia que habla con ese ERP por la red local. Nadie los ha migrado, nadie tiene previsto migrarlos este año, y sin embargo la tienda online necesita saber el stock real.
Eso es una arquitectura híbrida, aunque nadie la haya llamado así. Y no es un caso raro: es la situación normal de casi cualquier empresa con más de cinco años de historia. Esta lección trata de cómo Google Cloud aborda ese escenario, y del producto que durante años lo representó: Anthos.
Con una advertencia de honestidad por delante, porque marca el tono de todo el módulo: al final de la lección, AlpinaShop no va a adoptar Anthos. Y entender por qué es tan valioso como saber configurarlo, porque la habilidad que separa a un buen arquitecto de nube de un buen recitador de servicios es saber cuándo no hace falta la herramienta grande. Vas a aprender qué es, cómo funciona, qué problemas resuelve de verdad y cuánto cuesta —y con esos tres datos vas a poder tomar la decisión tú, en tu empresa, con criterio propio.
Una nota previa sobre nombres, porque este es el producto de Google Cloud que más veces ha cambiado de nombre y la documentación que encontrarás está repartida entre todos ellos. Se detalla en el apartado 5.
Contenido
- Qué significan exactamente "híbrido" y "multinube"
- Los motivos reales para no estar solo en una nube
- Los costes ocultos que el folleto no menciona
- El caso de AlpinaShop: Sabadell, el ERP y el terminal del almacén
- Qué es Anthos y en qué se ha convertido
- La flota (fleet): la unidad de gestión
- Los componentes, uno a uno
- Config Sync: la configuración como código con GitOps
- Policy Controller: las políticas como código
- Ejemplo práctico: registrar
alpinashop-clustery aplicar una política - El mallado de servicios explicado sin humo
- Binary Authorization y la cadena de confianza
- Observabilidad unificada de la flota
- Modelo de licencia y coste: lo que decide en la práctica
- Alternativas más ligeras al híbrido completo
- Cuándo sí y cuándo no: la tabla de decisión
- DA-004: la decisión honesta de AlpinaShop
- Qué significan exactamente "híbrido" y "multinube"
Los dos términos se usan como sinónimos y no lo son. La diferencia importa porque los problemas que plantean son distintos.
| Término | Definición | Ejemplo típico |
|---|---|---|
| Nube pública única | Toda la carga en un proveedor | AlpinaShop hasta hoy: todo en GCP |
| Híbrido | Nube pública + infraestructura propia (centro de datos, oficina, tienda, fábrica) | GCP + el ERP de Sabadell |
| Multinube | Dos o más nubes públicas | GCP para el catálogo, AWS para el ERP en SaaS |
| Borde (edge) | Cómputo cerca del punto de uso: tienda, planta, vehículo | El terminal del almacén ejecutando lógica local |
Y una cuarta categoría que casi nadie nombra pero que es la más frecuente:
- Multinube accidental: la empresa está en GCP, pero además tiene un CRM en Salesforce, el correo en Microsoft 365, la facturación en un SaaS y un par de máquinas en un proveedor barato que alguien contrató en 2019. Nadie lo decidió; ocurrió. Y sin embargo hay que integrarlo, protegerlo y pagarlo.
flowchart TB
subgraph GCP["Google Cloud - europe-west1"]
A["alpinashop-prod<br/>catalogo, GKE, Cloud SQL"]
B["alpinashop-datos<br/>BigQuery"]
end
subgraph SAB["Tienda de Sabadell - local"]
C["Servidor ERP<br/>MySQL 5.7"]
D["Terminal de almacen<br/>radiofrecuencia"]
end
subgraph SAAS["SaaS de terceros"]
E["Pasarela de pago"]
F["Correo y ofimatica"]
end
A <-->|"stock y pedidos"| C
C --- D
A --> E
B <-.->|"informes"| F
style GCP fill:#e8f0fe,stroke:#4285f4
style SAB fill:#fce8e6,stroke:#ea4335
style SAAS fill:#fef7e0,stroke:#fbbc04
AlpinaShop, sin haberlo decidido nunca, ya es híbrida y ya es multinube accidental. El trabajo de arquitectura no consiste en evitarlo, sino en gestionarlo con intención.
- Los motivos reales para no estar solo en una nube
Las presentaciones comerciales dan siempre los mismos cinco motivos. Son ciertos, pero cada uno tiene una versión honesta que conviene conocer.
Inversión previa en el centro de datos
El motivo de folleto: "aprovecha tu inversión existente".
La versión real: si hace dieciocho meses la empresa compró servidores con una amortización a cinco años, el director financiero no va a firmar tirarlos a la basura, y tiene razón. El coste de esos servidores ya está pagado: apagarlos no devuelve el dinero, solo ahorra la electricidad y el mantenimiento. Migrar antes de que se amorticen significa pagar dos veces la misma capacidad.
Es el motivo más común y el más legítimo, y también el que caduca solo: dentro de tres años esa inversión ya no existe y la conversación es distinta. Por eso muchas arquitecturas híbridas son en realidad migraciones lentas disfrazadas de estrategia permanente.
Latencia con un sistema local
El motivo de folleto: "procesa los datos donde se generan".
La versión real: hay procesos donde 30 milisegundos importan y otros donde no. Un terminal de almacén escaneando códigos de barras contra un servidor local responde en 2 ms; contra europe-west1 responderá en 15-25 ms desde Sabadell. Para escanear un paquete, ninguna de las dos molesta. Para el brazo robótico de una línea de producción que ajusta su posición mil veces por segundo, la nube no es una opción a ninguna latencia.
La pregunta correcta no es "¿hay latencia?" —siempre la hay— sino "¿qué pasa si el enlace se cae durante dos horas?". Si la respuesta es "la tienda no puede cobrar", el sistema tiene que poder funcionar sin conexión, y eso obliga a tener cómputo local. Ese, y no los milisegundos, es el argumento fuerte.
Residencia del dato y requisitos regulatorios
El motivo de folleto: "cumple con la normativa".
La versión real: hay tres niveles muy distintos que se confunden constantemente:
| Nivel | Qué exige | ¿Obliga a híbrido? |
|---|---|---|
| Residencia | Los datos se almacenan en una región concreta | No: europe-west1 o europe-southwest1 lo cumplen |
| Soberanía | Los datos están fuera del alcance legal de terceros países | A veces: existen ofertas de nube soberana |
| Control físico | Nadie salvo tú toca el hardware | Sí, por definición |
La inmensa mayoría de las empresas españolas que dicen "no podemos ir a la nube por la ley" están en el nivel 1, que se resuelve eligiendo región. El RGPD no prohíbe la nube pública: exige un tratamiento adecuado, un encargado del tratamiento con contrato, medidas técnicas y control de las transferencias internacionales. Solo sectores concretos —defensa, ciertas administraciones, sanidad en algunos supuestos— llegan al nivel 3.
Aviso. La interpretación de los requisitos regulatorios que apliquen a tus datos no es una decisión técnica. Cualquier diseño que trate datos personales, sanitarios o financieros debe revisarlo un profesional de seguridad y de cumplimiento normativo antes de ir a producción.
Evitar la dependencia del proveedor
El motivo de folleto: "no te ates a un fabricante".
La versión real, y es la más malinterpretada de las cinco: la dependencia no es binaria, tiene grados, y evitarla del todo cuesta más de lo que ahorra.
| Nivel de acoplamiento | Ejemplo | Coste de salir |
|---|---|---|
| Muy bajo | Contenedores estándar sobre Kubernetes | Días |
| Bajo | Cloud Run, Cloud Storage (API S3-compatible en otros) | Semanas |
| Medio | Cloud SQL PostgreSQL, Pub/Sub | Meses |
| Alto | BigQuery, Spanner, Vertex AI | Reescritura |
| Total | App Engine estándar clásico | Reescritura |
La estrategia sensata no es "usar solo lo portable", porque eso significa renunciar a BigQuery, que es probablemente el mejor motivo para estar en Google Cloud. La estrategia sensata es saber en qué nivel estás en cada pieza y que sea una decisión consciente. AlpinaShop está muy acoplada en analítica (BigQuery) y muy poco en la aplicación (contenedores). Está bien: la analítica se reharía en seis meses si hiciera falta, la tienda se movería en dos semanas.
Y un dato incómodo: la mayoría de empresas que montan una arquitectura multinube "para no depender de nadie" acaban dependiendo de la capa que unifica ambas nubes —que suele ser otro proveedor— y añadiendo una dependencia en lugar de quitarla.
Continuidad de negocio
El motivo de folleto: "si una nube se cae, sigues funcionando".
La versión real: las caídas totales de un proveedor son extraordinariamente raras; las caídas de una región son mucho más frecuentes, y para eso no hace falta otra nube: basta otra región. Montar multinube activo-activo para resistir una caída global de Google es pagar el doble de complejidad todo el año para cubrir un evento que quizá no ocurra nunca. Se trata con detalle en 07-06, con RTO y RPO.
- Los costes ocultos que el folleto no menciona
Cada modelo tiene un coste que no aparece en la comparativa de precios.
| Modelo | Coste evidente | Costes ocultos |
|---|---|---|
| Nube única | Facturas mensuales | Acoplamiento; poder de negociación bajo |
| Híbrido | Nube + hardware + enlaces | Dos disciplinas operativas; personal con dos perfiles; el enlace es un punto único de fallo; parcheo del hardware; guardias 24×7 propias |
| Multinube | Dos facturas | Dos IAM distintos; dos formas de red; dos modelos de facturación; egress entre nubes (caro); el equipo domina dos ecosistemas a medias en lugar de uno bien |
| Borde | Dispositivos | Despliegue físico; actualizaciones remotas; seguridad física; inventario |
El coste oculto más caro de todos es humano. AlpinaShop tiene una persona de infraestructura. Un modelo híbrido gestionado de verdad —con su malla de servicios, sus políticas replicadas y su enlace redundante— requiere que esa persona sea experta en Kubernetes, en redes empresariales, en el hardware local y en Google Cloud, y que además esté disponible cuando falle a las tres de la madrugada. Ese es el motivo por el que la mayoría de arquitecturas híbridas de pyme fracasan, y no tiene nada que ver con la tecnología.
- El caso de AlpinaShop: Sabadell, el ERP y el terminal del almacén
Pongamos el caso concreto sobre la mesa, con los datos que Marta reunió.
| Sistema | Qué es | Por qué no migra ahora |
|---|---|---|
| ERP | Aplicación de escritorio con MySQL 5.7 en un servidor de la trastienda | Licencia del fabricante atada al servidor físico; el fabricante cobra por la versión en la nube y no hay presupuesto este año |
| Terminal de almacén | Lector de radiofrecuencia que habla por la LAN con el ERP | Firmware cerrado, solo sabe hablar con una IP local |
| TPV de la tienda | Caja registradora integrada con el ERP | Debe cobrar aunque se caiga internet |
Lo que la tienda online necesita de todo eso es mucho menos de lo que parece:
- El stock real cada pocos minutos, para no vender lo que ya no hay.
- Los pedidos web volcados al ERP, para que la contabilidad cuadre.
- Nada más. Ni el catálogo de proveedores, ni las nóminas, ni el histórico de 2012.
Y esa es la observación que decide la lección entera: no hace falta unificar dos plataformas para mover dos flujos de datos. Si el requisito fuera "ejecutar las mismas aplicaciones contenedorizadas en la tienda y en la nube, con las mismas políticas y la misma malla", Anthos sería la respuesta. El requisito real es "sincronizar dos tablas y enviar unos pedidos", y eso se resuelve con un túnel y un proceso programado.
Aun así, vamos a estudiar Anthos a fondo. Porque la decisión de no usarlo solo vale si se toma sabiendo lo que se descarta.
- Qué es Anthos y en qué se ha convertido
Anthos se presentó en 2019 como la plataforma de aplicaciones de Google para entornos híbridos y multinube. Su idea central era potente y sigue siéndolo:
Si tus aplicaciones se ejecutan en Kubernetes, el sitio físico donde se ejecuta ese Kubernetes deja de importar. Google te da un plano de control único para gestionarlos todos —en GCP, en tu centro de datos, en AWS o en Azure— con la misma configuración, las mismas políticas y la misma observabilidad.
Kubernetes como denominador común. Esa es toda la tesis.
La evolución de los nombres
Aquí está la parte que confunde a todo el mundo. El nombre "Anthos" se ha ido retirando y la oferta se ha reorganizado en dos familias:
| Nombre | Época | Qué es hoy |
|---|---|---|
| Anthos | 2019-2023 | Marca original. Sigue apareciendo en documentación, certificaciones, blogs y en el temario de este curso |
| GKE Enterprise | Desde 2023 | El nivel empresarial de GKE: flotas, Config Sync, Policy Controller, Cloud Service Mesh, paneles multiclúster. Es "Anthos" convertido en una edición de GKE |
| Google Distributed Cloud (GDC) | Desde 2023 | El software y hardware de Google fuera de sus centros de datos: en tu centro de datos, en el borde, o en versiones aisladas de internet (air-gapped) para entornos soberanos |
| Cloud Service Mesh | Desde 2024 | La malla de servicios gestionada, antes "Anthos Service Mesh" y antes "Istio on GKE" |
| Anthos clusters on AWS/Azure | — | Hoy GKE Multi-Cloud: clústeres GKE gestionados por Google que corren sobre máquinas de otra nube |
La forma práctica de recordarlo:
- Si hablas de gestionar clústeres de forma unificada, el nombre actual es GKE Enterprise.
- Si hablas de hardware o software de Google corriendo fuera de Google, el nombre actual es Google Distributed Cloud.
- Si alguien dice "Anthos", se refiere a alguna de las dos y probablemente aprendió el tema antes de 2023.
En esta lección usaremos la nomenclatura actual, señalando el nombre antiguo cuando ayude a buscar documentación.
flowchart TB
A["Anthos<br/>2019-2023"] --> B["GKE Enterprise<br/>flotas, politicas, malla"]
A --> C["Google Distributed Cloud<br/>conectado, aislado, borde"]
A --> D["GKE Multi-Cloud<br/>GKE sobre AWS y Azure"]
B --> E["Cloud Service Mesh<br/>antes Anthos Service Mesh"]
- La flota (fleet): la unidad de gestión
El concepto que hay que entender antes que ningún otro es la flota.
Una flota es un grupo lógico de clústeres de Kubernetes que se gestionan juntos y que confían entre sí.
Una flota:
- Pertenece a un proyecto, llamado proyecto anfitrión de la flota (fleet host project).
- Puede contener clústeres de GKE, de GKE on-prem, de GKE Multi-Cloud, de EKS, de AKS, o cualquier clúster de Kubernetes conforme registrado con el agente
gke-connect. - Es la frontera de aplicación de las políticas, de la identidad y de la configuración.
La consecuencia más importante y menos evidente es la de los espacios de nombres de flota (fleet namespaces):
En una flota, el espacio de nombres
tiendasignifica lo mismo en todos los clústeres. Es "el equipo de la tienda", no "una carpeta dentro de un clúster concreto".
Esto se llama igualdad de espacios de nombres (namespace sameness) y tiene efectos prácticos enormes:
- Un permiso concedido sobre el espacio
tiendaa nivel de flota aplica en los diez clústeres. - Un servicio
catalogoen el espaciotiendapuede ser descubierto desde cualquier clúster de la flota. - Nadie puede crear un espacio
tiendaen otro clúster para "otra cosa": el nombre está reservado a ese equipo en toda la flota.
flowchart TB
subgraph FLOTA["Flota - proyecto alpinashop-prod"]
direction LR
subgraph C1["alpinashop-cluster (GKE, europe-west1)"]
N1["ns tienda"]
N2["ns pagos"]
end
subgraph C2["cluster-sabadell (GDC, tienda fisica)"]
N3["ns tienda"]
N4["ns pagos"]
end
end
P["Politicas y configuracion<br/>de flota"] --> N1
P --> N2
P --> N3
P --> N4
Sin flota, cada clúster es una isla con su propio RBAC, sus propias políticas y su propio criterio. Con flota, hay un modelo mental compartido. Ese es el valor real del producto, más que cualquier característica concreta.
- Los componentes, uno a uno
GKE Enterprise no es un servicio: es un conjunto de piezas que se activan por separado. Estas son, con su función exacta.
| Componente | Nombre actual | Qué hace | Sin él, ¿qué pasa? |
|---|---|---|---|
| Registro en flota | Fleet / Connect | Registra el clúster y abre un canal seguro saliente hacia Google | Cada clúster se gestiona a mano |
| Config Sync | Config Sync | Aplica en todos los clústeres la configuración declarada en un repositorio Git | La configuración se aplica con kubectl y se desvía |
| Policy Controller | Policy Controller | Rechaza los recursos que incumplen políticas (basado en Gatekeeper/OPA) | Alguien despliega un pod privilegiado y nadie se entera |
| Malla de servicios | Cloud Service Mesh | mTLS, enrutamiento, reintentos, telemetría entre servicios | Cada aplicación implementa eso por su cuenta |
| Observabilidad | Cloud Logging / Monitoring | Logs y métricas de todos los clústeres en un sitio | Un panel por clúster |
| Cadena de suministro | Binary Authorization | Solo se ejecutan imágenes firmadas y aprobadas | Cualquier imagen puede llegar a producción |
| Gestión de identidad | Workload Identity de flota | Los pods de cualquier clúster obtienen credenciales de GCP sin claves | Claves JSON repartidas |
| Panel multiclúster | Consola de GKE Enterprise | Estado, cumplimiento y coste de toda la flota | Diez pestañas abiertas |
De todos ellos, los dos que la gente adopta primero —y con razón— son Config Sync y Policy Controller. Y son también los dos que se pueden aprovechar en un solo clúster, sin híbrido de por medio.
- Config Sync: la configuración como código con GitOps
Config Sync es un agente que corre dentro del clúster y hace una sola cosa, muy bien:
Vigila un repositorio Git y garantiza que el estado del clúster coincide con lo que hay en ese repositorio. Si alguien cambia algo a mano, lo revierte.
Eso es GitOps, y merece la pena entender por qué es distinto de un pipeline de despliegue como el que AlpinaShop montó en 06-01.
| Pipeline de despliegue (Cloud Build) | GitOps (Config Sync) | |
|---|---|---|
| Dirección | Empuje: el pipeline hace kubectl apply desde fuera |
Tirón: el agente lee Git desde dentro |
| Credenciales | El pipeline necesita permisos sobre el clúster | El clúster no expone credenciales a nadie |
| Deriva | Si alguien cambia algo a mano, se queda cambiado | Se revierte en minutos |
| Clústeres nuevos | Hay que darles de alta en el pipeline | Se registran y se sincronizan solos |
| Auditoría | El historial está en el pipeline | El historial es el de Git |
La ventaja decisiva en un escenario híbrido es la tercera columna de la primera fila: el clúster de la tienda de Sabadell no necesita ser accesible desde internet. Sale él hacia Google, lee su configuración y se aplica. No hay que abrir puertos entrantes hacia la tienda, que es exactamente lo que uno no quiere hacer.
La estructura típica del repositorio, que en AlpinaShop viviría en alpinashop-infra:
alpinashop-infra/
└── config-flota/
├── cluster/ # aplica a TODOS los clusteres
│ ├── politicas/
│ │ ├── no-privilegiados.yaml
│ │ ├── solo-artifact-registry.yaml
│ │ └── etiquetas-obligatorias.yaml
│ └── rbac/
│ └── grupo-desarrollo.yaml
├── namespaces/
│ ├── tienda/
│ │ ├── namespace.yaml
│ │ ├── cuota-recursos.yaml
│ │ └── politica-red.yaml
│ └── pagos/
│ ├── namespace.yaml
│ └── politica-red.yaml
└── system/
└── reposync.yamlDos carpetas clave: cluster/ para lo que aplica a todos, y namespaces/<nombre>/ para lo que aplica a un espacio de nombres concreto en todos los clústeres de la flota. La igualdad de espacios de nombres del apartado 6 se materializa aquí.
- Policy Controller: las políticas como código
Policy Controller es la implementación gestionada de Gatekeeper, que a su vez se apoya en OPA (Open Policy Agent). Funciona como un webhook de admisión: cada vez que alguien intenta crear o modificar un recurso en el clúster, la petición pasa por él y puede ser rechazada.
Tiene dos objetos:
ConstraintTemplate: la plantilla de la regla, escrita en un lenguaje llamado Rego. Define el tipo de comprobación.Constraint: la instancia de esa plantilla con parámetros concretos y su ámbito.
Google publica una biblioteca de plantillas con más de cien reglas listas, así que en la práctica casi nunca hay que escribir Rego. Ejemplos de la biblioteca:
| Plantilla | Qué impide |
|---|---|
K8sPSPPrivilegedContainer |
Contenedores privilegiados |
K8sAllowedRepos |
Imágenes de registros no autorizados |
K8sRequiredLabels |
Recursos sin las etiquetas obligatorias |
K8sContainerLimits |
Contenedores sin límites de CPU o memoria |
K8sBlockNodePort |
Servicios de tipo NodePort |
K8sRequiredProbes |
Contenedores sin sondas de vida y disponibilidad |
Y tiene un mecanismo que hay que usar siempre al principio:
enforcementAction |
Efecto |
|---|---|
warn |
Deja pasar y avisa en la respuesta |
dryrun |
Deja pasar y registra la violación para poder medir el impacto |
deny |
Rechaza la creación del recurso |
El patrón correcto es el mismo que ya se usó con Cloud Armor en 03-05: dryrun primero, se mide una semana, y solo entonces deny. Activar una política en deny sin medir es la forma más rápida de que el equipo de desarrollo no pueda desplegar un viernes por la tarde y de que Policy Controller se desinstale el lunes.
- Ejemplo práctico: registrar
alpinashop-cluster y aplicar una política
alpinashop-cluster y aplicar una políticaVamos a hacerlo de verdad sobre el clúster que AlpinaShop ya tiene desde 02-05. Es un ejercicio útil incluso si nunca adoptas GKE Enterprise, porque Config Sync y Policy Controller funcionan en un único clúster de GKE Autopilot y aportan valor por sí solos.
Paso 1: habilitar las APIs necesarias
gcloud config set project alpinashop-prod
gcloud services enable \
gkehub.googleapis.com \
anthosconfigmanagement.googleapis.com \
gkeconnect.googleapis.comgkehub.googleapis.comes la API de flotas. "Hub" era el nombre interno original y ha quedado en la API.anthosconfigmanagement.googleapis.comgestiona Config Sync y Policy Controller (nótese el nombre antiguo, que sobrevive en la API aunque el producto se llame de otro modo).gkeconnect.googleapis.comes el canal de conexión saliente de los clústeres registrados.
Paso 2: registrar el clúster en la flota
Un clúster de GKE en el mismo proyecto que la flota se registra con una sola orden:
gcloud container fleet memberships register alpinashop-cluster \
--gke-cluster=europe-west1/alpinashop-cluster \
--enable-workload-identityExplicado pieza a pieza:
memberships registercrea una pertenencia (membership): el objeto que representa a ese clúster dentro de la flota.alpinashop-clusteres el nombre de la pertenencia. Conviene que coincida con el del clúster para no volverse loco.--gke-cluster=REGION/NOMBREidentifica un clúster de GKE. Para un clúster externo se usaría--kubeconfigy--context.--enable-workload-identityes lo que permite que los pods obtengan credenciales de Google sin ficheros de clave, exactamente igual que en 03-04. En un clúster de Autopilot ya está activo; el registro lo integra con la flota.
Comprobación:
Paso 3: activar Config Sync apuntando a alpinashop-infra
La configuración de la característica se declara en un fichero y se aplica a la flota:
# config-management.yaml
applySpecVersion: 1
spec:
configSync:
enabled: true
sourceFormat: unstructured
git:
syncRepo: https://github.com/alpinashop/alpinashop-infra
syncBranch: main
policyDir: config-flota
secretType: token
syncWait: 30
policyController:
enabled: true
templateLibraryInstalled: true
referentialRulesEnabled: true
auditIntervalSeconds: 60Campo por campo:
sourceFormat: unstructuredpermite organizar el repositorio como quieras. La alternativa,hierarchy, impone la estructura estricta que se vio en el apartado 8. Para empezar,unstructuredda menos disgustos.syncRepo/syncBranch/policyDir: repositorio, rama y subdirectorio a partir del cual se sincroniza. Todo lo que esté fuera deconfig-flotase ignora.secretType: tokenindica cómo se autentica contra GitHub. En producción se usaría una app de GitHub o, mejor,gcpserviceaccountcontra un repositorio alojado en GCP.syncWait: 30son los segundos entre comprobaciones. Treinta segundos es un buen equilibrio; bajarlo mucho solo genera llamadas a la API.templateLibraryInstalled: trueinstala las más de cien plantillas de la biblioteca de Google. Sin esto, hay que escribir el Rego a mano.auditIntervalSeconds: 60es cada cuánto Policy Controller revisa los recursos que ya existían antes de la política. Esto importa: el webhook solo ve lo nuevo; la auditoría periódica es la que descubre lo viejo que incumple.
Se aplica así:
gcloud beta container fleet config-management apply \
--membership=alpinashop-cluster \
--config=config-management.yaml \
--project=alpinashop-prodY el estado se consulta con:
Name Status Last_Synced_Token Sync_Branch Last_Synced_Time alpinashop-cluster SYNCED a3f91c2 main 2026-08-05T09:14:22Z
Last_Synced_Token es el hash del commit aplicado. Ese dato responde en un segundo a la pregunta "¿qué versión de la configuración está corriendo en este clúster?", que en un modelo de empuje suele requerir arqueología en los logs del pipeline.
Paso 4: la política de conformidad
AlpinaShop quiere garantizar algo que hasta ahora dependía de la buena voluntad: en el clúster solo se ejecutan imágenes de su Artifact Registry. Nada de docker.io/loquesea:latest.
El fichero se añade al repositorio alpinashop-infra, en config-flota/cluster/politicas/:
# config-flota/cluster/politicas/solo-artifact-registry.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
name: solo-artifact-registry-alpinashop
spec:
enforcementAction: dryrun # PRIMERO medir, despues denegar
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces:
- kube-system
- gke-system
- config-management-system
- gatekeeper-system
parameters:
repos:
- "europe-west1-docker.pkg.dev/alpinashop-prod/alpinashop/"Los detalles que importan:
enforcementAction: dryrun: durante una semana registra violaciones sin bloquear nada.excludedNamespaces: los espacios de nombres del sistema usan imágenes de Google. Si no los excluyes, rompes el clúster. Este es el error número uno con Policy Controller.parameters.reposacepta prefijos. La barra final importa: sin ella,.../alpinashop-maliciosotambién pasaría.
Y una segunda política, esta de las etiquetas que AlpinaShop lleva usando desde 01-04:
# config-flota/cluster/politicas/etiquetas-obligatorias.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: etiquetas-obligatorias-alpinashop
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups: ["apps"]
kinds: ["Deployment"]
namespaces: ["tienda", "pagos"]
parameters:
labels:
- key: "aplicacion"
- key: "equipo"
allowedRegex: "^(infra|desarrollo|datos)$"
- key: "entorno"
allowedRegex: "^(prod|dev)$"Obsérvese que allowedRegex no solo exige la etiqueta: exige que su valor sea uno de los válidos. Sin eso, alguien pone equipo: varios y la asignación de costes de 07-05 vuelve a ser inútil.
Paso 5: medir antes de denegar
Tras una semana, se consultan las violaciones registradas:
kubectl get constraint solo-artifact-registry-alpinashop -o json \
| jq '.status.violations[] | {ns: .namespace, name: .name, msg: .message}'{"ns":"tienda","name":"redis-cache-7c9f","msg":"container <redis> has an invalid image repo <docker.io/redis:7>"}
{"ns":"tienda","name":"exportador-metricas-2d1a","msg":"container <exp> has an invalid image repo <quay.io/prometheus/node-exporter>"}Dos hallazgos reales, y ninguno es un ataque: son dos imágenes públicas legítimas que alguien desplegó sin pensarlo. La respuesta correcta no es rendirse y quitar la política, sino:
- Copiar esas dos imágenes al Artifact Registry propio (que además es lo correcto por disponibilidad y por escaneo de vulnerabilidades, como se verá en 07-04).
- Actualizar los despliegues.
- Ahora sí, cambiar
dryrunpordeny, hacer commit y dejar que Config Sync lo propague.
sed -i 's/enforcementAction: dryrun/enforcementAction: deny/' \
config-flota/cluster/politicas/solo-artifact-registry.yaml
git commit -am "Policy: exigir imagenes de Artifact Registry (deny)"
git pushEn menos de un minuto, el clúster rechaza cualquier pod con una imagen ajena. Y lo importante: el cambio está en un pull request revisado, no en la memoria de nadie.
- El mallado de servicios explicado sin humo
La malla de servicios (service mesh) es la parte de GKE Enterprise que más se vende y peor se entiende. Vamos con la explicación honesta.
Qué es técnicamente
Se inyecta un proxy (Envoy) junto a cada contenedor de la aplicación —el patrón sidecar— o en cada nodo (ambient, el modo más reciente que evita el sidecar). Todo el tráfico entre servicios pasa por esos proxies. Como el proxy ve todo el tráfico y lo controla un plano de control central, se pueden hacer cosas que la aplicación no sabe hacer.
flowchart LR
subgraph P1["Pod catalogo"]
A["App catalogo"] <--> B["Proxy Envoy"]
end
subgraph P2["Pod pedidos"]
C["Proxy Envoy"] <--> D["App pedidos"]
end
B <-->|"mTLS automatico"| C
CP["Plano de control<br/>Cloud Service Mesh"] -.->|"configuracion"| B
CP -.->|"configuracion"| C
B -.->|"telemetria"| CP
C -.->|"telemetria"| CP
Qué resuelve de verdad
| Capacidad | El problema que resuelve | ¿Se puede sin malla? |
|---|---|---|
| mTLS automático | Cifrado y autenticación entre servicios sin tocar el código | Sí, pero implementándolo en cada aplicación y rotando certificados a mano |
| Autorización servicio a servicio | "Solo catalogo puede llamar a pedidos" |
Con NetworkPolicy, pero a nivel de IP, no de identidad |
| Reintentos y tiempos de espera | Reintentar el fallo transitorio sin código | Sí, con una biblioteca en cada lenguaje |
| Despliegue canario por porcentaje | Enviar el 5 % del tráfico a la versión nueva | Sí, y en Cloud Run es una bandera (07-02) |
| Telemetría uniforme | Latencia y tasa de error de cada llamada, sin instrumentar | Parcialmente, con OpenTelemetry (06-06) |
| Interruptor de circuito | Dejar de llamar al servicio que está caído | Sí, con biblioteca |
Los dos valores realmente difíciles de replicar son el mTLS automático con identidades por servicio y la telemetría uniforme sin tocar el código. El resto se consigue de otras formas, a menudo más simples.
Qué complejidad añade
Y aquí la parte que las presentaciones omiten:
- Duplicas los contenedores. Cada pod pasa a tener dos procesos. Consumo de CPU y memoria adicional del 10-30 %, y en Autopilot eso es factura directa.
- Añades un salto de red a cada llamada. Latencia adicional de entre 0,5 y 3 ms por salto, que se multiplica por la profundidad de la cadena de llamadas.
- Depuras el doble. Cuando algo falla, la pregunta pasa a ser "¿es la aplicación o es el proxy?". Los códigos de error de Envoy (
UF,UO,NR,URX) hay que aprendérselos. - Introduces conceptos nuevos:
VirtualService,DestinationRule,PeerAuthentication,AuthorizationPolicy,Gateway,Sidecar. Son seis objetos más que dominar, y su interacción no es obvia. - El orden de arranque importa. Un contenedor que llama a la red antes de que su proxy esté listo falla de formas desconcertantes.
- Actualizarla es una operación delicada, porque toca el camino del tráfico de todo lo que corre en el clúster.
La regla honesta: una malla de servicios empieza a compensar a partir de, aproximadamente, veinte servicios que se llaman entre sí, mantenidos por más de tres equipos, en más de un lenguaje. Por debajo de eso, el coste de operarla supera lo que aporta.
AlpinaShop tiene un servicio de catálogo, una función de imágenes y unos cuantos procesos por lotes. Poner una malla ahí es como montar un aeropuerto para un carril bici. No es que sea mala tecnología: es que no hay problema que resolver.
- Binary Authorization y la cadena de confianza
Binary Authorization responde a otra pregunta: ¿esta imagen concreta tiene permiso para ejecutarse en este entorno? Funciona también como control de admisión, pero en lugar de mirar la forma del recurso, comprueba firmas criptográficas.
El flujo es:
- Cloud Build construye la imagen y la publica en Artifact Registry (06-01).
- Un proceso de verificación —el escaneo de vulnerabilidades, o el paso manual de aprobación de Marta— crea un atestado (attestation): una firma que dice "esta imagen, identificada por su digest, ha pasado este control".
- Al desplegar, Binary Authorization comprueba que existen los atestados exigidos por la política. Si no, rechaza el pod.
# Politica minima: exigir atestado del atestador "aprobacion-marta" en produccion
gcloud container binauthz policy import - <<'EOF'
defaultAdmissionRule:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/alpinashop-cicd/attestors/aprobacion-marta
clusterAdmissionRules:
europe-west1.alpinashop-cluster:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/alpinashop-cicd/attestors/aprobacion-marta
admissionWhitelistPatterns:
- namePattern: europe-west1-docker.pkg.dev/alpinashop-prod/alpinashop/*
EOFDetalles importantes:
ENFORCED_BLOCK_AND_AUDIT_LOGbloquea y registra. ExisteDRYRUN_AUDIT_LOG_ONLY, que es por donde hay que empezar, igual que con Policy Controller.admissionWhitelistPatternses una lista de excepciones por patrón de nombre. Úsala con cuidado: cada excepción es un agujero permanente.- Binary Authorization no está limitado a GKE Enterprise: funciona en GKE estándar y también en Cloud Run, lo que lo hace relevante para AlpinaShop aunque descarte la flota. Se retoma en 07-04 como pieza de la cadena de suministro.
- Observabilidad unificada de la flota
Los clústeres registrados envían sus métricas y logs a Cloud Monitoring y Cloud Logging del proyecto de la flota, incluidos los que están fuera de Google Cloud. Esto significa que el panel de campaña que AlpinaShop construyó en 06-04 podría mostrar, en la misma pantalla, la latencia del catálogo en europe-west1 y la del proceso que corre en la trastienda de Sabadell.
Es una ventaja real y a menudo subestimada: en un híbrido mal montado, el 80 % del tiempo de un incidente se va en abrir tres herramientas distintas y comparar relojes que no están sincronizados.
La consola de GKE Enterprise añade además una vista de flota con:
- Estado de sincronización de cada clúster (el
Last_Synced_Tokendel apartado 10). - Porcentaje de cumplimiento de políticas y lista de violaciones.
- Versiones de Kubernetes y avisos de fin de soporte por clúster.
- Coste estimado agrupado por equipo, si las etiquetas están bien puestas.
- Modelo de licencia y coste: lo que decide en la práctica
Aquí es donde se toman las decisiones reales, y donde conviene ser muy claro.
GKE Enterprise no se factura por consumo puntual como una VM: se factura como una edición de GKE, con un precio por vCPU de los nodos de los clústeres incluidos en la flota, mensual o con compromiso anual. Google publica los precios y cambian; el orden de magnitud que hay que tener en la cabeza es:
| Concepto | Orden de magnitud |
|---|---|
| GKE Standard: plano de control | Unas decenas de euros al mes por clúster (con un clúster zonal gratuito por cuenta de facturación en el nivel gratuito) |
| GKE Enterprise: recargo | Del orden de varios euros por vCPU y mes, sobre todas las vCPU de la flota |
| Cloud Service Mesh gestionado | Incluido en la edición Enterprise |
| Google Distributed Cloud | Suscripción por nodo, más el hardware |
Verifica siempre los precios en la documentación oficial y con la calculadora de precios. Las cifras de arriba son órdenes de magnitud para razonar, no cotizaciones.
Hagamos la cuenta para AlpinaShop, que es lo que decide:
- El clúster
alpinashop-clusteres Autopilot y sostiene el catálogo con el equivalente a unas 8 vCPU en horario normal. - Un recargo del orden de 5 € por vCPU y mes son unos 40 € al mes solo de licencia, sin contar el cómputo.
- A eso habría que sumar el consumo extra de los sidecars de la malla (10-30 % más de CPU y memoria) y, si de verdad se quisiera híbrido, un clúster en Sabadell con su hardware, su suscripción y su mantenimiento.
Cuarenta euros al mes no arruinan a nadie. El problema no es el dinero: es que se paga por capacidades que no se van a usar. Y hay un coste mucho mayor escondido detrás: las horas de Marta aprendiendo, operando y depurando seis objetos nuevos de Istio para un único servicio.
- Alternativas más ligeras al híbrido completo
Entre "no hacer nada" y "adoptar GKE Enterprise" hay un espectro. Estas son las opciones intermedias, ordenadas de menor a mayor compromiso.
| Opción | Qué resuelve | Coste y complejidad |
|---|---|---|
| Cloud VPN HA + proceso programado | Conectividad privada con el sistema local y sincronización de datos | Muy bajo. Es lo que AlpinaShop necesita (07-03) |
| Pub/Sub como puente | El sistema local publica eventos y la nube los consume, sin conectividad entrante | Bajo. Excelente cuando el local puede salir a internet |
| Config Sync + Policy Controller en un solo clúster | Configuración y políticas como código, sin flota híbrida | Bajo. Aporta valor con un solo clúster |
| Config Connector | Gestionar recursos de GCP (buckets, Cloud SQL) desde manifiestos de Kubernetes | Medio. Interesante si tu equipo vive en kubectl; si vive en Terraform (06-07), no |
| Terraform multiproveedor | Gestionar GCP + otra nube + GitHub + DNS con un solo lenguaje | Bajo. AlpinaShop ya lo tiene |
| GKE Multi-Cloud | GKE gestionado por Google sobre máquinas de AWS o Azure | Alto |
| Google Distributed Cloud | Software de Google en tu hardware o en el borde | Muy alto |
Dos apuntes:
- "Cloud Run for Anthos", que aparece en documentación y exámenes antiguos, permitía ejecutar la API de Cloud Run sobre un clúster propio mediante Knative. Ha quedado en desuso a favor de Cloud Run sin más (07-02) y de la malla gestionada. Si lo ves en un temario de certificación, ya sabes de qué se hablaba.
- Config Connector merece una consideración honesta: es una alternativa real a Terraform si —y solo si— tu equipo ya trabaja íntegramente en Kubernetes. Para AlpinaShop, que acaba de invertir el módulo 6 en Terraform, añadir un segundo sistema para lo mismo sería un retroceso.
- Cuándo sí y cuándo no: la tabla de decisión
Esta es la tabla que se lleva uno de la lección.
| Situación | ¿Híbrido gestionado / GKE Enterprise? | Alternativa |
|---|---|---|
| Centro de datos con inversión sin amortizar y decenas de aplicaciones | Sí | — |
| Requisito legal de control físico del hardware | Sí, con Google Distributed Cloud | — |
| Procesos que deben seguir funcionando sin conexión (fábrica, tienda, buque) | Sí, en el borde | Cómputo local a medida |
| Más de 20 microservicios, varios equipos, varios lenguajes | Sí para la malla | — |
| Fusión de empresas: una en GCP y otra en AWS, con equipos que se mantienen | Probablemente sí | — |
| Necesito políticas de seguridad uniformes en 10+ clústeres | Sí | — |
| Un solo clúster y quiero configuración como código | No | Config Sync solo |
| Necesito leer una base de datos local desde la nube | No | Cloud VPN HA (07-03) |
| Quiero "evitar el vendor lock-in" en abstracto | No | Contenedores estándar y datos exportables |
| Un equipo de una a tres personas de infraestructura | No | La complejidad se come al equipo |
| Un solo servicio web con tráfico irregular | No | Cloud Run (07-02) |
Y la pregunta única que resuelve la mayoría de los casos:
¿Tengo cargas de trabajo ejecutándose fuera de Google Cloud que necesitan la misma gestión que las de dentro?
Si la respuesta es "no, solo necesito hablar con un sistema de fuera", no necesitas Anthos: necesitas red.
- DA-004: la decisión honesta de AlpinaShop
Marta, Dani y Lucía se sentaron con esta información y escribieron la decisión, siguiendo el mismo formato que DA-001, DA-002 y DA-003. Está en el README de alpinashop-infra, como manda la disciplina de 06-02.
DA-004 — Estrategia híbrida e integración con la tienda de Sabadell Fecha: 2026-08-05 · Autores: Marta (infraestructura), Dani (backend) · Estado: aceptada
1. Contexto. La tienda física de Sabadell ejecuta un ERP con MySQL 5.7 en un servidor local, con un terminal de radiofrecuencia y un TPV atados a él por la red local. El ERP no puede migrar este año por licenciamiento del fabricante y presupuesto. La tienda online necesita del ERP dos cosas: leer el stock cada pocos minutos y volcar los pedidos web. El equipo de infraestructura es de una persona.
2. Opciones consideradas.
| Opción | Ventaja | Inconveniente |
|---|---|---|
| GKE Enterprise con clúster en Sabadell | Gestión unificada, políticas y malla en ambos lados | Hardware nuevo en la tienda; licencia por vCPU; complejidad de malla para un servicio; una persona no puede operarlo |
| Google Distributed Cloud en la tienda | Plataforma de Google en local, soporte de Google | Coste muy superior al problema; sobredimensionado para dos flujos de datos |
| Migrar el ERP a Cloud SQL ya | Elimina el híbrido | Bloqueado por licencia del fabricante y presupuesto; el TPV debe cobrar sin conexión |
| Cloud VPN HA + sincronización programada | Coste bajo, complejidad baja, resuelve los dos flujos reales | No unifica la gestión; el ERP sigue siendo responsabilidad local |
3. Decisión. AlpinaShop no adopta GKE Enterprise ni Google Distributed Cloud. Se establece conectividad privada con la tienda mediante Cloud VPN HA (dos túneles con BGP sobre Cloud Router, detallado en 07-03) y la integración se resuelve así:
- Stock: un trabajo programado con Cloud Scheduler + Workflows (04-06) lee cada 10 minutos las tablas de existencias del MySQL de Sabadell a través del túnel y actualiza el catálogo.
- Pedidos: cada pedido web publica en el topic
pedidos-nuevos(04-04); un consumidor los inserta en el ERP. Si el enlace está caído, los mensajes esperan en la suscripción y se procesan al volver — la tienda online no se detiene porque Sabadell no esté disponible. - Sin conexión: el TPV y el terminal siguen funcionando contra el ERP local exactamente igual que hoy. No se introduce ninguna dependencia nueva de la nube en la operación de la tienda física.
4. Consecuencias.
- Positivas: coste marginal (el de dos túneles VPN); ninguna tecnología nueva que aprender; el desacoplamiento por Pub/Sub hace que un corte del enlace sea un retraso, no una caída.
- Negativas: la gestión sigue siendo doble —el ERP se parchea a mano en Sabadell— y no hay políticas uniformes entre ambos lados. Se acepta: es un servidor, no una flota.
- Se adopta parcialmente una pieza: Policy Controller en modo
dryrunsobrealpinashop-clustermientras el catálogo siga ahí, porque aporta valor con un solo clúster y sin licencia Enterprise en su nivel básico. Se revisará cuando el catálogo se mueva a Cloud Run en 07-02.
5. Revisión. Esta decisión se revisa si ocurre cualquiera de estas tres cosas: se abren dos tiendas físicas más, el ERP migra a la nube, o el número de servicios que se llaman entre sí supera la decena.
Errores Comunes y Consejos
- Confundir "híbrido" con "tener una VPN". Tener conectividad privada con un sistema local no te convierte en una arquitectura híbrida gestionada. Es bueno saberlo: probablemente no necesitas la plataforma grande.
- Adoptar la malla de servicios "porque es la buena práctica". Es una buena práctica a partir de cierta escala. Por debajo, es sobrecarga operativa pura.
- Activar Policy Controller directamente en
deny. Bloquearás despliegues legítimos el primer día.dryrununa semana, mides, corriges, y entoncesdeny. - Olvidar
excludedNamespacesen las políticas. Si la política aplica akube-system, el clúster deja de funcionar. Siempre excluyekube-system,gke-system,gatekeeper-systemyconfig-management-system. - Buscar documentación por el nombre antiguo y quedarse con instrucciones obsoletas. "Anthos Service Mesh" y "Cloud Service Mesh" son el mismo producto en dos épocas, y los comandos han cambiado. Comprueba siempre la fecha de la página.
- Creer que multinube reduce el bloqueo por proveedor. A menudo lo aumenta: añade una capa de abstracción que también es de alguien, y obliga a usar el mínimo común denominador de ambas nubes.
- Ignorar el egress entre nubes. Mover datos de GCP a AWS y viceversa se paga por gigabyte en las dos direcciones. Una arquitectura multinube "elegante" que cruce datos constantemente puede duplicar la factura. Se trata en 07-05.
- Registrar clústeres en la flota sin
--enable-workload-identity. Acabarás repartiendo claves JSON, exactamente lo que 03-04 enseñó a evitar. - Consejo: usa Config Sync aunque no vayas a ser híbrido. GitOps sobre un solo clúster ya elimina la deriva de configuración, y es de las mejoras con mejor relación valor/esfuerzo del catálogo.
- Consejo: si dudas entre híbrido y migrar, calcula la fecha de amortización del hardware. Muchas veces la respuesta correcta es "híbrido durante 18 meses y luego nube", y eso cambia por completo cuánta plataforma merece la pena montar.
- Consejo: escribe la decisión. DA-004 existe para que dentro de dos años nadie tenga que reconstruir por qué no se adoptó. Y para que, cuando se cumplan las condiciones de revisión, se revise de verdad.
Ejercicios
Ejercicio 1 — Decidir con criterio en cuatro escenarios
Para cada uno de estos casos, decide si conviene GKE Enterprise / Google Distributed Cloud, otra alternativa más ligera, o nada, y justifica en tres o cuatro líneas.
(a) Una cadena de 60 supermercados. Cada tienda tiene cajas que deben cobrar aunque internet se caiga, y un sistema de etiquetado electrónico que se actualiza cada hora. Central con equipo de 8 personas de sistemas.
(b) Una startup de 12 personas con un backend de 4 microservicios en GKE Autopilot, todo en europe-west1. El CTO quiere "estar preparados para multinube".
(c) Una aseguradora que acaba de comprar una empresa más pequeña. La compradora está en Google Cloud; la comprada tiene 40 aplicaciones en un centro de datos propio con contrato de alojamiento vigente hasta dentro de 3 años. Ambos equipos se mantienen.
(d) Un fabricante con una planta en Zaragoza. Un sistema de visión artificial inspecciona piezas a 30 imágenes por segundo y debe decidir en menos de 50 ms si rechazar la pieza. Quieren además entrenar modelos con las imágenes históricas.
Ejercicio 2 — Escribir y desplegar una política de conformidad
AlpinaShop quiere garantizar dos cosas más en alpinashop-cluster:
- Ningún contenedor puede ejecutarse como
root. - Todo contenedor debe declarar límites de CPU y memoria (para que Autopilot no facture sorpresas y para que un pod desbocado no ahogue a los demás).
Escribe los dos Constraint usando la biblioteca de plantillas (K8sPSPAllowPrivilegeEscalationContainer y K8sContainerLimits), indica dónde colocarlos en el repositorio alpinashop-infra, y describe el procedimiento completo de despliegue seguro. Explica además qué comprobarías antes de pasar a deny.
Ejercicio 3 — Rebatir la propuesta de un proveedor
Un integrador presenta a la dirección de AlpinaShop esta propuesta:
"Recomendamos desplegar Google Distributed Cloud en la tienda de Sabadell y adoptar GKE Enterprise con Cloud Service Mesh. Así unificarán la gestión, tendrán mTLS extremo a extremo entre la tienda y la nube, políticas homogéneas y observabilidad centralizada, quedando preparados para el crecimiento multinube. Inversión: 18.000 € el primer año más 900 €/mes."
Escribe la respuesta técnica de Marta a la dirección: qué partes de la propuesta son ciertas, cuáles son irrelevantes para AlpinaShop, qué preguntas hay que hacerle al integrador, y qué contrapropuesta se plantea con su coste aproximado.
Soluciones
Solución 1 — Decidir con criterio en cuatro escenarios
(a) Cadena de 60 supermercados: SÍ, y es el caso de manual.
Concurren los tres factores decisivos a la vez. Funcionamiento sin conexión: las cajas deben cobrar con el enlace caído, luego tiene que haber cómputo local por obligación, no por preferencia. Escala: 60 emplazamientos son 60 clústeres, y gestionarlos uno a uno es inviable — aquí la flota deja de ser un lujo y pasa a ser la única forma de mantener la cordura. Equipo: 8 personas pueden sostener la plataforma.
La solución es Google Distributed Cloud en cada tienda, todas registradas en una flota, con Config Sync distribuyendo la configuración desde Git. Nótese la ventaja del modelo de tirón: las 60 tiendas no necesitan ser accesibles desde fuera; salen ellas a buscar su configuración. Actualizar el software de etiquetado electrónico en 60 tiendas pasa a ser un commit.
La malla de servicios, en cambio, se evaluaría aparte y probablemente más tarde: el valor aquí está en la gestión de flota, no en el mTLS entre servicios.
(b) Startup de 12 personas: NO, con claridad.
"Estar preparados para multinube" con 4 microservicios en un solo clúster no es una arquitectura: es una preocupación sin caso de uso. El coste de la preparación se paga hoy, todos los meses, y el beneficio quizá no llegue nunca.
Lo que sí conviene hacer, y es gratis:
- Mantener las aplicaciones contenedorizadas y sin dependencias propietarias en el camino crítico, que ya lo están.
- Gestionar la infraestructura con Terraform, que es multiproveedor por diseño.
- Que los datos sean exportables (formatos estándar,
pg_dump, Parquet). - Escribir en el
READMEen qué servicios están acoplados a propósito y por qué.
Con eso, el día que haya un motivo real para moverse, la salida es de semanas. Y mientras tanto se aprovecha lo bueno de GCP en lugar de renunciar a ello. Si además quieren configuración como código, Config Sync sobre el clúster que ya tienen es la mejora con mejor retorno.
(c) Aseguradora tras una fusión: PROBABLEMENTE SÍ, y es el caso más matizado.
Concurren: inversión sin amortizar (contrato de alojamiento a 3 años, que es dinero comprometido), 40 aplicaciones (volumen que justifica una plataforma), y dos equipos que se mantienen (hay manos). Además, en un sector regulado, tener políticas de seguridad demostrablemente uniformes en ambos lados tiene valor de auditoría, no solo técnico.
La estrategia sensata es híbrido con fecha de caducidad: registrar los clústeres de ambos lados en una flota, unificar políticas con Policy Controller y observabilidad con Cloud Logging/Monitoring, y usar esos 3 años para migrar por olas las aplicaciones que tengan sentido. El error sería adoptarlo como estado permanente sin plan de convergencia; el otro error sería intentar migrar 40 aplicaciones de golpe.
Las preguntas que decidirían el detalle: ¿cuántas de esas 40 aplicaciones están contenedorizadas? Si son 3, la flota no ayuda a las otras 37 y el problema real es de modernización, no de plataforma.
(d) Fabricante con visión artificial: SÍ, pero en el borde y por un motivo distinto.
50 ms de presupuesto total para capturar, inferir y decidir hace que la nube sea imposible: solo la ida y vuelta a europe-southwest1 desde Zaragoza consume una parte significativa, y un corte de red pararía la línea de producción. La inferencia tiene que ser local, y no hay discusión posible.
Arquitectura: Google Distributed Cloud (o simplemente hardware con GPU y un runtime de inferencia) en la planta ejecutando el modelo; las imágenes y los resultados se suben de forma asíncrona a Cloud Storage; el entrenamiento se hace en Vertex AI (módulo 5) con el histórico; los modelos nuevos se despliegan a la planta desde el registro de modelos.
Es el patrón canónico del borde: inferencia abajo, entrenamiento arriba. Y obsérvese que la parte que justifica la plataforma no es la latencia en sí, sino que la línea no puede parar si se cae el enlace.
Solución 2 — Escribir y desplegar una política de conformidad
Ubicación en el repositorio. Ambos ficheros van en config-flota/cluster/politicas/, porque son políticas de clúster y no de un espacio de nombres concreto:
alpinashop-infra/config-flota/cluster/politicas/ ├── solo-artifact-registry.yaml # ya existente ├── etiquetas-obligatorias.yaml # ya existente ├── no-escalada-privilegios.yaml # nuevo └── limites-contenedor.yaml # nuevo
Política 1 — sin escalada de privilegios:
# config-flota/cluster/politicas/no-escalada-privilegios.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowPrivilegeEscalationContainer
metadata:
name: no-escalada-privilegios
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces:
- kube-system
- gke-system
- gmp-system
- gatekeeper-system
- config-management-systemPolítica 2 — límites de CPU y memoria:
# config-flota/cluster/politicas/limites-contenedor.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sContainerLimits
metadata:
name: limites-obligatorios
spec:
enforcementAction: dryrun
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["tienda", "pagos"]
parameters:
cpu: "2"
memory: "4Gi"Nótese que K8sContainerLimits hace dos cosas a la vez, y conviene saberlo: exige que los límites existan y además que no superen los valores indicados. Los valores 2 vCPU y 4Gi son el techo por contenedor; se eligen midiendo el consumo real y dejando margen, no a ojo.
Procedimiento de despliegue seguro, paso a paso:
- Rama y pull request en
alpinashop-infra. Nunca directo amain: la revisión es parte del control (06-02). - Validación local antes de subir, para no descubrir un error de sintaxis en producción:
kubectl apply --dry-run=server -f config-flota/cluster/politicas/ - Merge a
maintras revisión. Config Sync lo detecta en 30 segundos. - Verificar la sincronización, que es el paso que la gente se salta:
gcloud beta container fleet config-management status nomos status # herramienta especifica de Config Sync, mas detallada - Esperar entre 7 y 14 días en
dryrun, cubriendo al menos un ciclo completo de despliegues y los procesos por lotes nocturnos y semanales. Una semana que no incluya el cierre mensual puede ocultar un incumplimiento. - Revisar violaciones:
kubectl get constraints -o json | jq -r ' .items[] | select(.status.totalViolations > 0) | "\\(.metadata.name): \\(.status.totalViolations) violaciones"' - Corregir el origen, no la política. Si un pod necesita más de 2 vCPU legítimamente, se sube el parámetro con justificación escrita; si no lo necesita, se corrige el pod.
- Cambiar a
denyen un pull request separado del que introdujo la política, para que el cambio de modo sea visible en el historial y se pueda revertir solo.
Qué comprobar antes de pasar a deny —la lista de Marta:
- Cero violaciones durante al menos 7 días consecutivos.
- Los
CronJobsemanales y mensuales se han ejecutado al menos una vez en ese periodo. - Los espacios de nombres del sistema están excluidos y se ha verificado, no supuesto.
- Existe un procedimiento de excepción documentado: cómo pide alguien una exención, quién la aprueba y cuándo caduca.
- El procedimiento de reversión está escrito:
git revertdel commit y esperar 30 segundos. Saber que la vuelta atrás cuesta un minuto es lo que permite avanzar con tranquilidad.
Solución 3 — Rebatir la propuesta de un proveedor
Respuesta de Marta a dirección.
Qué es cierto de la propuesta. Todo lo técnico. GKE Enterprise unifica de verdad la gestión de clústeres, Cloud Service Mesh proporciona mTLS automático sin tocar el código, Config Sync y Policy Controller aplican políticas homogéneas, y la observabilidad se centraliza. El integrador no está exagerando ninguna capacidad. El problema no es que sea falso; es que responde a preguntas que no nos hemos hecho.
Qué es irrelevante para nosotros, punto por punto.
- "Unificarán la gestión": unificar la gestión de un clúster en la nube y un servidor ERP que ni siquiera ejecuta contenedores. No hay flota que gestionar; hay dos sistemas distintos que solo necesitan intercambiar dos flujos de datos.
- "mTLS extremo a extremo entre la tienda y la nube": un túnel IPsec de Cloud VPN ya cifra ese tráfico, y cuesta unos pocos euros al mes. El mTLS de la malla resuelve el cifrado entre servicios, y nosotros tenemos un servicio.
- "Políticas homogéneas": valioso a partir de varios clústeres. Con uno, Policy Controller aporta —y lo vamos a usar—, pero eso no requiere la licencia Enterprise ni el despliegue en la tienda.
- "Preparados para el crecimiento multinube": no hay ningún plan de negocio que contemple otra nube. Estaríamos pagando hoy por una opción que nadie ha pedido.
- Además, introduce un riesgo nuevo que la propuesta no menciona: hardware de Google en la trastienda de una tienda que hoy funciona con un servidor y un SAI. Eso es un elemento más que se puede romper, actualizar y quedarse sin soporte, en un sitio sin personal técnico.
Preguntas para el integrador. Son las que revelan si la propuesta se hizo para nosotros o es una plantilla:
- ¿Qué cargas de trabajo en contenedores vamos a ejecutar en la tienda de Sabadell? (Respuesta real: ninguna. El ERP es una aplicación de escritorio con MySQL.)
- ¿Cuántos servicios se llaman entre sí en nuestra arquitectura actual? (Respuesta real: prácticamente uno. La malla no tiene nada que mallar.)
- Los 900 €/mes, ¿incluyen soporte, actualizaciones del hardware de la tienda y las horas de operación, o solo la licencia?
- ¿Qué pasa el día que el catálogo se mueva a Cloud Run según DA-001? Buena parte de esta propuesta deja de aplicar, porque ya no habrá clúster que gestionar.
- ¿Quién opera esto? Somos una persona de infraestructura. ¿Se incluye servicio gestionado 24×7, y a qué precio?
- ¿Cuál es el coste y el plazo de salir de esta arquitectura si en dos años no encaja?
Contrapropuesta.
| Necesidad real | Solución propuesta | Coste aproximado |
|---|---|---|
| Conectividad privada y cifrada con Sabadell | Cloud VPN HA, dos túneles con BGP | Del orden de decenas de €/mes |
| Sincronizar stock cada 10 min | Workflows + Cloud Scheduler | Céntimos al mes |
| Volcar pedidos al ERP con tolerancia a cortes | Pub/Sub pedidos-nuevos con reintentos y DLQ |
Ya existe |
| Políticas en el clúster | Policy Controller, mientras siga habiendo clúster | Incluido en el nivel base |
| Observabilidad conjunta | Ya tenemos Cloud Monitoring y Logging (06-04, 06-06) | Ya existe |
Coste total del orden de decenas de euros al mes, frente a 18.000 € más 900 €/mes. La diferencia no se ahorra: se invierte en lo que sí nos falta —fiabilidad, SLO y recuperación ante desastres (07-06)—, que es donde hoy tenemos el riesgo de verdad.
La frase para dirección. No estamos rechazando la propuesta porque sea cara, sino porque resuelve el problema de una empresa que no somos. Si abrimos cinco tiendas más y el ERP migra a contenedores, volveremos a mirarla — y por eso queda escrito en DA-004 cuándo se revisa.
Conclusión
Has entendido el mapa completo del híbrido y el multinube, y —más importante— sabes situarte en él.
Distingues híbrido, multinube, borde y esa cuarta categoría que nadie nombra, la multinube accidental, que es la situación real de casi todo el mundo. Conoces los cinco motivos para no estar solo en una nube en su versión honesta: la inversión previa que caduca sola, la latencia cuyo argumento fuerte no son los milisegundos sino el funcionamiento sin conexión, la regulación con sus tres niveles —residencia, soberanía y control físico— que casi nadie distingue, la dependencia del proveedor que tiene grados y cuya gestión correcta es saber en cuál estás, y la continuidad que casi siempre se resuelve con otra región y no con otra nube. Y conoces los costes ocultos de cada modelo, con el más caro subrayado: el humano.
Sabes qué es Anthos y en qué se ha convertido: GKE Enterprise para la gestión unificada de clústeres, Google Distributed Cloud para el software de Google fuera de Google, GKE Multi-Cloud para clústeres sobre AWS y Azure, y Cloud Service Mesh para la malla. Reconocerás el nombre antiguo en documentación y exámenes y sabrás traducirlo.
Dominas el concepto central, la flota, y su consecuencia menos evidente y más potente: la igualdad de espacios de nombres, que convierte tienda en "el equipo de la tienda" en todos los clústeres a la vez. Conoces sus componentes uno a uno, con Config Sync —GitOps de tirón, con la ventaja decisiva de no exigir acceso entrante a los emplazamientos remotos— y Policy Controller —Gatekeeper gestionado, con su biblioteca de plantillas y el imprescindible dryrun antes de deny— como los dos que aportan valor incluso con un solo clúster.
Lo has hecho en la práctica: registrar alpinashop-cluster en una flota, activar Config Sync contra alpinashop-infra, escribir dos políticas reales —solo imágenes del Artifact Registry propio y etiquetas obligatorias con valores validados—, medir sus violaciones en dryrun, corregir el origen y solo entonces denegar. Con el error número uno señalado: excluir siempre los espacios de nombres del sistema.
Entiendes la malla de servicios sin humo: qué resuelve de verdad —mTLS automático con identidad por servicio y telemetría uniforme sin tocar el código— y qué complejidad añade —contenedores duplicados, un salto de red más, seis objetos nuevos y una depuración más difícil—, con el umbral honesto de unos veinte servicios y varios equipos por debajo del cual no compensa. Y conoces Binary Authorization como control de admisión por firma, que volverá en 07-04 y que, a diferencia de la malla, sí aplica a Cloud Run.
Sabes cómo se factura —por vCPU de la flota, como edición de GKE— y por qué el precio no es lo que decide: lo que decide es que se paga por capacidades que no se van a usar y por horas de aprendizaje que no se tienen. Conoces las alternativas ligeras, de Cloud VPN y Pub/Sub como puente hasta Config Connector, con la nota histórica de Cloud Run for Anthos. Y te llevas la tabla de cuándo sí y cuándo no con su pregunta resumen: ¿tengo cargas ejecutándose fuera de GCP que necesiten la misma gestión? Si solo necesitas hablar con un sistema de fuera, no necesitas Anthos: necesitas red.
Y tienes DA-004 escrita: AlpinaShop no adopta GKE Enterprise. Conecta con Sabadell por Cloud VPN HA, sincroniza el stock con Workflows cada diez minutos, vuelca los pedidos por Pub/Sub con tolerancia a cortes, mantiene el TPV funcionando sin conexión, adopta Policy Controller en dryrun porque aporta con un solo clúster, y deja escritas las tres condiciones que obligarían a revisar la decisión.
Queda pendiente lo que esa decisión implica en dos frentes. Uno es la red: el túnel a Sabadell, el Cloud Router, el direccionamiento que no se puede solapar y todo lo que hay que diseñar para que dos redes que nacieron por separado se hablen sin sorpresas — es 07-03.
El otro es más antiguo. Esta lección ha decidido no montar una plataforma de contenedores más grande; la siguiente hace justo lo contrario y monta una más pequeña. Porque si AlpinaShop tiene un solo servicio web, con tráfico irregular, ya contenedorizado y sin estado, la pregunta que lleva pendiente desde 02-07 tiene una respuesta que ya no se puede aplazar. DA-001 se cumple en la próxima lección: el catálogo se va a Cloud Run.
Curso de Google Cloud Platform (GCP)
Módulo 1: Introducción a Google Cloud Platform
- ¿Qué es Google Cloud Platform?
- Configuración de tu cuenta de GCP
- Descripción general de la consola de GCP
- Proyectos, jerarquía de recursos y facturación
- Regiones, zonas y modelo de responsabilidad compartida
- Cloud Shell y la CLI de gcloud
Módulo 2: Servicios principales de GCP
- Compute Engine: máquinas virtuales en Google Cloud
- Cloud Storage: almacenamiento de objetos
- Cloud SQL: bases de datos relacionales gestionadas
- App Engine: plataforma como servicio
- Google Kubernetes Engine (GKE)
- Bases de datos NoSQL: Firestore, Bigtable y Spanner
- Cómo elegir el servicio de cómputo adecuado
Módulo 3: Redes y seguridad
- Redes VPC
- Balanceo de carga en la nube
- Cloud CDN
- Gestión de identidad y acceso (IAM)
- Cloud Armor
- Secretos y cifrado: Secret Manager y Cloud KMS
- Cloud DNS, certificados TLS y publicación segura de servicios
Módulo 4: Datos y análisis
- BigQuery: el almacén de datos analítico
- Cloud Dataflow: procesamiento de datos por lotes y en streaming
- Cloud Dataproc: Spark y Hadoop gestionados
- Cloud Pub/Sub: mensajería asíncrona
- Cloud Data Fusion: integración de datos sin código
- Orquestación de pipelines con Cloud Composer y Workflows
- Gobierno del dato y cuadros de mando con Dataplex y Looker Studio
Módulo 5: Aprendizaje automático e IA
- Vertex AI: la plataforma de machine learning de GCP
- AutoML: modelos a medida sin escribir código
- TensorFlow en GCP: entrenamiento y servicio de modelos
- API de lenguaje natural
- API de visión
- IA generativa en Vertex AI: modelos Gemini y embeddings
- MLOps: del modelo al producto con Vertex AI Pipelines
Módulo 6: DevOps y monitoreo
- Cloud Build: integración continua en GCP
- Cloud Source Repositories y gestión del código fuente
- Cloud Functions: funciones sin servidor
- Cloud Monitoring (antes Stackdriver): métricas, paneles y alertas
- Cloud Deployment Manager e infraestructura como código nativa
- Cloud Logging y Cloud Trace: logs, trazas y diagnóstico
- Terraform en GCP: infraestructura como código en la práctica
Módulo 7: Temas avanzados de GCP
- Híbrido y multinube con Anthos
- Computación sin servidor con Cloud Run
- Redes avanzadas: VPC compartida, peering y conectividad híbrida
- Mejores prácticas de seguridad
- Gestión y optimización de costos
- Fiabilidad: SLO, alta disponibilidad y recuperación ante desastres
- Gobierno a escala: organización, políticas y auditoría
