Kubernetes en el mediano mercado tiene un problema que rara vez se discute con honestidad: la mayoría de clusters están sobre-aprovisionados entre dos y cuatro veces sobre la demanda real. La factura mensual crece linealmente con la organización, los workloads se programan en nodos sub-utilizados, las solicitudes de recursos se inflan por miedo a OOM, y nadie sabe cuál es la unidad económica real de cada servicio. En 2026, con el coste de compute escalando junto con la adopción de IA, esta indisciplina se ha vuelto inviable.
Este artículo presenta el marco operativo de optimización de costes de Kubernetes específicamente para organizaciones de 50 a 500 ingenieros: suficientemente grandes para que K8s tenga sentido, pero no tan grandes como para tener un equipo dedicado de plataforma con FinOps integrado.
El problema fundamental: requests vs uso real
El driver número uno de coste innecesario en Kubernetes es el desajuste entre resources.requests y consumo real. Los equipos solicitan 2 CPU y 4 GB para servicios que consumen 0.2 CPU y 800 MB en P99. El scheduler reserva la solicitud, los nodos se llenan a 30% de utilización medida, y la organización paga por capacidad que nadie usa.
La causa raíz es cultural, no técnica: los equipos sobre-solicitan por miedo. Una vez vivieron un OOMKilled en producción y desde entonces piden el doble “por si acaso”. Sin disciplina y sin observabilidad de consumo real, este patrón se acumula durante años.
- Recomendación 1: instrumente Vertical Pod Autoscaler en modo recommendation-only en todos los namespaces durante 30 días. Genera recomendaciones basadas en consumo real sin actuar.
- Recomendación 2: publique un dashboard de “requests vs uso real” por equipo. La transparencia organizacional cambia comportamiento más rápido que cualquier política.
- Recomendación 3: defina ratios objetivo (por ejemplo, request/uso P95 menor a 1.5×). Los outliers se convierten en tickets de optimización con dueño asignado.
Karpenter: la diferencia que marca
Para clusters EKS, Karpenter ha desplazado al Cluster Autoscaler tradicional con una ventaja material: provisiona nodos basándose en los requisitos exactos de los pods pendientes, no en grupos predefinidos de nodos uniformes. Esto significa diversidad de instancias automática, consolidación agresiva de nodos sub-utilizados y bin-packing más denso.
La adopción típica reduce el coste de compute entre 15% y 40% sin cambiar ninguna otra cosa, simplemente porque Karpenter elige instancias mejor ajustadas y consolida nodos huérfanos. Para clusters GKE, el equivalente nativo (Cluster Autoscaler con node auto-provisioning) ha mejorado, pero sigue siendo menos agresivo en consolidación.
Tuning crítico de Karpenter
- Consolidation policy: habilite
WhenEmptyOrUnderutilized. El default conservador deja capacidad ociosa. - Diversidad de instancias: defina NodePools con familias amplias (m, c, r) en lugar de tipo único. Karpenter elige el más barato disponible.
- Arquitectura mixta: habilite arm64 (Graviton en AWS). 20-30% más barato para workloads que toleran la arquitectura.
- Disruption budgets: configure
budgetspara evitar consolidación masiva en horas de pico.
Spot fleet design: dónde aplica y dónde no
Las instancias spot ofrecen descuentos del 60-90% comparado con on-demand. Pero spot mal aplicado degrada disponibilidad sin ahorrar dinero significativo cuando se contabilizan los costes de incidentes y de complejidad operativa.
El árbol de decisión para spot:
- 100% spot: workloads batch, jobs de CI/CD, entrenamiento de ML, procesamiento asíncrono con retry tolerable, entornos de desarrollo y staging.
- Mix spot + on-demand: servicios stateless con réplicas múltiples y SLO menor a tres nueves. Defina baseline en on-demand y elasticidad en spot.
- 100% on-demand (o reservas): servicios stateful (bases de datos, brokers de mensajería), workloads con SLO de cuatro nueves o superior, componentes de control plane críticos.
Karpenter facilita esta segmentación con NodePools diferenciados y taints. Lo que no debe hacerse: mover servicios stateful a spot por “ahorro”. El coste de una interrupción de Postgres a las tres de la mañana excede años de ahorro spot.
Idle node detection y consolidación
Aun con Karpenter, los clusters acumulan nodos sub-utilizados por DaemonSets pesados, pods con anti-affinity rígido o reservations de extension resources que el scheduler no puede consolidar. El audit periódico es necesario.
Métricas a vigilar semanalmente:
- Nodos con utilización CPU menor a 30% durante más de 24 horas continuas.
- Distribución de pods por nodo: nodos con uno o dos pods pequeños son candidatos a consolidación manual.
- DaemonSets pesados: agente de logs que consume más que la aplicación. Suele indicar mal-configuración o tooling redundante.
- Pods huérfanos: ReplicaSets de deployments eliminados, jobs completados no limpiados, pods evicted que no fueron recreados.
Namespace quotas: la primera línea de defensa
Sin cuotas por namespace, un equipo puede consumir todo el cluster con una mala configuración de réplicas. ResourceQuota y LimitRange a nivel namespace son trivial de configurar y desproporcionadamente efectivos en limitar daño.
- ResourceQuota: límite total de CPU/memoria solicitable por namespace, número máximo de pods, número máximo de PVCs.
- LimitRange: defaults para pods que no especifican requests/limits, máximos absolutos por pod individual.
- PriorityClass: los pods críticos del cluster (ingress, observability, security) tienen prioridad alta y no son evictables.
El beneficio secundario es organizacional: cada equipo ve cuánta capacidad consume y se vuelve responsable de su propio consumo. La factura cloud agregada deja de ser un misterio.
FinOps tooling: Kubecost, OpenCost, Cast.ai
El problema de atribución de costes Kubernetes está resuelto. Tres opciones principales según presupuesto y madurez:
- OpenCost (open source, CNCF): baseline gratuito. Atribución por namespace, deployment, label. Integración con Prometheus. Suficiente para organizaciones que tienen equipo capaz de operarlo.
- Kubecost (versión enterprise sobre OpenCost): UI pulida, alertas, recomendaciones automáticas de rightsizing, soporte multi-cluster. Vale el costo cuando el ahorro identificado excede la licencia.
- Cast.ai: optimización automatizada con SLAs de reducción de coste. Costo más alto pero hace el trabajo de optimización por usted. Sentido para equipos pequeños sin bandwidth FinOps dedicado.
El error a evitar: comprar la herramienta sin asignar dueño organizacional. Una herramienta de FinOps sin un humano que actúe sobre sus recomendaciones es un dashboard caro.
Cuándo abandonar Kubernetes por completo
La pregunta incómoda que pocos consultores formulan: ¿debería su organización estar en Kubernetes en absoluto? Para equipos con menos de 100 ingenieros y workloads simples, K8s puede ser una sobre-inversión. Las alternativas modernas han mejorado lo suficiente para reconsiderar.
Indicadores de que K8s no era la elección correcta
- El equipo dedica más del 20% de su tiempo a operar K8s en lugar de construir producto.
- Los workloads son una docena de servicios stateless sin necesidades especiales de orquestación.
- Los costes de plataforma exceden los costes de compute aplicativo real.
- Cada incidente toma horas porque el debug atraviesa cinco capas de abstracción K8s.
Alternativas viables en 2026: AWS Fargate o ECS para contenedores sin control plane K8s, Google Cloud Run para serverless containers con escalado a cero, Fly.io o Render para plataformas opinionated full-stack. Migrar fuera de K8s es factible si el equipo es honesto sobre el coste de mantener la plataforma.
Reserved instances y savings plans: la otra capa
Optimización de Kubernetes es una conversación; optimización de compromiso de compute es otra. Las dos son ortogonales y ambas importan. Karpenter elige el mejor instance type, pero el descuento sobre ese instance type depende de su perfil de compromiso con el proveedor cloud.
El patrón operativo en AWS para clusters con uso predecible: Savings Plans tipo Compute cubriendo el baseline (típicamente 60-70% del uso medio mensual), Karpenter operando sobre el resto en mezcla de on-demand y spot. Compute Savings Plans son flexibles (cubren EC2, Fargate y Lambda en cualquier región), un 17-27% más baratos que on-demand sin obligar a tipo de instancia específico.
- Compromiso a uno o tres años: tres años da descuento mayor pero menos flexibilidad. La regla: si la arquitectura cambiará en menos de tres años, uno año.
- Baseline conservador: comprometer al 80% del uso es arriesgado si la organización decrece o migra arquitectura. 60-70% deja margen.
- Revisión trimestral: el uso cambia, la cartera de Savings Plans debe revisarse y ajustarse.
- Equivalentes en otros clouds: Committed Use Discounts en GCP, Reserved Instances en Azure, con dinámicas similares.
Egress y networking: el coste invisible
El compute es visible; el networking es invisible hasta que aparece la factura. En clusters K8s grandes, los costes de egress entre zonas de disponibilidad, entre regiones, y hacia internet pueden representar 15-30% de la factura cloud total. Y casi nadie los optimiza porque no aparecen en Kubecost por defecto.
- Cross-AZ traffic: los pods que hablan entre sí en zonas diferentes pagan tráfico inter-AZ. Configure topology spread constraints y service mesh con preferencia same-AZ.
- NAT Gateway: tráfico outbound de pods hacia internet pasa por NAT Gateway en arquitecturas estándar. Volumen alto + precio por GB = factura sorpresa. VPC Endpoints para servicios AWS internos eliminan gran parte.
- Load Balancer pricing: ALBs y NLBs cobran por LCU consumido, no solo por hora. Tráfico TLS pesado infla LCUs. Reuse de listeners y certificados ayuda.
- Replicación de datos cross-region: útil para DR pero costoso. Revise si la frecuencia y volumen están alineados con RPO real.
La instrumentación: VPC Flow Logs habilitados y analizados en una herramienta de costo de red (vantage.sh, Sysdig, o queries directas en Athena sobre los flow logs). El primer mes de visibilidad típicamente revela uno o dos patrones de tráfico que pueden eliminarse o ruteo más eficiente que ahorra 5-10% de la factura inmediatamente.
Cuándo aplica este marco, cuándo no
Cuándo aplica: organizaciones con facturas mensuales de Kubernetes mayores a 25k USD donde nadie sabe explicar la composición; clusters con más de 50 nodos donde la utilización media es menor al 50%; equipos que han crecido en K8s sin disciplina FinOps desde el inicio.
Cuándo no aplica: clusters de desarrollo o exploratorios donde el coste absoluto es menor; organizaciones que están en proceso de migrar fuera de K8s y donde la inversión en optimización compite con la migración misma; equipos sin observability básica de Kubernetes (instale Prometheus y dashboards antes de optimizar; no puede optimizar lo que no mide).
La optimización de Kubernetes no es un proyecto único. Es una práctica continua que se vuelve parte del ciclo de vida de cada servicio. Las organizaciones que la institucionalizan reducen sus facturas 30-50% en seis meses y mantienen la disciplina indefinidamente. Las que no, descubren cada trimestre que el coste cloud subió otro 20% y nadie sabe por qué.