Published

Runbook · El coste del cluster de Trino — las palancas, MEDIDAS

Connect any source, model it as an ontology, transform it, and operationalize it, analytics, automation and machine learning, under one governed, self-hostable roof. --- Most teams stitch the...

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 a europe-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:

ConceptoCálculo€/mes
Cargo de gestión GKE$0,10/cluster·hora × 73063,00
2 × n2-standard-2 on-demand2 × 0,093776 €/h × 730136,92
2 × disco de arranque 100 GB pd-balanced200 GB × 0,087817,56
Cloud NAT + egresspor 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 igual14,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:

FamiliaCore on-demandCore SpotahorroRAM on-demandRAM Spot
N2 (la nuestra)0,0305240,007031⭐ 77,0 %0,0040910,000943
T2D (AMD)0,0265560,00874367,1 %0,0035590,001171
C4A (ARM Axion)0,0298280,01017465,9 %0,0033930,001158
N2D (AMD)0,0265560,01210554,4 %0,0035590,001622
E20,0210610,01070949,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.sh ya usa n2 por 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áquinaon-demandSpotse 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 FTEcada desalojo mata la query. Trino sin FTE no reintenta tareas
FTE (F5) y luego Spotel 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-pool on-demand (sistema + coordinador) y workers-pool Spot.
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 vuelosiguen — Trino no habla con la API de Kubernetes para servir
Los pods ya programadossiguen corriendo
Desplegar, escalar, kubectlno funcionan durante la ventana
El autoescaladorno 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
trabajando3 (techo 4)≈ 297 (≈ 370)
suspendido2, 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-dns corre con 2 réplicas y anti-afinidad
— no pueden compartir nodo, así que
hay un n2-standard-2 entero 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 0 en el autoescalador no vale para el pool de sistema: los pods de kube-system necesitan 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 antesdespués
nodo A1674m (86 %)984m (50 %)
nodo B1576m (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 reposocon F1 encima
antes2 nodos3
ahora1 nodo2

−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 mirando Allocated resources de 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: requests bajos,
limits holgados. 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 mira requests, no uso — por eso una reserva fantasma cuesta nodos reales.

⚠️ Y esto NO se le aplica a Trino. Un motor con requests != limits es Burstable
y puede ser desalojado bajo presión de memoria del nodo. Para Trino, requests =
limits y QoS Guaranteed. 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 exceeded

Y la cuota era ésta:

SSD_TOTAL_GB     usage 202     limit 250

pd-balanced cuenta 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 usadonodos que caben
antes (100 GB/nodo)202 / 2502
ahora (50 GB/nodo)102 / 2505

Ejecutado recreando el pool (main-pool-2main-pool-3), y el orden lo impuso la
propia cuota: no cabía crear el pool nuevo antes de encoger el viejo (202 + 50 = 252

250, se pasaba por 2 GB). ⇒ bajar main-pool-2 a 1 nodo → crear main-pool-3 con 2
nodos de 50 GB → borrar el viejo. Después, TriggeredScaleUp 2->3 a 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:

  1. 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.
  2. 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
AutopilotEl 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 PrometheusFue 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ónLa 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 defectoOptimizado
Cargo de gestión63,00 € (regional)0 € (zonal, free tier)P2
Coordinador136,91 € (on-demand)136,91 € (on-demand — no se toca)
4 workers n2-standard-81.095,32 € (on-demand)252,36 € (Spot)P1
Discos (5 × 100 → 5 × 50 GB)43,90 €21,95 €P5
TOTAL1.339,13 €/mes411,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
.

PalancaQué la desbloquea DE VERDAD
P1 · Spot843 €cuota PREEMPTIBLE_CPUS — hoy 0, y en trial no se concede
P2 · zonal63 €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ónAhorroCuándo
P4 · right-sizing de los operadores68 €/meshecho 2026-08-06
🔜P3 · apagar/escalar a 0 entre sesioneshasta 76 % del cómputoya, cada día
P5 · disco 100 → 50 GB9 €/mes + desbloquea F5hecho 2026-08-07 — main-pool-3. Era el bloqueante, no la propina
P2 · recrear el cluster como zonal63 €/mescon la próxima recreación — no antes de F1, para no mezclar variables
Snapshot + borrar el disco de om-carbon-0110-12 €/mesdespués de F8
P1 · pool de workers en Spot77 % de los workers🔴 BLOQUEADA: PREEMPTIBLE_CPUS = 0. FTE (F5·a) ya está cerrada; lo que falta es salir del trial, no ingeniería
P6 · CUDs28-46 % del on-demandcon 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.