<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cncf on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/cncf/</link><description>Recent content in Cncf on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sun, 14 Jun 2026 02:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/cncf/index.xml" rel="self" type="application/rss+xml"/><item><title>OpenCost a fondo: cómo se asigna el coste de GPU en Kubernetes</title><link>https://blog.lo0.es/posts/opencost-cost-allocation-kubernetes/</link><pubDate>Sun, 14 Jun 2026 02:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/opencost-cost-allocation-kubernetes/</guid><description>&lt;blockquote>
&lt;p>Notación: importes en &lt;strong>euros (N €)&lt;/strong>, decimales con coma. Referencias europeas (proveedor
OVH entre los soportados). No se usa el símbolo de dólar (en este sitio es delimitador de
fórmula).&lt;/p>
&lt;/blockquote>
&lt;h2 id="qué-cubre-este-artículo">Qué cubre este artículo&lt;/h2>
&lt;p>Segundo artículo del track de &lt;strong>FinOps&lt;/strong> (A2), y primer deep dive de herramienta. En la
&lt;a href="https://blog.lo0.es/posts/finops-gpu-llm-frameworks-estado-del-arte/">introducción de FinOps&lt;/a> se vio que
OpenCost es el estándar CNCF de asignación de coste; aquí se abre la caja: &lt;strong>cómo&lt;/strong> asigna el
coste por dentro, de dónde saca los datos, cómo se configuran los precios on-prem en euros,
qué expone su API, y dónde están las trampas. Entender la mecánica importa porque &lt;strong>define lo
que cualquier herramienta encima (incluido Kubecost) puede y no puede hacer&lt;/strong>, y porque un
precio base mal puesto invalida todo el reparto. Sin recomendaciones; solo la mecánica y la
metodología.&lt;/p>
&lt;hr>
&lt;h2 id="qué-es-opencost">Qué es OpenCost&lt;/h2>
&lt;p>OpenCost es un proyecto &lt;strong>vendor-neutral, Apache 2.0&lt;/strong>, originalmente construido por Kubecost
y donado a la &lt;strong>CNCF&lt;/strong> (proyecto en incubación). Es una &lt;strong>capa de asignación de coste&lt;/strong> para
Kubernetes: lee el uso de recursos del cluster, lo cruza con un precio, y reparte el coste
por las dimensiones de Kubernetes hasta el contenedor (&lt;a href="https://github.com/opencost/opencost">OpenCost · GitHub&lt;/a>).
Soporta precios dinámicos vía las APIs de facturación de AWS, Azure y GCP, &lt;strong>y precios
personalizados para clusters on-prem&lt;/strong> (&lt;a href="https://opencost.io/docs/configuration/">OpenCost · configuración&lt;/a>).&lt;/p>
&lt;p>Lo que &lt;strong>no&lt;/strong> es: no es un optimizador, ni un sistema de gobierno, ni una herramienta de unit
economics de producto. Es la pieza que responde &amp;ldquo;¿cuánto cuesta cada namespace/pod/equipo?&amp;rdquo;,
y deja el resto a las capas de arriba. Por eso es el cimiento del track de FinOps: sin
asignación correcta, no hay coste por token ni modelo TCO que valga.&lt;/p>
&lt;hr>
&lt;h2 id="el-modelo-de-coste-asignación-a-nivel-de-nodo">El modelo de coste: asignación a nivel de nodo&lt;/h2>
&lt;p>La clave de OpenCost es que el modelo trabaja &lt;strong>a nivel de nodo&lt;/strong>. Parte de la &lt;strong>capacidad de
recursos&lt;/strong> del nodo (CPU, RAM, GPU, almacenamiento) y de su &lt;strong>precio total&lt;/strong>, y reparte ese
precio entre los recursos. Cuando el proveedor no da precios explícitos por recurso, OpenCost
usa la &lt;strong>ratio de unos precios base&lt;/strong> (tarifas marginales, personalizables) y los &lt;strong>normaliza
para que la suma de los componentes iguale el precio total del nodo&lt;/strong> (&lt;a href="https://opencost.io/docs/configuration/on-prem/">OpenCost · on-prem&lt;/a>).&lt;/p>
&lt;p>Esto es lo que hace que funcione on-prem: &lt;strong>tú declaras el coste del nodo&lt;/strong> (capex amortizado&lt;/p>
&lt;ul>
&lt;li>opex), y OpenCost lo reparte sin necesidad de una factura de cloud. La normalización
garantiza que no se &amp;ldquo;pierda&amp;rdquo; ni se &amp;ldquo;invente&amp;rdquo; coste: lo que pagas por el nodo es exactamente
lo que se reparte entre sus recursos.&lt;/li>
&lt;/ul>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 250" role="img" aria-label="Modelo de coste de OpenCost: precio total del nodo repartido y normalizado entre CPU, GPU, RAM y disco, y luego asignado por uso a cada pod" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.3;stroke-dasharray:5 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#om)}&lt;/style>
&lt;defs>&lt;marker id="om" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;rect class="bx" x="20" y="40" width="170" height="60" rx="6"/>
&lt;text x="32" y="63" class="tl">Precio del nodo&lt;/text>
&lt;text x="32" y="81" class="ts">capex amortizado&lt;/text>
&lt;text x="32" y="95" class="ts">+ opex (€/hora)&lt;/text>
&lt;path class="ar" d="M190,70 L235,70"/>
&lt;rect class="bx" x="235" y="40" width="210" height="60" rx="6"/>
&lt;text x="247" y="63" class="tl">Reparto + normalización&lt;/text>
&lt;text x="247" y="81" class="ts">CPU / GPU / RAM / disco&lt;/text>
&lt;text x="247" y="95" class="ts">suma = precio total&lt;/text>
&lt;path class="ar" d="M445,70 L490,70"/>
&lt;rect class="bx" x="490" y="40" width="270" height="60" rx="6"/>
&lt;text x="502" y="63" class="tl">Asignación por USO&lt;/text>
&lt;text x="502" y="81" class="ts">GPU medio usada = medio coste&lt;/text>
&lt;text x="502" y="95" class="ts">por pod / namespace / equipo&lt;/text>
&lt;rect class="dsh" x="20" y="130" width="740" height="96" rx="6"/>
&lt;text x="34" y="152" class="tl">Lo que OpenCost garantiza: ni se pierde ni se inventa coste.&lt;/text>
&lt;text x="34" y="172" class="ts">· On-prem: declaras el coste del nodo; OpenCost lo reparte (no necesita factura cloud).&lt;/text>
&lt;text x="34" y="190" class="ts">· La GPU se asigna por USO, no por presencia: una GPU al 50 % imputa la mitad de su coste.&lt;/text>
&lt;text x="34" y="208" class="ts">· Trampa: si el precio base por defecto está mal, TODO el reparto está mal (infra-precio típico on-prem).&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="de-dónde-saca-los-datos-prometheus">De dónde saca los datos: Prometheus&lt;/h2>
&lt;p>OpenCost &lt;strong>no instrumenta nada por su cuenta&lt;/strong>: lee de Prometheus, que es un &lt;strong>prerrequisito&lt;/strong>
de la instalación (&lt;a href="https://github.com/opencost/opencost">OpenCost · GitHub&lt;/a>). Las fuentes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fuente&lt;/th>
&lt;th>Qué aporta&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>kube-state-metrics&lt;/code>&lt;/td>
&lt;td>estado de objetos K8s (pods, requests/limits)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>node-exporter&lt;/code>&lt;/td>
&lt;td>recursos y capacidad del nodo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>cAdvisor&lt;/code>&lt;/td>
&lt;td>uso real de CPU/memoria por contenedor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>dcgm-exporter&lt;/code> (NVIDIA)&lt;/td>
&lt;td>uso, memoria y potencia de &lt;strong>GPU&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Con esas series, OpenCost &lt;strong>automatiza el join&lt;/strong> entre el uso de recursos de Kubernetes y el
precio del proveedor, &lt;strong>reduciendo la PromQL personalizada&lt;/strong> que harías a mano (&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-infrastructure/kubernetes-monitoring/manage-costs/">Grafana ·
manage costs&lt;/a>).
La señal de &lt;strong>GPU&lt;/strong> viene de &lt;strong>DCGM&lt;/strong> vía el &lt;code>dcgm-exporter&lt;/code> (parte del NVIDIA GPU Operator),
la misma base que la &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad GPU&lt;/a>. Sin
Prometheus y sin DCGM exportando, OpenCost no ve la GPU.&lt;/p>
&lt;hr>
&lt;h2 id="arquitectura-las-piezas">Arquitectura: las piezas&lt;/h2>
&lt;p>OpenCost no es un monolito; son tres responsabilidades que conviene distinguir:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza&lt;/th>
&lt;th>Función&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Cost model&lt;/strong>&lt;/td>
&lt;td>resuelve el precio del nodo y lo reparte/normaliza entre recursos&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Allocation API&lt;/strong>&lt;/td>
&lt;td>sirve el coste asignado por dimensión (&lt;code>/allocation&lt;/code> y endpoints)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Exporter&lt;/strong>&lt;/td>
&lt;td>publica las métricas de coste en &lt;code>/metrics&lt;/code> para Prometheus/Grafana&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El flujo de datos: Prometheus tiene las series de uso (de kube-state-metrics, cAdvisor,
dcgm-exporter); el &lt;strong>cost model&lt;/strong> las cruza con el precio resuelto; la &lt;strong>Allocation API&lt;/strong> las
sirve agregadas por la dimensión que pidas; y el &lt;strong>exporter&lt;/strong> las devuelve a Prometheus para
que Grafana las pinte. Es un ciclo: las métricas entran de Prometheus y el coste vuelve a
Prometheus enriquecido. Esa simetría es lo que permite reutilizar tu stack de observabilidad
sin montar una base de datos nueva: OpenCost vive &lt;strong>encima&lt;/strong> de Prometheus, no al lado.&lt;/p>
&lt;p>Una nota operativa: el análisis histórico depende de la &lt;strong>retención de Prometheus&lt;/strong>. Para
informes de coste de meses, conviene un backend de larga duración (Thanos, Mimir,
VictoriaMetrics) detrás, o exportar las asignaciones periódicamente a un almacén propio.&lt;/p>
&lt;hr>
&lt;h2 id="precios-on-prem-en-euros-la-pieza-que-decide-todo">Precios on-prem en euros: la pieza que decide todo&lt;/h2>
&lt;p>En on-prem, el dato más importante —y el que más se descuida— es el &lt;strong>precio del nodo&lt;/strong>. Se
configura por proveedor; las opciones son &lt;code>alibaba&lt;/code>, &lt;code>aws&lt;/code>, &lt;code>azure&lt;/code>, &lt;code>gcp&lt;/code>, &lt;code>oracle&lt;/code>, &lt;strong>&lt;code>ovh&lt;/code>&lt;/strong>
o &lt;strong>&lt;code>default&lt;/code>&lt;/strong> (on-prem) (&lt;a href="https://opencost.io/docs/configuration/">OpenCost · configuración&lt;/a>).
Para on-prem se usa &lt;code>default&lt;/code>, dando precios base en un &lt;code>default.json&lt;/code> (o sobreescribiendo el
&lt;code>values.yaml&lt;/code> del Helm); lo que no sobreescribas usa el valor del chart (&lt;a href="https://opencost.io/docs/configuration/on-prem/">OpenCost · on-prem&lt;/a>).&lt;/p>
&lt;p>Para fijar el precio del nodo en euros, el cálculo es el del modelo TCO: capex amortizado +
opex. Un ejemplo de nodo &lt;strong>8×H100&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Componente&lt;/th>
&lt;th>Cálculo&lt;/th>
&lt;th>€/hora&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Capex (nodo ~240.000 €, 36 meses)&lt;/td>
&lt;td>240.000 ÷ 26.280 h&lt;/td>
&lt;td>~9,13&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Energía (5,6 kW × PUE 1,4 × 0,058 €/kWh, Francia)&lt;/td>
&lt;td>~0,455 €/h&lt;/td>
&lt;td>~0,46&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mantenimiento, red, operación&lt;/td>
&lt;td>estimación&lt;/td>
&lt;td>~1,5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Total nodo&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;strong>~11,1 €/h&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Ese &lt;strong>~11 €/h&lt;/strong> es el número que pones en OpenCost, y a partir de él se reparte todo. Y aquí
está la &lt;strong>trampa documentada&lt;/strong>: con la configuración de precios &lt;strong>por defecto&lt;/strong>, OpenCost
&lt;strong>infra-precia la CPU y la GPU on-prem&lt;/strong> (&lt;a href="https://github.com/opencost/opencost/issues/3781">issue #3781&lt;/a>).
Si no ajustas los precios base a tu coste real, el reparto será sistemáticamente bajo y el
coste por token que reportes, irreal. &lt;strong>Configurar el precio del nodo no es opcional: es el
dato del que cuelga todo lo demás.&lt;/strong>&lt;/p>
&lt;hr>
&lt;h3 id="configurar-el-precio-ejemplo">Configurar el precio: ejemplo&lt;/h3>
&lt;p>El precio base se da en el &lt;code>values.yaml&lt;/code> del Helm (o un &lt;code>default.json&lt;/code>), en euros por hora y
por unidad de recurso, derivados del coste total del nodo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># values.yaml — precios on-prem en €/hora (nodo 8xH100, Francia)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">opencost&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">customPricing&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">enabled&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">provider&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">custom&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">costModel&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Nodo 8xH100 on-prem&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">CPU&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.030&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># €/CPU-hora&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">RAM&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.004&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># €/GB-hora&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GPU&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;1.30&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># €/GPU-hora ← el dato que más mueve el coste/token&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">storage&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.0002&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># €/GB-hora&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>OpenCost &lt;strong>normaliza&lt;/strong> esos valores para que, multiplicados por la capacidad del nodo, sumen
el precio total que declaraste (~11 €/h en el ejemplo). El número que más hay que cuidar es
el &lt;strong>GPU&lt;/strong>: a 1,30 €/GPU-hora, las 8 tarjetas son ~10,4 €/h, el grueso del coste del nodo. Un
GPU base mal puesto desplaza todo el coste por token. Revisa siempre los precios resueltos en
&lt;code>/allNodePricing&lt;/code> tras configurar, porque el bug del infra-precio por defecto muerde justo
aquí.&lt;/p>
&lt;hr>
&lt;h2 id="la-asignación-por-uso-no-por-presencia">La asignación: por uso, no por presencia&lt;/h2>
&lt;p>El comportamiento que más ha cambiado y más importa para GPU: en las versiones recientes, &lt;strong>el
coste asignado de una GPU lo determina su uso, no su presencia&lt;/strong>. Si una GPU de 100 €/mes está
usada solo a la mitad, el coste asignado es &lt;strong>~50 €&lt;/strong> ([búsqueda]). Esto alinea la asignación
con la realidad —pagas por lo que usas— pero tiene una consecuencia: la otra mitad &lt;strong>no
desaparece&lt;/strong>, es &lt;strong>idle&lt;/strong> que alguien sigue pagando. OpenCost lo expone, y de ahí sale la
palanca de optimización.&lt;/p>
&lt;p>OpenCost asigna a cualquier dimensión de Kubernetes: &lt;strong>cluster, nodo, namespace, controlador
(deployment, statefulset…), servicio, pod y contenedor&lt;/strong>, y por &lt;strong>labels&lt;/strong> (equipo, producto).
El acceso es vía la &lt;strong>Allocation API&lt;/strong> y varios endpoints que exponen la mecánica:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Endpoint&lt;/th>
&lt;th>Qué devuelve&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>/allocation&lt;/code>&lt;/td>
&lt;td>coste asignado por la dimensión que pidas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/costDataModel&lt;/code>&lt;/td>
&lt;td>el precio de nodo resuelto&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/allNodePricing&lt;/code>&lt;/td>
&lt;td>precios horarios por nodo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/pricingSourceSummary&lt;/code>&lt;/td>
&lt;td>resumen de la fuente de precios&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>/metrics&lt;/code>&lt;/td>
&lt;td>métricas de coste para Prometheus&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El endpoint &lt;code>/metrics&lt;/code> es el que convierte OpenCost en un &lt;strong>exportador de Prometheus&lt;/strong>: una
vez ahí, puedes escribir PromQL para calcular el coste y la eficiencia de cualquier concepto
de Kubernetes y montar paneles en Grafana (&lt;a href="https://opencost.io/docs/integrations/opencost-exporter/">OpenCost · exporter&lt;/a>).&lt;/p>
&lt;h3 id="parámetros-de-la-allocation-api">Parámetros de la Allocation API&lt;/h3>
&lt;p>La &lt;code>/allocation&lt;/code> se controla con unos pocos parámetros que conviene conocer porque definen
qué número obtienes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parámetro&lt;/th>
&lt;th>Qué controla&lt;/th>
&lt;th>Ejemplo&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>window&lt;/code>&lt;/td>
&lt;td>rango temporal&lt;/td>
&lt;td>&lt;code>7d&lt;/code>, &lt;code>today&lt;/code>, fechas concretas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>aggregate&lt;/code>&lt;/td>
&lt;td>dimensión de agregación&lt;/td>
&lt;td>&lt;code>namespace&lt;/code>, &lt;code>label:equipo&lt;/code>, &lt;code>pod&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>accumulate&lt;/code>&lt;/td>
&lt;td>sumar el rango o por intervalo&lt;/td>
&lt;td>&lt;code>true&lt;/code> (total) / &lt;code>false&lt;/code> (serie)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>idle&lt;/code>&lt;/td>
&lt;td>incluir o no el coste de idle&lt;/td>
&lt;td>&lt;code>true&lt;/code> / &lt;code>false&lt;/code> / &lt;code>separate&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>filter&lt;/code>&lt;/td>
&lt;td>filtrar por namespace, label…&lt;/td>
&lt;td>&lt;code>namespace:&amp;quot;llm-prod&amp;quot;&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El parámetro &lt;strong>&lt;code>idle&lt;/code>&lt;/strong> es el más revelador: con &lt;code>idle=separate&lt;/code>, OpenCost te devuelve el
coste de idle &lt;strong>como una fila aparte&lt;/strong>, lo que permite ver de un vistazo cuánto se está
pagando por capacidad sin usar. Una consulta de &lt;code>aggregate=label:equipo&lt;/code> con
&lt;code>idle=separate&lt;/code> sobre &lt;code>window=30d&lt;/code> es, literalmente, el informe de chargeback mensual con el
desperdicio destacado.&lt;/p>
&lt;hr>
&lt;h2 id="gpu-a-fondo-dcgm-uso-mig-e-idle">GPU a fondo: DCGM, uso, MIG e idle&lt;/h2>
&lt;p>La GPU es el recurso caro, así que su asignación merece detalle:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Señal de uso&lt;/strong>: &lt;code>dcgm-exporter&lt;/code> da &lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> (utilización), &lt;code>DCGM_FI_DEV_FB_USED&lt;/code>
(memoria), y la potencia. OpenCost usa la utilización para asignar por uso.&lt;/li>
&lt;li>&lt;strong>MIG (Multi-Instance GPU)&lt;/strong>: una A100 se parte en hasta &lt;strong>7 instancias&lt;/strong> aisladas, lo que
permite &lt;strong>reducir el idle del 50 % a casi 0 %&lt;/strong> repartiendo una tarjeta entre cargas
pequeñas ([búsqueda]; ver &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">compartir GPU: time-slicing, MPS y MIG&lt;/a>).
La asignación de coste de cada instancia MIG sigue la misma lógica de uso.&lt;/li>
&lt;li>&lt;strong>Idle&lt;/strong>: el patrón fiable de detección combina tres piezas — métricas DCGM en Prometheus,
una alerta que salta cuando &lt;code>DCGM_FI_DEV_GPU_UTIL &amp;lt; 10&lt;/code> durante más de &lt;strong>15 minutos&lt;/strong>, y un
enrutado de esa alerta al &lt;strong>equipo dueño del namespace&lt;/strong> ([búsqueda]).&lt;/li>
&lt;/ul>
&lt;p>Un matiz de atribución que conviene conocer: &lt;strong>MIG&lt;/strong> crea instancias &lt;strong>aisladas&lt;/strong> que
Kubernetes ve como recursos distintos, así que OpenCost las asigna limpiamente, cada una a su
pod. El &lt;strong>time-slicing&lt;/strong>, en cambio, comparte la misma GPU física entre varios pods sin
aislamiento de cómputo: ahí la utilización por pod es más difícil de separar, y la atribución
de coste se vuelve aproximada (se reparte la GPU entre los pods que la comparten, según su
uso medido). La regla práctica: si necesitas chargeback exacto por equipo sobre GPU
compartida, &lt;strong>MIG&lt;/strong> da una atribución más limpia que el time-slicing, a cambio de la
rigidez de las particiones fijas. Es un trade-off entre exactitud de coste y flexibilidad
que conviene decidir antes, no después de montar el reparto.&lt;/p>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 220" role="img" aria-label="Asignación de GPU por uso en OpenCost: coste usado imputado al pod, coste idle señalado al dueño del namespace, y MIG repartiendo una tarjeta entre cargas" xmlns="http://www.w3.org/2000/svg">
&lt;style>.bx{fill:none;stroke:currentColor;stroke-width:1.3}.dsh{fill:none;stroke:currentColor;stroke-width:1.3;stroke-dasharray:5 3}.tl{font:600 12px sans-serif;fill:currentColor}.ts{font:11px sans-serif;fill:currentColor}.ar{fill:none;stroke:currentColor;stroke-width:1.3;marker-end:url(#om2)}&lt;/style>
&lt;defs>&lt;marker id="om2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto">&lt;path d="M0,0 L10,5 L0,10 z" fill="currentColor"/>&lt;/marker>&lt;/defs>
&lt;rect class="bx" x="20" y="40" width="170" height="70" rx="6"/>
&lt;text x="32" y="63" class="tl">GPU (DCGM)&lt;/text>
&lt;text x="32" y="81" class="ts">util, memoria, potencia&lt;/text>
&lt;text x="32" y="98" class="ts">→ a Prometheus&lt;/text>
&lt;path class="ar" d="M190,75 L235,60"/>
&lt;path class="ar" d="M190,80 L235,150"/>
&lt;rect class="bx" x="235" y="34" width="240" height="44" rx="6"/>
&lt;text x="247" y="54" class="tl">Coste USADO → pod / equipo&lt;/text>
&lt;text x="247" y="70" class="ts">imputado por utilización&lt;/text>
&lt;rect class="dsh" x="235" y="128" width="240" height="44" rx="6"/>
&lt;text x="247" y="148" class="tl">Coste IDLE → dueño namespace&lt;/text>
&lt;text x="247" y="164" class="ts">alerta util &amp;lt; 10 % &amp;gt; 15 min&lt;/text>
&lt;rect class="bx" x="520" y="80" width="240" height="50" rx="6"/>
&lt;text x="532" y="100" class="tl">MIG: 1 A100 → hasta 7&lt;/text>
&lt;text x="532" y="118" class="ts">reparte la tarjeta, idle 50%→~0&lt;/text>
&lt;text x="20" y="200" class="ts">La asignación por uso revela el idle; MIG y el scheduling lo recuperan. OpenCost mide; otras capas actúan.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;hr>
&lt;h2 id="eficiencia-el-número-que-dispara-la-acción">Eficiencia: el número que dispara la acción&lt;/h2>
&lt;p>Con el coste asignado por uso, OpenCost permite calcular la &lt;strong>eficiencia&lt;/strong>: cuánto del coste
asignado corresponde a trabajo útil frente al total. Una GPU al 30 % de utilización tiene una
eficiencia del 30 %: el 70 % restante es coste de idle que alguien paga sin recibir trabajo.
Esa cifra, por equipo y por namespace, es la que convierte un panel en una conversación de
chargeback: &amp;ldquo;tu namespace tiene 5 GPUs asignadas con una eficiencia del 25 %; o subes la
utilización o liberas tres tarjetas&amp;rdquo;. Conecta con &lt;a href="https://blog.lo0.es/posts/finops-multi-tenancy-gpu-litellm/">FinOps y multi-tenancy&lt;/a>:
la asignación localiza el desperdicio; el scheduling y la co-residencia lo recuperan.&lt;/p>
&lt;hr>
&lt;h2 id="ejemplo-trabajado-el-informe-de-asignación">Ejemplo trabajado: el informe de asignación&lt;/h2>
&lt;p>Sobre el nodo de ~11 €/h (8×H100), tres equipos comparten el cluster un mes. Lo que devuelve
una consulta &lt;code>/allocation?aggregate=label:equipo&amp;amp;idle=separate&amp;amp;window=30d&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Equipo&lt;/th>
&lt;th>GPU-horas&lt;/th>
&lt;th>Util. media&lt;/th>
&lt;th>Coste asignado (€)&lt;/th>
&lt;th>Eficiencia&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A · chat-prod&lt;/td>
&lt;td>2.880 (4 GPU)&lt;/td>
&lt;td>78 %&lt;/td>
&lt;td>~3.744&lt;/td>
&lt;td>alta&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>B · batch&lt;/td>
&lt;td>1.440 (2 GPU)&lt;/td>
&lt;td>55 %&lt;/td>
&lt;td>~1.872&lt;/td>
&lt;td>media&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C · experimentación&lt;/td>
&lt;td>1.440 (2 GPU)&lt;/td>
&lt;td>22 %&lt;/td>
&lt;td>~1.872&lt;/td>
&lt;td>&lt;strong>baja&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>idle&lt;/strong> (separate)&lt;/td>
&lt;td>—&lt;/td>
&lt;td>—&lt;/td>
&lt;td>&lt;strong>~1.100&lt;/strong>&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Lo que revela el informe: el coste asignado a A, B y C sale de sus GPU-horas y el precio del
nodo; pero la fila &lt;strong>idle&lt;/strong> (~1.100 €/mes) es capacidad que nadie usó y todos pagan en el
prorrateo. Y la columna de &lt;strong>eficiencia&lt;/strong> señala a C: 2 GPUs al 22 % es ~1.560 € al mes de
los que solo ~340 € son trabajo útil. Ese es el dato accionable: C no tiene un problema de
modelo, tiene un problema de utilización. Sin OpenCost, esos ~1.100 € de idle y la
ineficiencia de C quedan diluidos en una factura agregada que nadie cuestiona. Con él, son
una fila con nombre y un número en euros.&lt;/p>
&lt;hr>
&lt;h2 id="consultas-promql-útiles">Consultas PromQL útiles&lt;/h2>
&lt;p>Como exportador de Prometheus, OpenCost permite construir los paneles a mano. Algunas
consultas de referencia (los nombres exactos de métrica varían por versión; comprueba en tu
&lt;code>/metrics&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-promql" data-lang="promql">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Coste por nodo y hora (precio resuelto)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nv">node_total_hourly_cost&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Coste de GPU asignado por namespace (€/hora)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">sum&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">namespace&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nv">container_gpu_allocation&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">on&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">node&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">group_left&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nv">node_gpu_hourly_cost&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># Utilización media de GPU por namespace (para la eficiencia)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">avg&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">by&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">namespace&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">DCGM_FI_DEV_GPU_UTIL&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1"># GPUs ociosas: utilización &amp;lt; 10 % sostenida&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nv">DCGM_FI_DEV_GPU_UTIL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La última, envuelta en una alerta con &lt;code>for: 15m&lt;/code> y enrutada al dueño del namespace, es el
patrón estándar de detección de idle. Con estas series en Grafana tienes coste por equipo,
eficiencia y desperdicio en un panel — el &amp;ldquo;informe Inform&amp;rdquo; de la fase FinOps en tiempo real.&lt;/p>
&lt;hr>
&lt;h2 id="precios-dinámicos-cloud-vs-personalizados-on-prem">Precios dinámicos cloud vs personalizados on-prem&lt;/h2>
&lt;p>Conviene entender la diferencia, porque cambia la fiabilidad del dato:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cloud&lt;/strong> (aws/azure/gcp/oracle/ovh): OpenCost obtiene el precio &lt;strong>dinámicamente&lt;/strong> de la API
de facturación del proveedor, así que el coste asignado refleja la tarifa real (incluidos
descuentos, spot, etc.) sin que tú declares nada.&lt;/li>
&lt;li>&lt;strong>On-prem&lt;/strong> (&lt;code>default&lt;/code>/&lt;code>custom&lt;/code>): &lt;strong>tú&lt;/strong> declaras el precio, derivado de tu modelo TCO. La
ventaja es control total; el riesgo, que un precio mal calculado sesga todo. Por eso el
modelo TCO (capex amortizado + opex) no es un ejercicio académico: es literalmente el
&lt;em>input&lt;/em> de OpenCost.&lt;/li>
&lt;/ul>
&lt;p>El proveedor &lt;strong>&lt;code>ovh&lt;/code>&lt;/strong> entre los soportados es relevante para una plataforma europea: si parte
de la carga va a un cloud soberano europeo, OpenCost puede asignar su coste con precio
dinámico, y mezclarlo con el on-prem en la misma vista de asignación.&lt;/p>
&lt;hr>
&lt;h2 id="del-coste-del-pod-al-coste-por-token">Del coste del pod al coste por token&lt;/h2>
&lt;p>OpenCost llega hasta &amp;ldquo;este pod de vLLM costó X €/hora&amp;rdquo;. El &lt;strong>coste por token&lt;/strong> —la métrica que
compara on-prem vs cloud— necesita una pieza más: el &lt;strong>gateway&lt;/strong> (LiteLLM) que cuenta los
tokens por petición y por equipo, como se vio en la &lt;a href="https://blog.lo0.es/posts/finops-gpu-llm-frameworks-estado-del-arte/">introducción de FinOps&lt;/a>.
La cadena completa es: OpenCost da el coste del pod por uso → el gateway da los tokens por
equipo → dividiendo, sale el coste por token por equipo. OpenCost es la &lt;strong>mitad del hierro&lt;/strong>
de esa ecuación; sin él, sabrías los tokens pero no su coste real. Por eso A2 (la asignación)
es el cimiento del que cuelga todo el coste por token de la propuesta.&lt;/p>
&lt;hr>
&lt;h2 id="despliegue-helm--prometheus">Despliegue: Helm + Prometheus&lt;/h2>
&lt;p>El despliegue típico es vía &lt;strong>Helm&lt;/strong>, con &lt;strong>Prometheus como prerrequisito&lt;/strong> (para scraping y
almacenamiento de series). Pasos conceptuales:&lt;/p>
&lt;ol>
&lt;li>Tener Prometheus con &lt;code>kube-state-metrics&lt;/code>, &lt;code>node-exporter&lt;/code>, &lt;code>cAdvisor&lt;/code> y &lt;code>dcgm-exporter&lt;/code>.&lt;/li>
&lt;li>Instalar OpenCost con Helm, apuntándolo a tu Prometheus.&lt;/li>
&lt;li>Configurar el &lt;strong>precio del nodo&lt;/strong> en euros (&lt;code>default.json&lt;/code> / &lt;code>values.yaml&lt;/code>) — el paso que
más se descuida.&lt;/li>
&lt;li>Exponer &lt;code>/metrics&lt;/code> y construir paneles en &lt;strong>Grafana&lt;/strong> con PromQL sobre las métricas de coste.&lt;/li>
&lt;/ol>
&lt;p>Como exportador de Prometheus, OpenCost te deja &lt;strong>escribir PromQL para el coste y la
eficiencia de cualquier concepto&lt;/strong> y crear dashboards a medida (&lt;a href="https://opencost.io/docs/integrations/opencost-exporter/">OpenCost · exporter&lt;/a>).
Reutiliza infraestructura que un cluster con GPU &lt;strong>ya tiene&lt;/strong> para observabilidad (DCGM,
Prometheus, Grafana): OpenCost solo añade la capa de precio y asignación.&lt;/p>
&lt;hr>
&lt;h2 id="opencost-vs-kubecost-lo-justo">OpenCost vs Kubecost (lo justo)&lt;/h2>
&lt;p>OpenCost es la &lt;strong>base gratis&lt;/strong>; Kubecost (IBM) es el &lt;strong>comercial construido sobre él&lt;/strong>. En
breve, qué añade el comercial:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Capacidad&lt;/th>
&lt;th>OpenCost&lt;/th>
&lt;th>Kubecost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Asignación de coste (CPU/GPU/mem/PV)&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✓&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GPU vía DCGM&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✓ (3.0)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Retención larga de histórico&lt;/td>
&lt;td>depende de tu Prometheus&lt;/td>
&lt;td>incluida&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rightsizing automático&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓ (Turbonomic)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gobierno, alertas, RBAC enterprise&lt;/td>
&lt;td>básico&lt;/td>
&lt;td>✓&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Soporte comercial&lt;/td>
&lt;td>comunidad&lt;/td>
&lt;td>✓ (IBM)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Para la mayoría de clusters on-prem con equipo de plataforma, OpenCost cubre la asignación;
Kubecost aporta cuando quieres optimización automatizada y features enterprise sin operarlo
tú. El detalle de la comparación —y cuándo merece la pena pagar— es el artículo &lt;strong>A3&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="checklist-de-implementación">Checklist de implementación&lt;/h2>
&lt;p>Para que OpenCost dé un coste por equipo defendible, el orden importa:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Paso&lt;/th>
&lt;th>Acción&lt;/th>
&lt;th>Verificación&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>Prometheus con kube-state-metrics, node-exporter, cAdvisor&lt;/td>
&lt;td>series presentes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>NVIDIA GPU Operator + dcgm-exporter&lt;/td>
&lt;td>&lt;code>DCGM_FI_DEV_GPU_UTIL&lt;/code> en Prometheus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Instalar OpenCost (Helm) apuntando a Prometheus&lt;/td>
&lt;td>&lt;code>/allocation&lt;/code> responde&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>&lt;strong>Configurar el precio del nodo en €&lt;/strong> (capex+opex)&lt;/td>
&lt;td>&lt;code>/allNodePricing&lt;/code> muestra el real&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>Etiquetar pods/namespaces por equipo y producto&lt;/td>
&lt;td>&lt;code>aggregate=label:equipo&lt;/code> reparte bien&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>Paneles Grafana de coste, eficiencia e idle&lt;/td>
&lt;td>el desperdicio se ve&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>Alerta de idle (&lt;code>util&amp;lt;10&lt;/code> &lt;code>for: 15m&lt;/code>) al dueño&lt;/td>
&lt;td>la alerta llega al equipo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>(opcional) backend de larga retención&lt;/td>
&lt;td>histórico de meses disponible&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El paso 4 es el que más se salta y el que más invalida el resultado. Si solo haces uno bien,
que sea ese: sin el precio del nodo correcto en euros, los pasos 5–7 reparten un coste
equivocado con mucha precisión.&lt;/p>
&lt;hr>
&lt;h2 id="límites-y-trampas-data-driven">Límites y trampas (data-driven)&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Infra-precio por defecto.&lt;/strong> Con la config de precios por defecto, OpenCost subestima
CPU y GPU on-prem (&lt;a href="https://github.com/opencost/opencost/issues/3781">#3781&lt;/a>). Ajusta los
precios base a tu coste real o todo el reparto será bajo.&lt;/li>
&lt;li>&lt;strong>Depende de Prometheus y DCGM.&lt;/strong> Sin las series correctas (especialmente &lt;code>dcgm-exporter&lt;/code>),
no hay asignación de GPU. La calidad del dato de entrada manda.&lt;/li>
&lt;li>&lt;strong>Asignación por uso ≠ coste total.&lt;/strong> La GPU al 50 % imputa la mitad; la otra mitad es
idle que sigue costando. No confundas &amp;ldquo;coste asignado&amp;rdquo; con &amp;ldquo;coste pagado&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Retención de Prometheus.&lt;/strong> El análisis histórico de coste depende de cuánto retiene tu
Prometheus; para series largas, plantea un backend de larga duración.&lt;/li>
&lt;li>&lt;strong>Asignación, no medición por token.&lt;/strong> OpenCost llega al pod; el coste por token necesita
el gateway (LiteLLM) por encima, como se vio en la intro de FinOps.&lt;/li>
&lt;/ol>
&lt;p>Con la mecánica de OpenCost clara, el siguiente artículo (A3) compara qué añade Kubecost y las
alternativas comerciales, para decidir qué stack de FinOps adoptar. Pero el cimiento —la
asignación correcta, con el precio del nodo bien puesto en euros— es este.&lt;/p>
&lt;h2 id="cierre">Cierre&lt;/h2>
&lt;p>OpenCost parece &amp;ldquo;instalar una herramienta de coste&amp;rdquo; y es, en realidad, &lt;strong>declarar cuánto vale
tu hierro y dejar que se reparta solo&lt;/strong>. Esa simplicidad es su fuerza —vive encima del
Prometheus y el DCGM que ya tienes, sin base de datos nueva— y también su trampa: el reparto
es tan bueno como el precio del nodo que declaras, y el valor por defecto &lt;strong>infra-precia&lt;/strong> la
GPU on-prem. Bien configurado en euros, OpenCost convierte la factura agregada del cluster en
un reparto por equipo, por producto y por GPU, separa el coste usado del idle, y expone la
eficiencia que dispara las conversaciones de chargeback. Es la mitad del hierro de la ecuación
del coste por token —la otra mitad, los tokens, la pone el gateway—, y sin esta mitad no hay
modelo TCO ni comparativa on-prem vs cloud que se sostenga. Para una propuesta de arquitectura
soberana, OpenCost es la pieza que hace que el coste deje de ser una intuición y pase a ser
una tabla en euros, reproducible y auditable, con la GPU ociosa señalada con nombre y
apellidos. La fase &lt;em>Inform&lt;/em> del FinOps de GPU empieza aquí, y todo lo demás cuelga de que este
número esté bien.&lt;/p>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/chargeback-showback-multitenancy-gpu/">Chargeback y showback de GPU&lt;/a> — de la asignación de coste de OpenCost al reparto por equipo con presupuestos (Kueue) y atribución de tokens (LiteLLM).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/utilizacion-gpu-como-finops/">La utilización de GPU como palanca FinOps&lt;/a> — el coste del idle y cómo la ocupación mueve el coste asignado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tco-on-premise-gpu-cluster/">TCO del cluster GPU on-premise: amortización, energía e infraestructura&lt;/a> — el CAPEX, la amortización y el €/GPU-hora que OpenCost necesita como precio base cuando el nodo no es cloud sino on-premise propio.&lt;/li>
&lt;/ul>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>OpenCost · GitHub (CNCF, Apache 2.0) — &lt;a href="https://github.com/opencost/opencost">https://github.com/opencost/opencost&lt;/a>&lt;/li>
&lt;li>OpenCost · configuración (proveedores: aws/azure/gcp/oracle/ovh/default) — &lt;a href="https://opencost.io/docs/configuration/">https://opencost.io/docs/configuration/&lt;/a>&lt;/li>
&lt;li>OpenCost · configuración on-prem (precios personalizados) — &lt;a href="https://opencost.io/docs/configuration/on-prem/">https://opencost.io/docs/configuration/on-prem/&lt;/a>&lt;/li>
&lt;li>OpenCost · exportador de Prometheus — &lt;a href="https://opencost.io/docs/integrations/opencost-exporter/">https://opencost.io/docs/integrations/opencost-exporter/&lt;/a>&lt;/li>
&lt;li>OpenCost · issue #3781 (infra-precio CPU/GPU on-prem por defecto) — &lt;a href="https://github.com/opencost/opencost/issues/3781">https://github.com/opencost/opencost/issues/3781&lt;/a>&lt;/li>
&lt;li>NVIDIA · dcgm-exporter — &lt;a href="https://github.com/NVIDIA/dcgm-exporter">https://github.com/NVIDIA/dcgm-exporter&lt;/a>&lt;/li>
&lt;li>Grafana · manage costs (OpenCost + Kubernetes) — &lt;a href="https://grafana.com/docs/grafana-cloud/monitor-infrastructure/kubernetes-monitoring/manage-costs/">https://grafana.com/docs/grafana-cloud/monitor-infrastructure/kubernetes-monitoring/manage-costs/&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>