Runbook · El coste del cluster de Trino — las palancas, MEDIDAS
Compañero de trino-absorcion.md. Aquel dice cómo levantar el
motor; éste, cuánto cuesta y qué lo baja. Se escribe ahora, con F0 cerrado y F1 sin
empezar, porque las dos palancas grandes son irreversibles en caliente (la
regionalidad del cluster y la familia de máquina de un pool) y elegirlas tarde
significa recrear.⚠️ Todos los precios de este documento están MEDIDOS, no copiados de una web:
salen del Cloud Billing Catalog API de la propia cuenta
(services/6F81-5844-456A/skus,currencyCode=EUR, filtrado aeurope-west1),
consultado el 2026-08-06. Son precios de lista: no incluyen el sustained use
discount que GCP aplica solo a N2 (hasta ~20 % si la instancia corre el mes entero),
así que la factura real de on-demand es algo menor que la de las tablas.Lo marcado
[confirmar]cambia con el tiempo y se re-mide antes de decidir.
1 · La factura de HOY, sumando
Medido en el proyecto trino-k8s el 2026-08-06, con F0 terminado y Trino todavía sin
desplegar:
| Concepto | Cálculo | €/mes |
|---|---|---|
| Cargo de gestión GKE | $0,10/cluster·hora × 730 | 63,00 |
2 × n2-standard-2 on-demand | 2 × 0,093776 €/h × 730 | 136,92 |
2 × disco de arranque 100 GB pd-balanced | 200 GB × 0,0878 | 17,56 |
| Cloud NAT + egress | por VM·hora + GB procesados | [confirmar] ~5-15 |
| TOTAL | ≈ 217-230 €/mes |
Actualización del mismo día: tras el right-sizing de P4 el cluster bajó a un solo
nodo, así que la factura en reposo es hoy ≈ 140 €/mes (63 + 68,46 + 8,78). El
segundo nodo lo levantará el autoescalador cuando F1 despliegue Trino.
Y fuera de este proyecto, un cargo que nadie está mirando:
| €/mes | ||
|---|---|---|
Disco de om-carbon-01 (160 GB pd-balanced, primeval-rain-…) | la VM está TERMINATED desde el 2026-08-05; el disco se sigue cobrando igual | 14,05 |
⭐ Un disco no deja de costar porque su VM esté apagada. Es el cargo huérfano
clásico, y aquí está vivo: pagamos 14 €/mes por el disco de una máquina parada.
No se puede borrar sin más — dentro vive el Postgres de OpenMetadata con toda la
metadata ingerida. La salida es snapshot y borrar el disco: un snapshot cobra sólo
el espacio usado y comprimido, así que baja de ~14 € a ~2-4 €/mes, y restaurarlo es un
comando. Se hace cuando F8 haya repuntado la ingesta, no antes.
2 · Los precios unitarios, medidos — y la sorpresa
EUR/hora, europe-west1, precio de lista, 2026-08-06:
| Familia | Core on-demand | Core Spot | ahorro | RAM on-demand | RAM Spot |
|---|---|---|---|---|---|
| N2 (la nuestra) | 0,030524 | 0,007031 | ⭐ 77,0 % | 0,004091 | 0,000943 |
| T2D (AMD) | 0,026556 | 0,008743 | 67,1 % | 0,003559 | 0,001171 |
| C4A (ARM Axion) | 0,029828 | 0,010174 | 65,9 % | 0,003393 | 0,001158 |
| N2D (AMD) | 0,026556 | 0,012105 | 54,4 % | 0,003559 | 0,001622 |
| E2 | 0,021061 | 0,010709 | 49,2 % | — | — |
🔴 La trampa: en Spot, N2 es la MÁS barata — al revés que en on-demand
En on-demand, N2D es un 13 % más barata que N2 (0,026556 vs 0,030524), y de ahí
sale la intuición habitual de «para ahorrar, AMD». En Spot se invierte: N2 sale a
0,007031 y N2D a 0,012105 — N2D cuesta un 72 % MÁS que N2.Quien elija la familia del pool de workers mirando la tabla de on-demand —que es la que
sale en todas partes— paga casi el doble en el sitio donde iba a estar el grueso
del gasto. El descuento de Spot no es un porcentaje fijo: es un precio propio por
familia, y hay que mirarlo por separado.(Y tiene una consecuencia buena:
carbon-compute.shya usan2por defecto, elegida
por inventario para esquivar el stockout. Resulta ser también la correcta para Spot.)
Coste mensual por nodo (730 h), calculado con esos unitarios:
| Máquina | on-demand | Spot | se ahorra |
|---|---|---|---|
n2-standard-2 (2 vCPU / 8 GB) | 68,46 € | 15,77 € | 52,69 € |
n2-standard-4 (4 vCPU / 16 GB) | 136,91 € | 31,54 € | 105,37 € |
n2-standard-8 (8 vCPU / 32 GB) | 273,83 € | 63,09 € | 210,74 € |
Otros unitarios medidos: pd-balanced 0,0878 €/GB/mes · pd-ssd 0,1492 · regional
balanced 0,1756 (el doble que zonal — no usar discos regionales para nodos sin estado).
3 · Las palancas, por euros ahorrados
⭐ P1 · Los workers en Spot — la grande, y va DESPUÉS de FTE
⛔ MEDIDO 2026-08-07 · P1 ESTÁ BLOQUEADA, y no por FTE
PREEMPTIBLE_CPUS usage 0 limit 0 (europe-west1, trino-k8s)Los Spot VM consumen la cuota
PREEMPTIBLE_CPUS, y la nuestra es CERO. No es que
sobre poca: no hay ninguna. Y la causa es el cabo suelto nº 4 del §F0 del runbook, que
estaba anotado sin conectarlo con esto: la cuenta está en trial, y Google no
concede cuota de preemptible/Spot a cuentas de prueba — la ampliación se deniega hasta
convertirla en de pago.⇒ La palanca más grande de todo este documento no la desbloquea terminar F5. La
desbloquea una decisión de facturación. F5·a (FTE) se cerró el 2026-08-07 con su
control negativo, y Spot sigue siendo imposible.Lo que sigue —el orden FTE→Spot y el precio por familia— es correcto y se aplica el
día que haya cuota. Pero el prerrequisito de P1 no es FTE: es la cuota, y eso no
estaba escrito.
El runbook ya lo apunta (§F5). Aquí está el número: con la flota de F6, los workers son el 80-90 % de la factura, y Spot les quita el 77 %.
Pero el orden no es negociable, y es lo único que hace segura esta palanca:
| ❌ | Spot antes de FTE | cada desalojo mata la query. Trino sin FTE no reintenta tareas |
| ✅ | FTE (F5) y luego Spot | el desalojo cuesta el reintento de una tarea, no la query |
Y hay un número que lo hace urgente: la tasa de preemption medida de n2-standard en
2026 llegó al 52-64 % en ventanas de dos días. Eso es un worker desalojado la mitad de
los días. Con FTE es una molestia; sin FTE es un motor que no sirve.
⛔ El coordinador NUNCA va en Spot. Nunca.
Es el error que anula todo lo demás. FTE protege contra la pérdida de un worker,
no del coordinador: si desalojan al coordinador, se caen todas las queries del
cluster a la vez, las tolerantes a fallos incluidas, porque él es quien las está
coordinando. Se ahorrarían 15 €/mes y se compraría una caída completa cada pocos días.⇒ Dos pools:
main-poolon-demand (sistema + coordinador) yworkers-poolSpot.
Es exactamente lo que el runbook §F0 ya anticipa —«los workers de Trino van en su
propio pool, con máquinas mayores y Spot»— y ahora tiene precio.
Y una segunda regla, de disponibilidad: un pool de Spot de una sola familia y una
sola zona desaparece entero cuando esa combinación se queda sin inventario. Se mitiga
con varias familias (n2, t2d) y varias zonas — el mismo stockout que ya costó una
noche en F0, ahora con la factura de por medio.
⭐ P2 · Cluster zonal en vez de regional — 63 €/mes, el 29 % de la factura de hoy
El free tier de GKE son $74,40/mes de crédito, y NO cubre clusters regionales. Confirmado en la doc de Google y en fuentes independientes: los créditos «se aplican sólo a clusters zonales y Autopilot … no al cargo de cluster de los clusters Regionales». El cargo es el mismo ($0,10/cluster·hora) en los dos; lo que cambia es que en uno lo perdona el free tier y en el otro no.
⇒ Un cluster zonal cuesta 0 € de gestión. El nuestro cuesta 63 €/mes.
Qué se compra con esos 63 €: el plano de control replicado. Y qué se pierde al soltarlo, dicho con precisión — porque suele exagerarse:
| Con control plane zonal caído (upgrade, mantenimiento, fallo de zona) | |
|---|---|
| Las queries en vuelo | siguen — Trino no habla con la API de Kubernetes para servir |
| Los pods ya programados | siguen corriendo |
Desplegar, escalar, kubectl | no funcionan durante la ventana |
| El autoescalador | no funciona ⇒ un pico de carga no añade workers |
La decisión de F0 fue deliberada («se acierta lo irreversible y se deja barato lo reversible») y no era mala: la regionalidad no se puede cambiar sin recrear el cluster. Pero el precio de ese acierto es 63 €/mes durante toda la fase de construcción, cuando lo que sobra es exactamente la tolerancia a que el control plane parpadee un rato.
⇒ Recomendación: zonal mientras se construye (F1-F7), regional cuando haya SLA. Y
recrear el cluster es barato precisamente porque no tiene estado y porque está en
código: carbon-compute.sh cambiando --region por --zone. [confirmar] que el free
tier no está ya consumido por otro cluster de la cuenta — es uno por cuenta de
facturación, no por proyecto.
⭐ P3 · Apagar lo que no se usa — la que más ahorra mientras se construye
Ya está escrita en carbon-compute.sh («su forma barata de existir es borrarlo cuando
no se usa») y merece número: si el cluster vive 8 h al día × 5 días en vez de 24×7,
son ~24 % de las horas ⇒ la parte de cómputo baja un 76 %.
Es la palanca de mayor efecto hoy, y la única que no depende de ninguna fase futura. Sus dos formas:
- Borrar el cluster entre sesiones — máximo ahorro (también el cargo de gestión), y
reconstruir es un comando. Lo que hay que rehacer es el operador (
stackable-operators.sh) y los CR.
🔴 MEDIDO 2026-08-07 · el 76 % es de borrar, no de suspender — y el suelo NO es cero
Con
infra/gke/trino-suspend.sh off(F5·b1,clusterOperation.stopped), dos ciclos
completos:
nodos €/mes de tasa trabajando 3 (techo 4) ≈ 297 (≈ 370) suspendido 2, y en otro ciclo 1 ≈ 224 (≈ 151) ⇒ la suspensión ahorra 73 €/mes (25 %), o 146 (49 %) si cae a un nodo. A ritmo real
(~76 % de las horas suspendido) son ~55-111 €/mes, no el 76 % del cómputo.⭐ Y el motivo principal no estaba escrito: el suelo oscila entre 1 y 2 nodos porque
kube-dnscorre con 2 réplicas y anti-afinidad — no pueden compartir nodo, así que
hay unn2-standard-2entero sosteniendo un pod de DNS. Es un lazo con histéresis
(bajó a 1 en un ciclo y se quedó en 2 en el siguiente), no un número fijo. A eso se
suman los 63 €/mes de gestión y el NAT+IP, que la suspensión no toca.⇒ Las dos formas de P3 no son «más ahorro / menos ahorro»: son dos palancas con dos
precios. Suspender cuesta 330 s de despertar y da el 25-49 %. Borrar da el 76 % y
cuesta rehacer operadores y CRs. Este epígrafe las tenía juntas.
- Escalar el pool a 0 nodos — conserva el cluster y los CRDs, sigue pagando la
gestión. Menos ahorro, cero reconstrucción:
⚠️
gcloud container clusters resize trino-compute-clone --node-pool main-pool-2 \ --num-nodes 0 --region europe-west1 --quiet--min-nodes 0en el autoescalador no vale para el pool de sistema: los pods dekube-systemnecesitan dónde vivir, y sin nodo el autoescalador no puede ni arrancar. Sí vale —y es lo correcto— para el pool de workers de Trino, que es donde el scale-to-zero tiene sentido de verdad.
P4 · Right-sizing — ✅ HECHO el 2026-08-06, y ahorró 68 €/mes
Los cuatro operadores de Stackable reservaban 1500m de CPU (el 39 % del cluster) y
usaban 7m. commons-operator pedía 1024Mi y usaba 5Mi. Con eso, el coordinador y el
worker de F1 no cabían en los dos nodos ya pagados y habrían disparado un tercero.
Dimensionados en infra/gke/stackable-operators.sh:
| CPU reservada antes | después | |
|---|---|---|
| nodo A | 1674m (86 %) | 984m (50 %) |
| nodo B | 1576m (81 %) | 1256m (65 %) |
⭐ Y aquí pasó algo que merece ser la lección de esta sección
Liberar 1010m no dejó 1010m libres. Dejó el nodo A al 26 % de utilización, y el
autoescalador lo retiró; el nodo B absorbió sus pods y volvió a 81 %. La CPU
liberada no se quedó en la mesa: se convirtió en un nodo menos.
en reposo con F1 encima antes 2 nodos 3 ahora 1 nodo 2 ⇒ −68,46 €/mes con Trino encima, y otros −68,46 €/mes mientras no lo esté.
La lección, que se aplica a toda la sección P4: en un cluster con autoescalado, el
right-sizing no se cobra en «CPU libre» sino en nodos que no existen. Medir el
efecto mirandoAllocated resourcesde un nodo subestima el ahorro o lo hace
desaparecer —el nodo superviviente vuelve a marcar 81 %, igual que antes— cuando en
realidad se acaba de eliminar una máquina entera. El KPI correcto es el número de
nodos, no el porcentaje por nodo.
El criterio, que se reutiliza en cada operador que se instale:
requestsbajos,
limitsholgados. Un controlador duerme el 99 % del tiempo y despierta a reconciliar;
necesita poder usar CPU en el pico, no tenerla reservada mientras duerme. Y el
scheduler mirarequests, no uso — por eso una reserva fantasma cuesta nodos reales.⚠️ Y esto NO se le aplica a Trino. Un motor con
requests != limitsesBurstable
y puede ser desalojado bajo presión de memoria del nodo. Para Trino,requests=
limitsy QoSGuaranteed. La regla es de controladores, no universal.
⭐ P5 · El disco de arranque: 100 GB → 50 GB — 🏁 HECHO 2026-08-07, y NO por los 9 €
🔴 P5 no ahorraba 9 €/mes: era el bloqueante de F5, y estaba agendada como propina
Al intentar levantar el 2º worker que exige el gate de FTE, el autoescalador contestó:
Warning FailedScaleUp cluster-autoscaler Node scale up in zones europe-west1-b … failed: GCE quota exceededY la cuota era ésta:
SSD_TOTAL_GB usage 202 limit 250⭐
pd-balancedcuenta contra la cuota de SSD. Dos nodos × 100 GB = 200; un tercero
pide 302 > 250. El cluster estaba a un nodo de su techo, y el techo no era dinero: era
cuota.
SSD usado nodos que caben antes (100 GB/nodo) 202 / 250 2 ahora (50 GB/nodo) 102 / 250 5 Ejecutado recreando el pool (
main-pool-2→main-pool-3), y el orden lo impuso la
propia cuota: no cabía crear el pool nuevo antes de encoger el viejo (202 + 50 = 252250, se pasaba por 2 GB). ⇒ bajar
main-pool-2a 1 nodo → crearmain-pool-3con 2
nodos de 50 GB → borrar el viejo. Después,TriggeredScaleUp 2->3a la primera.La lección para este documento entero: una palanca valorada sólo en euros puede
estar bloqueando una fase. El orden de §5 estaba ordenado por ahorro, y P5 iba de las
últimas — cuando era la que abría la puerta.
El texto original (correcto en su cifra, equivocado en su prioridad):
100 GB por nodo es el default del script y es generoso: un nodo de Kubernetes guarda el SO (Container-Optimized OS) y las imágenes. Con 50 GB sobra para Trino, y con 30 GB para el pool de sistema. A 0,0878 €/GB/mes, bajar los dos nodos de 100 a 50 GB son 8,78 €/mes; con la flota de F6, proporcionalmente más.
⚠️ No se cambia en caliente — el disco de arranque se fija al crear el pool. Va junto con P1/P2, en la misma recreación.
P6 · CUDs — reales, pero hoy no
Los Compute Flexible CUDs (los de Autopilot ya no se venden desde 2025) dan del orden del 28 % a 1 año y ~46 % a 3 años, y se combinan con Spot sólo parcialmente — el compromiso cubre on-demand, no el precio Spot.
No se compran ahora, y por dos razones que no son técnicas:
- La cuenta está en trial (87 días desde el 2026-08-05). Comprometer 1-3 años de gasto antes de saber el tamaño de la flota es comprar la respuesta antes de la pregunta.
- El consumo aún no es estable. Un CUD sobredimensionado se paga entero aunque no se use — es lo contrario de todo lo demás en este documento.
⇒ Se revisa cuando F6 haya fijado el tamaño de la flota y haya tres meses de consumo medido. Y el candidato natural es el coordinador (on-demand y siempre encendido), no los workers.
P7 · Lo que NO es palanca, y conviene no perseguir
| Por qué no | |
|---|---|
| Autopilot | El runbook ya lo descarta por arquitectura (no controlas la colocación ⇒ no hay anti-afinidad real, y «nunca dos pods de Trino en el mismo host»). Y en coste tampoco gana: en Autopilot pagas por los requests de los pods, así que los 1500m fantasma de P4 se habrían facturado enteros |
| Managed Prometheus | Fue acusado en el runbook de haber comprado el 2º nodo. Medido: pide 11m de CPU en total. No es el problema — lo era Stackable (P4). Apagarlo ahorraría céntimos y costaría la observabilidad |
Bajar a pd-standard (HDD) | Ahorra ~4 €/mes por nodo y penaliza el arranque y el pull de imágenes en cada escalado. carbon-compute.sh eligió pd-balanced a propósito |
| Cambiar de región | La región la fija la latencia contra R2 y el exchange de FTE, no el precio. Es una decisión de arquitectura ya tomada |
4 · A dónde se llega: el 80 %, con números
Escenario de la flota de F6 —1 coordinador n2-standard-4 + 4 workers n2-standard-8—
comparando como se construiría por defecto contra aplicando P1+P2+P3+P5:
| Por defecto | Optimizado | ||
|---|---|---|---|
| Cargo de gestión | 63,00 € (regional) | 0 € (zonal, free tier) | P2 |
| Coordinador | 136,91 € (on-demand) | 136,91 € (on-demand — no se toca) | ⛔ |
4 workers n2-standard-8 | 1.095,32 € (on-demand) | 252,36 € (Spot) | P1 |
| Discos (5 × 100 → 5 × 50 GB) | 43,90 € | 21,95 € | P5 |
| TOTAL | 1.339,13 €/mes | 411,22 €/mes | −69 % |
Y con P3 encima —el pool de workers a cero fuera de las horas de carga, que es para lo que existe el autoescalado por cola de F5— los workers dejan de contarse 730 h/mes. A 12 h/día laborable (~36 % de las horas), los 252,36 € bajan a ~91 € y el total a ≈ 250 €/mes: un 81 % menos.
El 80 % existe, y sale de tres palancas, no de veinte: Spot en los workers (P1),
el cargo de gestión (P2) y apagar lo que no se usa (P3). Todo lo demás de este
documento son decenas de euros; éstas son centenares.Y las tres tienen un prerrequisito común que no es de coste: P1 exige FTE (F5),
y P3 exige el autoescalado por cola (F5). ⇒ F5 no es sólo la fase de
resiliencia: es la que desbloquea el 80 % del ahorro. Vale la pena saberlo al
priorizar, porque hoy está listada como una fase intermedia más.⛔ CORREGIDO 2026-08-07 — el 80 % tiene un prerrequisito ANTERIOR a F5
Con F5·a (FTE) ya cerrada y verificada, Spot sigue siendo imposible:
PREEMPTIBLE_CPUS = 0/0. ⇒ De las tres palancas del 80 %, P1 (los 843 € de los
workers, o sea el grueso) no la desbloquea F5 sino salir del trial.
Palanca € Qué la desbloquea DE VERDAD P1 · Spot 843 € ⛔ cuota PREEMPTIBLE_CPUS— hoy 0, y en trial no se concedeP2 · zonal 63 € recrear el cluster — nada más P3 · apagar / scale-to-zero ~160 € F5·b (KEDA), que sigue pendiente La frase «F5 desbloquea el 80 %» seguía siendo verdad como dependencia lógica y
era falsa como plan: se puede terminar F5 entera y no cobrar la parte grande.
Es el mismo error de encuadre que P5 en sentido contrario — allí una palanca barata
escondía un bloqueante, y aquí una fase cara esconde que el bloqueante está fuera.
5 · Qué hacer, y cuándo
| Acción | Ahorro | Cuándo | |
|---|---|---|---|
| ✅ | P4 · right-sizing de los operadores | 68 €/mes | hecho 2026-08-06 |
| 🔜 | P3 · apagar/escalar a 0 entre sesiones | hasta 76 % del cómputo | ya, cada día |
| ✅ | P5 · disco 100 → 50 GB | 9 €/mes + desbloquea F5 | hecho 2026-08-07 — main-pool-3. Era el bloqueante, no la propina |
| ⬜ | P2 · recrear el cluster como zonal | 63 €/mes | con la próxima recreación — no antes de F1, para no mezclar variables |
| ⬜ | Snapshot + borrar el disco de om-carbon-01 | 10-12 €/mes | después de F8 |
| ⛔ | P1 · pool de workers en Spot | 77 % de los workers | 🔴 BLOQUEADA: PREEMPTIBLE_CPUS = 0. FTE (F5·a) ya está cerrada; lo que falta es salir del trial, no ingeniería |
| ⬜ | P6 · CUDs | 28-46 % del on-demand | con 3 meses de consumo estable y fuera del trial |
⚠️ Nada de esto se hace hoy salvo P3. El runbook tiene una regla —una variable por
fase— y F1 responde a «¿funciona el motor, cifrado, en nuestro cluster?». Meter una
recreación del cluster por delante convierte cualquier fallo de F1 en cuatro causas
candidatas. P4 se hizo hoy porque era el bloqueante de F1, no porque tocara.
6 · Lo que este runbook NO hace
- No dimensiona la flota. Los números de §4 son un ejemplo con máquinas plausibles, no un plan de capacidad. El tamaño sale de una prueba de carga.
- No mide el egress ni el NAT. Con Trino leyendo R2 desde
europe-west1, el tráfico de salida puede acabar siendo una línea relevante de la factura, y hoy no está medida. Se mide cuando F2 conecte el catálogo real.[confirmar] - No cubre el coste del exchange de FTE. El bucket de GCS de F5 cobra almacenamiento y operaciones; con lifecycle corto es barato, sin lifecycle crece sin techo. Se dimensiona en F5, con el bucket delante.