<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Crossplane on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/crossplane/</link><description>Recent content in Crossplane on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Mon, 31 Aug 2026 09:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/crossplane/index.xml" rel="self" type="application/rss+xml"/><item><title>Crossplane: el plano de control que convierte tu cluster en una API de nube privada</title><link>https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/</link><pubDate>Mon, 31 Aug 2026 09:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/</guid><description>&lt;blockquote>
&lt;p>Segundo artículo de la tanda sobre reconstruir la experiencia de nube on-premise. El &lt;a href="https://blog.lo0.es/posts/de-la-nube-publica-a-la-privada-mapa/">mapa general&lt;/a> te situó los huecos; este entra en el plano de control de aprovisionamiento, esa API que on-premise no viene dada. El &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">tercero&lt;/a> sube una capa, al autoservicio centrado en la aplicación con KubeVela y Score.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Crossplane te resuelve el hueco del &amp;ldquo;abre un ticket y espera&amp;rdquo;. En la nube pides una base de datos por una API y aparece con permisos, copias y monitorización; on-premise ese aprovisionamiento lo haces a mano o por scripts. Crossplane lleva el modelo de APIs declarativas de Kubernetes a la infraestructura: tu equipo de plataforma define una API propia (una base de datos, un endpoint de inferencia) y el desarrollador la consume con un &lt;code>kubectl apply&lt;/code> de pocos campos, mientras controladores dentro del cluster reconcilian el estado deseado contra la realidad y corrigen la deriva de forma continua. Se graduó en la CNCF en noviembre de 2025, con más de tres mil contribuidores y adoptantes como Nike, SAP, IBM o la nube científica de la NASA.&lt;/p>
&lt;p>La diferencia con Terraform es de naturaleza, no de features: Terraform aplica un plan bajo demanda y se va; Crossplane es un plano de control que vive dentro del cluster y no deja de reconciliar. Eso te da autocorrección de deriva y GitOps nativo, y a cambio te quita la red de seguridad del &lt;code>plan&lt;/code> y te obliga a operar el propio plano de control, con providers que crean cientos de definiciones de recursos y un estado que vive en etcd. Y te aviso de una cosa incómoda de entrada: Crossplane no es una CLI imperativa tipo &lt;code>aws ...&lt;/code>, es declarativo primero. Sobre el encaje con inferencia GPU, que hasta hace poco era solo un patrón sin caso público, ya tienes una referencia real, Modelplane, del propio equipo de Crossplane, aunque en versión 0.1 y componiendo vLLM directamente sin pasar por KServe. Te lo detallo al final.&lt;/p>
&lt;h2 id="la-analogía-el-termostato-frente-al-interruptor">La analogía: el termostato frente al interruptor&lt;/h2>
&lt;p>Piénsalo así: Terraform es un interruptor de la luz. Lo accionas, la luz se enciende, y ahí se queda hasta que vuelvas a tocarlo. Si alguien más lo cambia, la luz obedece a quien lo tocó por última vez, y tú no te enteras hasta que vas a mirar. Es aprovisionamiento por acción puntual: ejecutas, aplica, termina.&lt;/p>
&lt;p>Crossplane es un termostato. No le dices &amp;ldquo;enciende la calefacción&amp;rdquo;, le dices &amp;ldquo;quiero veintiún grados&amp;rdquo;, y a partir de ahí un mecanismo vigila la temperatura y actúa solo, de forma continua, para mantenerla. Si alguien abre una ventana y baja el termómetro, el termostato reacciona sin que tú intervengas. Eso es la reconciliación continua: declaras el estado deseado una vez y un controlador se encarga de que la realidad no se aparte de él.&lt;/p>
&lt;p>La analogía también te avisa del coste. Un termostato es más cómodo que un interruptor, pero es un aparato más que tienes que instalar, alimentar y arreglar cuando falla, y si lo programas mal te ajusta la temperatura a algo que no querías, sin preguntar. Un interruptor no se rompe casi nunca y siempre sabes en qué estado está. Crossplane te da la comodidad del termostato a cambio de que operes el termostato.&lt;/p>
&lt;h2 id="qué-es-crossplane-y-en-qué-estado-llega-a-2026">Qué es Crossplane y en qué estado llega a 2026&lt;/h2>
&lt;p>Crossplane nació en Upbound en 2018 y siguió el recorrido de madurez de la CNCF sin atajos: sandbox en 2020, incubación en 2021 y &lt;strong>graduación el 6 de noviembre de 2025&lt;/strong>. La graduación importa porque es el sello que la CNCF reserva para proyectos que considera listos para producción, el mismo nivel de Kubernetes o Prometheus. Las cifras que acompañaron el anuncio son sólidas: más de tres mil contribuidores de más de 450 organizaciones, más de mil autores de pull requests (lo que lo mete en el 10 % superior de los proyectos de la fundación por esa métrica), más de cien releases y dos auditorías de seguridad completadas. Entre los más de setenta adoptantes públicos tienes a Nike, Nokia, Grafana, la nube científica de la NASA, SAP e IBM.&lt;/p>
&lt;p>La descripción oficial del proyecto es &amp;ldquo;el plano de control nativo de la nube&amp;rdquo;, y esa frase te resume exacto lo que hace. El principal vendor detrás sigue siendo Upbound, que en la graduación enmarcó el futuro del proyecto hacia infraestructura &amp;ldquo;AI-native&amp;rdquo;, un dato que te retomo al hablar de inferencia, con la cautela de que es posicionamiento de un vendor, no un caso probado.&lt;/p>
&lt;p>La cadencia de releases es trimestral, con una ventana de soporte de nueve meses y tres versiones con mantenimiento activo en cualquier momento. A la fecha de escribir esto, la rama v2 es la vigente, con la v1.20 como último cierre de la rama v1.&lt;/p>
&lt;h2 id="el-giro-de-la-v2-que-te-cambia-cómo-lo-piensas">El giro de la v2 (que te cambia cómo lo piensas)&lt;/h2>
&lt;p>Crossplane 2.0 llegó a disponibilidad general en agosto de 2025 y trae cuatro cambios estructurales que te toca conocer, porque buena parte del material antiguo describe un modelo que ya no es el recomendado.&lt;/p>
&lt;p>El primero es que &lt;strong>los recursos pasan a estar dentro de un namespace por defecto&lt;/strong>. Tanto los recursos compuestos como los gestionados, que antes eran de ámbito de cluster, ahora viven en un namespace, lo que te habilita control de acceso fino y multi-tenancy natural, justo lo que necesitas en una plataforma soberana con varios equipos.&lt;/p>
&lt;p>El segundo es que &lt;strong>una composición puede incluir cualquier recurso de Kubernetes&lt;/strong>, no solo recursos de Crossplane. Antes una composición se limitaba a los recursos gestionados del propio Crossplane; ahora puede incluir Deployments, Services o CRDs de terceros, así que puedes componer abstracciones que mezclan aplicación e infraestructura en un mismo objeto. Este cambio es el que hace viable el patrón de inferencia que verás.&lt;/p>
&lt;p>El tercero es que &lt;strong>desaparecen los Claims&lt;/strong>. En el modelo v1 había una dualidad entre el recurso compuesto, de ámbito de cluster, y el Claim, su cara dentro de un namespace que consumía el desarrollador. Al ser ahora el recurso compuesto directamente de namespace, esa dualidad sobra: el desarrollador consume el recurso compuesto sin intermediario. Si te encuentras documentación que habla de Claims, es del modelo anterior.&lt;/p>
&lt;p>El cuarto es un tipo nuevo, &lt;code>Operations&lt;/code>, para tareas operativas puntuales o programadas que ejecutan un pipeline de funciones hasta completarse, como un Job de Kubernetes pero dentro del modelo de Crossplane.&lt;/p>
&lt;p>Hay una eliminación que merece punto y aparte, porque es la que más sorprende: en v2 se retiró el patch-and-transform nativo, el mecanismo clásico de parcheo de las composiciones. No se relegó, se quitó. Todo pasa ahora por composition functions, y a eso llego en un momento. La migración de v1 a v2 es en su mayoría sin rupturas y las APIs v1 siguen funcionando, así que adoptar v2 es opcional, pero el modelo nuevo es el que te toca aprender.&lt;/p>
&lt;h2 id="el-modelo-pieza-por-pieza">El modelo, pieza por pieza&lt;/h2>
&lt;p>Crossplane tiene una jerga densa y te la desmonto con calma, porque una vez colocadas las piezas el conjunto es coherente.&lt;/p>
&lt;p>&lt;strong>Un provider&lt;/strong> es un paquete que instala controladores y definiciones de recursos para hablar con una API externa, sea AWS, GCP, un cluster de Kubernetes remoto, Helm o Terraform. Se instala de forma declarativa, aplicando un objeto &lt;code>Provider&lt;/code>. Los providers de los grandes proveedores cloud se generan con Upjet, un framework que produce el código a partir de los providers de Terraform, lo que te explica por qué existen tantos y también por qué algunos son enormes.&lt;/p>
&lt;p>&lt;strong>Un managed resource&lt;/strong> es la representación uno a uno, dentro de Kubernetes, de un recurso del proveedor externo: un bucket, una instancia, una base de datos. Es la unidad que el controlador reconcilia. Cuando creas un managed resource de tipo bucket, el controlador del provider crea el bucket real y luego vigila que siga existiendo y con la configuración que declaraste.&lt;/p>
&lt;p>Sobre esos ladrillos construyes la abstracción, que es donde está el valor real, con tres conceptos:&lt;/p>
&lt;p>La &lt;strong>CompositeResourceDefinition&lt;/strong>, o XRD, define el esquema de tu API propia: qué campos puede pedir el usuario. Es la que convierte &amp;ldquo;una base de datos&amp;rdquo; en un tipo de recurso con sus parámetros.&lt;/p>
&lt;p>La &lt;strong>Composition&lt;/strong> es la plantilla y la lógica que, dado uno de esos recursos, materializa los N recursos gestionados que hacen falta por debajo. La documentación lo dice sin rodeos: una composición es un pipeline de composition functions.&lt;/p>
&lt;p>El &lt;strong>Composite Resource&lt;/strong>, o XR, es la instancia concreta: el objeto que el desarrollador crea con &lt;code>kubectl apply&lt;/code>, con los pocos campos que la XRD expone.&lt;/p>
&lt;p>El patrón completo es este: tu operador de plataforma publica la abstracción (la XRD más la Composition, que dicen &amp;ldquo;esto es lo que significa una base de datos aquí&amp;rdquo;), y el desarrollador solo aplica un recurso compuesto con cuatro campos. Deja de importarle cómo se construye por debajo, igual que en la nube no te importa cómo AWS te monta la base de datos gestionada.&lt;/p>
&lt;h2 id="composition-functions-la-lógica-real">Composition functions: la lógica real&lt;/h2>
&lt;p>El mecanismo de composición en v2, y el único, son las &lt;strong>composition functions&lt;/strong>. Una composición es un pipeline de funciones que Crossplane invoca por gRPC; cada función recibe el estado observado, el deseado, su input y un contexto compartido, y encadena su salida a la siguiente. El YAML de los ejemplos es ilustrativo, pero por debajo no se procesa como YAML: se ejecuta como funciones.&lt;/p>
&lt;p>Las funciones disponibles cubren varios estilos. Tienes &lt;code>function-patch-and-transform&lt;/code>, que reimplementa el viejo modelo ahora como una función más. Están &lt;code>function-go-templating&lt;/code> para plantillas al estilo Helm, &lt;code>function-kcl&lt;/code> para el lenguaje KCL, &lt;code>function-python&lt;/code> para lógica en Python y &lt;code>function-cue&lt;/code> para CUE.&lt;/p>
&lt;p>El porqué del cambio es lo que te interesa entender. El patch-and-transform clásico no tenía bucles ni condicionales, así que una operación tan simple como transformar un array de strings se te convertía en decenas de líneas de parcheo, y la comunidad lo llegó a calificar de directamente malo. Las funciones te dejan lógica de programación completa (bucles, condicionales, llamadas externas) en un lenguaje real. La contrapartida honesta es que la complejidad no desaparece: se te desplaza de &amp;ldquo;escribir parches verbosos&amp;rdquo; a &amp;ldquo;escribir y operar funciones&amp;rdquo;, que es otro tipo de trabajo, no menos trabajo.&lt;/p>
&lt;h2 id="crossplane-frente-a-terraform-opentofu-y-pulumi">Crossplane frente a Terraform, OpenTofu y Pulumi&lt;/h2>
&lt;p>Esta es la comparación que hace todo el mundo, y te la hago bien porque la diferencia es de categoría. Según la propia documentación de Pulumi, que compara con honestidad, Crossplane es un plano de control declarativo con reconciliación continua dentro de Kubernetes, mientras que Terraform y Pulumi son infraestructura como código de ejecución puntual, del lado del cliente y bajo demanda.&lt;/p>
&lt;p>Las consecuencias prácticas se ordenan en pocos ejes. Ante la deriva de configuración, Crossplane la corrige de forma continua y automática, mientras Terraform y Pulumi la detectan solo cuando ejecutas un refresco. Crossplane necesita un cluster donde correr, porque son controladores; Terraform y Pulumi no. Crossplane es GitOps nativo, se aplica con kubectl y encaja con &lt;a href="https://blog.lo0.es/posts/gitops-stack-inferencia-llm-flux/">Flux&lt;/a> sin adaptador; Pulumi necesita su operador de Kubernetes para lo mismo. Y en cuanto al lenguaje, Crossplane usa YAML y CRDs con lógica en las funciones, mientras Pulumi usa lenguajes de programación generales.&lt;/p>
&lt;p>El punto que más se olvida es que &lt;strong>no tienes que elegir uno u otro&lt;/strong>. Existe un provider de Terraform (y otro de OpenTofu, recomendado para versiones nuevas porque el de Terraform quedó congelado en la última versión con licencia libre) que ejecuta HCL &lt;em>dentro&lt;/em> de Crossplane, envolviendo tus módulos existentes como un recurso gestionado. Puedes reutilizar toda tu inversión en Terraform y aun así ganar la reconciliación continua para lo que la necesite. Si ya tienes Terraform en producción, este patrón híbrido suele ser tu ruta sensata, no la reescritura.&lt;/p>
&lt;p>Sobre la adopción comparada te toca ser sobrio: no hay una cifra oficial y fiable de &amp;ldquo;Crossplane frente a Terraform&amp;rdquo;, y la crítica documentada más repetida es que a Crossplane le falta el ecosistema maduro de módulos que Terraform lleva años acumulando. Es una diferencia cualitativa real, no un detalle.&lt;/p>
&lt;h2 id="la-pregunta-incómoda-es-una-cli-tipo-aws">La pregunta incómoda: ¿es una CLI tipo AWS?&lt;/h2>
&lt;p>Como en este blog vengo tirando del hilo del aprovisionamiento por CLI, te respondo directo: &lt;strong>no&lt;/strong>. Crossplane no te ofrece una experiencia imperativa tipo &lt;code>aws s3 create-bucket&lt;/code>. Es declarativo primero. Aprovisionas con &lt;code>kubectl apply&lt;/code> de un recurso, y el binario &lt;code>crossplane&lt;/code> te sirve para construir, empaquetar, probar y depurar, no para &amp;ldquo;crear un bucket&amp;rdquo; de un tirón.&lt;/p>
&lt;p>Los subcomandos te lo dejan claro. &lt;code>crossplane render&lt;/code> renderiza una composición y sus funciones en local, para que pruebes sin cluster. La familia &lt;code>crossplane xpkg build&lt;/code>, &lt;code>push&lt;/code>, &lt;code>install&lt;/code> te gestiona los paquetes OCI de providers, configuraciones y funciones. Y &lt;code>crossplane beta validate&lt;/code>, &lt;code>trace&lt;/code> y &lt;code>top&lt;/code> validan esquemas, dibujan el árbol de recursos y muestran el consumo dentro del cluster. Es la caja de herramientas del que construye la plataforma, no la del que la consume a diario. La CLI &lt;code>up&lt;/code> de Upbound añade más, pero orientada a su producto comercial.&lt;/p>
&lt;p>La conclusión te importa para fijar expectativas: la experiencia imperativa tipo consola de AWS, si la quieres, la construyes &lt;em>encima&lt;/em> de Crossplane, con Backstage, un portal o un wrapper propio. Crossplane te pone la API declarativa; la cara amable la pones aparte. Si lo que buscas es una CLI imperativa de aprovisionamiento, encajas mejor con el modelo de &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">KubeVela y Score&lt;/a>, que es justo el tema del siguiente artículo.&lt;/p>
&lt;h2 id="providers-on-premise-aprovisionar-sin-tocar-aws">Providers on-premise: aprovisionar sin tocar AWS&lt;/h2>
&lt;p>Para una plataforma soberana tu pregunta es qué puedes aprovisionar sin pisar una nube pública, y la respuesta es más de lo que parece, con madurez desigual.&lt;/p>
&lt;p>El más versátil es &lt;code>provider-kubernetes&lt;/code>, que gestiona cualquier objeto de Kubernetes en clusters remotos a través de un recurso &lt;code>Object&lt;/code>. Es la base del patrón multi-cluster on-premise: desde un cluster central materializas recursos en tus RKE2 secundarios. Junto a él, &lt;code>provider-helm&lt;/code> instala y gestiona charts de Helm de forma declarativa mediante un recurso &lt;code>Release&lt;/code>, con lo que despliegas cosas como vLLM o KServe como parte de una composición.&lt;/p>
&lt;p>Para la parte de identidad y almacenamiento tienes piezas concretas: &lt;code>provider-keycloak&lt;/code> configura realms, clientes y roles de Keycloak de forma declarativa, útil para el IAM soberano que ya montamos en &lt;a href="https://blog.lo0.es/posts/mcp-crece-autenticacion-keycloak/">el artículo de autenticación con Keycloak&lt;/a>; y &lt;code>provider-minio&lt;/code> gestiona buckets y políticas del almacenamiento S3-compatible on-premise. Para vSphere no tienes un provider nativo de primera clase, pero lo cubres generándolo desde el provider de Terraform, el patrón habitual para infraestructura VMware.&lt;/p>
&lt;p>Un aviso honesto: para KubeVirt, Harvester o CloudNativePG no hay providers nativos maduros y de primera clase; en la práctica los gestionas aplicando sus CRDs a través de &lt;code>provider-kubernetes&lt;/code> o envolviendo su Terraform. Funciona, pero no es la experiencia pulida de un provider dedicado. Con la combinación de provider-kubernetes, provider-helm, provider-minio y provider-keycloak, más provider-terraform para lo que falte, montas un catálogo de autoservicio cien por cien on-premise, con la advertencia de que la madurez te varía pieza a pieza.&lt;/p>
&lt;h2 id="el-encaje-con-inferencia-gpu-de-patrón-a-modelplane">El encaje con inferencia GPU: de patrón a Modelplane&lt;/h2>
&lt;p>Esta es la sección que en la primera versión de este texto iba con la máxima cautela, porque no había un caso público de Crossplane orquestando GPU e inferencia y todo quedaba en patrón de diseño. A mitad de 2026 eso cambió, y el caso lo publicó el propio equipo que hace Crossplane.&lt;/p>
&lt;p>&lt;strong>Modelplane&lt;/strong> es un plano de control open source para inferencia de IA, con licencia Apache y una primera versión 0.1 de junio de 2026, y lo interesante es cómo está hecho: enteramente sobre composiciones de Crossplane y composition functions en Python, sin controladores propios. Compone vLLM directamente, con la imagen &lt;code>vllm/vllm-openai&lt;/code>, sin pasar por KServe, y su API de autoservicio para los equipos de ML es un recurso &lt;code>ModelDeployment&lt;/code> donde declaras el modelo, el motor, la topología y el hardware. Por debajo, un recurso &lt;code>ModelReplica&lt;/code> representa cada réplica, y el equipo de plataforma declara sus pools de GPU con recursos &lt;code>InferenceCluster&lt;/code> e &lt;code>InferenceClass&lt;/code>, usando un modelo de atributos y expresiones CEL tomado de la asignación dinámica de recursos de Kubernetes. Su pieza más avanzada es un planificador de flota de dos niveles escrito como función pura, que coloca réplicas por toda la infraestructura y delega en el planificador de cada cluster. Es la prueba de que el patrón funciona, con el aviso de que es una versión 0.1 en desarrollo abierto, no algo para meter en producción a ciegas, y de que adoptarlo te ata la plataforma a sus tipos de recurso.&lt;/p>
&lt;p>El otro habilitador reciente está en KServe, que estrenó un tipo dedicado a modelos grandes, &lt;code>LLMInferenceService&lt;/code>, todavía en alfa y construido sobre el proyecto llm-d, con separación de prefill y decode y ejecución multi-nodo, y que corre vLLM como runtime. Es distinto del &lt;code>InferenceService&lt;/code> clásico, reservado para el ML predictivo. Ese tipo nuevo es tu ladrillo ideal si prefieres componer KServe en vez de vLLM a pelo.&lt;/p>
&lt;p>Con eso, el camino dorado propio deja de ser hipótesis. Defines una XRD, por ejemplo &lt;code>InferenceEndpoint&lt;/code>, con campos como el modelo, el número y tipo de GPU y las réplicas. Su composición, aprovechando que en v2 puede incluir cualquier recurso de Kubernetes, materializa en un solo pipeline el namespace del equipo, la cuota para &lt;code>nvidia.com/gpu&lt;/code> y un &lt;code>LLMInferenceService&lt;/code> de KServe apuntando al modelo con runtime vLLM, y el desarrollador solo aplica el &lt;code>InferenceEndpoint&lt;/code> con cuatro campos, sin conocer KServe ni las cuotas por debajo. KServe soporta vLLM y GPU de forma nativa, como vimos en &lt;a href="https://blog.lo0.es/posts/kserve-open-inference-protocol-plano-control/">el artículo sobre KServe&lt;/a>.&lt;/p>
&lt;p>La lectura honesta es que estás en la frontera, no en terreno trillado. Fuera de Modelplane, hecho por Upbound, todavía no hay un cuerpo de casos independientes montando Crossplane con vLLM, y el tipo de KServe está en alfa. Es una arquitectura coherente, con una referencia real que la respalda y un margen amplio para que seas de los primeros en documentarla sobre hierro propio.&lt;/p>
&lt;h2 id="lo-que-te-cuesta-operar-tu-propio-plano-de-control">Lo que te cuesta operar tu propio plano de control&lt;/h2>
&lt;p>Ninguna herramienta que te devuelve control es gratis, y Crossplane tiene costes bien documentados que te toca presupuestar antes, no descubrir después.&lt;/p>
&lt;p>&lt;strong>La curva de aprendizaje es empinada&lt;/strong>, reconocido incluso en la cobertura de su graduación. Los adoptantes reportan dificultades de depuración cuando una composición o un provider se comportan mal, y echan en falta el ecosistema de módulos de Terraform.&lt;/p>
&lt;p>&lt;strong>Las composiciones tienden a la complejidad.&lt;/strong> Hay practicantes que describen definiciones que abarcan miles de líneas con mala navegación, y la ausencia de un framework de testing integrado. Las funciones mejoran esto, pero como te dije, te desplazan la complejidad más que eliminarla.&lt;/p>
&lt;p>&lt;strong>No hay &lt;code>plan&lt;/code>.&lt;/strong> A diferencia del ciclo &lt;code>plan&lt;/code> y &lt;code>apply&lt;/code> de Terraform, Crossplane aplica los cambios de inmediato. Pierdes la red de seguridad de revisar qué va a pasar antes de que pase, con el riesgo de modificaciones que no querías.&lt;/p>
&lt;p>&lt;strong>Operar el propio plano de control cuesta.&lt;/strong> Los providers grandes crean cientos de definiciones de recursos (el de GCP llegó a 347), con riesgo de indisponibilidad del servidor de API y de dejarte el cluster colgado. El estado vive en etcd, lo que te complica la recuperación ante desastres y la migración del control entre clusters. Y hay un peligro concreto: un borrado accidental de recursos cloud al actualizar XRDs, providers o composiciones, por la propiedad que Crossplane mantiene sobre lo que creó.&lt;/p>
&lt;p>Hay quien decidió no adoptarlo. El equipo de Masterpoint lo descartó por la falta de fuentes de datos y de &lt;code>ignore_changes&lt;/code>, por una cobertura incompleta de servicios de AWS, y por el coste de abandonar su experiencia acumulada en Terraform. Es una decisión legítima, y citártela es parte de un artículo honesto.&lt;/p>
&lt;h2 id="cómo-convive-con-lo-que-ya-tienes">Cómo convive con lo que ya tienes&lt;/h2>
&lt;p>Si ya operas una plataforma, tu pregunta no es Crossplane sí o no, sino Crossplane con qué. Tres relaciones te importan.&lt;/p>
&lt;p>Con &lt;strong>Backstage&lt;/strong> son complementarios, no rivales. Backstage es el portal y las plantillas que generan manifiestos o pull requests, el día cero; Crossplane aprovisiona y reconcilia el estado real, el día dos. El patrón habitual, que algunos llaman el triángulo dorado, es Backstage como interfaz, Crossplane como plano de control y Argo CD o Flux como GitOps. Cada uno hace una capa.&lt;/p>
&lt;p>Con &lt;strong>Flux&lt;/strong>, que probablemente ya usas, la relación es de suma. Flux reconcilia manifiestos hacia los clusters, pero no te da una API de abstracción de plataforma: no sabe qué es &amp;ldquo;una base de datos&amp;rdquo;, solo aplica el YAML que le das. Crossplane te añade justo esa capa de abstracción, y ambos coexisten, con Flux desplegando los recursos compuestos y Crossplane materializándolos. Si ya tienes Flux, el valor de Crossplane es precisamente esa capa de API de autoservicio, a cambio del coste de operar el plano de control que te describí arriba.&lt;/p>
&lt;p>Con &lt;strong>KubeVela y Score&lt;/strong>, el tema del siguiente artículo, la frontera es de capa: Crossplane responde &amp;ldquo;dame una Postgres&amp;rdquo;, desde la infraestructura; KubeVela y Score responden &amp;ldquo;despliega mi aplicación&amp;rdquo;, desde el workload. No compiten, se apilan.&lt;/p>
&lt;h2 id="para-tu-factoría-de-inferencia-soberana">Para tu factoría de inferencia soberana&lt;/h2>
&lt;p>La decisión práctica se te reduce a esto. Crossplane tiene sentido cuando quieres exponer una API de autoservicio propia sobre tu infraestructura on-premise y estás dispuesto a operar un plano de control para conseguirlo. Si tu plataforma la usan dos equipos que se conocen y aprovisionas con un repositorio de Flux ordenado, Crossplane es coste sin retorno todavía. El disparador es la escala: cuando el aprovisionamiento manual se te convierte en un cuello de botella de tickets, la API declarativa empieza a pagarte su coste.&lt;/p>
&lt;p>Tu ruta de entrada sensata no es reescribir todo. Es empezar por un provider que ya te sirva (provider-kubernetes y provider-helm cubren mucho), envolver tu Terraform existente con el provider correspondiente en vez de tirarlo, y modelar una sola abstracción de valor claro, probablemente el &lt;code>InferenceEndpoint&lt;/code> que comentamos, como camino dorado. A partir de ahí, creces por demanda. Y siempre con la cuenta clara de que has cambiado la red de seguridad del &lt;code>plan&lt;/code> y un puñado de scripts por un termostato que tienes que mantener encendido.&lt;/p>
&lt;p>El siguiente artículo sube la capa, del recurso de infraestructura al workload de la aplicación, con &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">KubeVela y Score&lt;/a>, que es donde por fin aparece la CLI amable que Crossplane deliberadamente no te da.&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/de-la-nube-publica-a-la-privada-mapa/">De la nube pública a la privada: el mapa&lt;/a> — dónde encaja este plano de control en el conjunto.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">KubeVela y Score: autoservicio por CLI&lt;/a> — la capa de aplicación, la CLI que Crossplane no ofrece.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/backstage-portal-autoservicio-plataforma-llm/">Backstage como portal de autoservicio&lt;/a> — la interfaz que se monta encima del plano de control.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/gitops-stack-inferencia-llm-flux/">GitOps del stack de inferencia con Flux&lt;/a> — el motor con el que Crossplane convive, no compite.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kserve-open-inference-protocol-plano-control/">KServe y el protocolo abierto de inferencia&lt;/a> — lo que el camino dorado de inferencia materializaría por debajo.&lt;/li>
&lt;/ul>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>CNCF, &lt;em>Announces Graduation of Crossplane&lt;/em> (6-nov-2025) — &lt;a href="https://www.cncf.io/announcements/2025/11/06/cloud-native-computing-foundation-announces-graduation-of-crossplane/">https://www.cncf.io/announcements/2025/11/06/cloud-native-computing-foundation-announces-graduation-of-crossplane/&lt;/a>&lt;/li>
&lt;li>Crossplane Blog, &lt;em>Announcing Crossplane&amp;rsquo;s CNCF Graduation&lt;/em> — &lt;a href="https://blog.crossplane.io/crossplane-cncf-graduation/">https://blog.crossplane.io/crossplane-cncf-graduation/&lt;/a>&lt;/li>
&lt;li>Crossplane Blog, &lt;em>Announcing Crossplane 2.0&lt;/em> — &lt;a href="https://blog.crossplane.io/announcing-crossplane-2-0/">https://blog.crossplane.io/announcing-crossplane-2-0/&lt;/a>&lt;/li>
&lt;li>Crossplane Docs, &lt;em>What&amp;rsquo;s New in v2&lt;/em> — &lt;a href="https://docs.crossplane.io/latest/whats-new/">https://docs.crossplane.io/latest/whats-new/&lt;/a>&lt;/li>
&lt;li>Crossplane Docs, &lt;em>Compositions&lt;/em> — &lt;a href="https://docs.crossplane.io/latest/composition/compositions/">https://docs.crossplane.io/latest/composition/compositions/&lt;/a>&lt;/li>
&lt;li>Crossplane Docs, &lt;em>Release Cycle&lt;/em> — &lt;a href="https://docs.crossplane.io/latest/learn/release-cycle/">https://docs.crossplane.io/latest/learn/release-cycle/&lt;/a>&lt;/li>
&lt;li>Crossplane Docs, &lt;em>Crossplane CLI&lt;/em> — &lt;a href="https://docs.crossplane.io/latest/cli/">https://docs.crossplane.io/latest/cli/&lt;/a>&lt;/li>
&lt;li>Upbound, &lt;em>Crossplane Graduates From CNCF, Upbound Redefines AI-Native Infrastructure&lt;/em> — &lt;a href="https://www.upbound.io/blog/crossplane-graduates-from-cncf-upbound-redefines-ai-native-infrastructure">https://www.upbound.io/blog/crossplane-graduates-from-cncf-upbound-redefines-ai-native-infrastructure&lt;/a>&lt;/li>
&lt;li>InfoQ, &lt;em>Crossplane Reaches Production Maturity by Graduating CNCF&lt;/em> — &lt;a href="https://www.infoq.com/news/2025/11/crossplane-grad/">https://www.infoq.com/news/2025/11/crossplane-grad/&lt;/a>&lt;/li>
&lt;li>Pulumi Docs, &lt;em>Pulumi vs. Crossplane&lt;/em> — &lt;a href="https://www.pulumi.com/docs/iac/comparisons/crossplane/">https://www.pulumi.com/docs/iac/comparisons/crossplane/&lt;/a>&lt;/li>
&lt;li>Upbound Marketplace, &lt;em>provider-terraform&lt;/em> — &lt;a href="https://marketplace.upbound.io/providers/upbound/provider-terraform/latest">https://marketplace.upbound.io/providers/upbound/provider-terraform/latest&lt;/a>&lt;/li>
&lt;li>GitHub, &lt;em>provider-kubernetes&lt;/em> — &lt;a href="https://github.com/crossplane-contrib/provider-kubernetes">https://github.com/crossplane-contrib/provider-kubernetes&lt;/a>&lt;/li>
&lt;li>GitHub, &lt;em>provider-helm&lt;/em> — &lt;a href="https://github.com/crossplane-contrib/provider-helm">https://github.com/crossplane-contrib/provider-helm&lt;/a>&lt;/li>
&lt;li>GitHub, &lt;em>provider-keycloak&lt;/em> — &lt;a href="https://github.com/crossplane-contrib/provider-keycloak">https://github.com/crossplane-contrib/provider-keycloak&lt;/a>&lt;/li>
&lt;li>VSHN, &lt;em>provider-minio&lt;/em> — &lt;a href="https://github.com/vshn/provider-minio">https://github.com/vshn/provider-minio&lt;/a>&lt;/li>
&lt;li>Masterpoint, &lt;em>Crossplane: Why it Didn&amp;rsquo;t Work for Us&lt;/em> — &lt;a href="https://masterpoint.io/blog/passing-on-crossplane/">https://masterpoint.io/blog/passing-on-crossplane/&lt;/a>&lt;/li>
&lt;li>CECG, &lt;em>Crossplane: the good, the bad and the ugly&lt;/em> — &lt;a href="https://www.cecg.io/blog/crossplane-the-good-the-bad-the-ugly">https://www.cecg.io/blog/crossplane-the-good-the-bad-the-ugly&lt;/a>&lt;/li>
&lt;li>Taloflow, &lt;em>Backstage vs Crossplane for Platform Engineering&lt;/em> — &lt;a href="https://www.taloflow.ai/guides/comparisons/backstage-vs-crossplane-platform-engineering">https://www.taloflow.ai/guides/comparisons/backstage-vs-crossplane-platform-engineering&lt;/a>&lt;/li>
&lt;li>Crossplane Blog, &lt;em>Building Modelplane on Crossplane&lt;/em> — &lt;a href="https://blog.crossplane.io/building-modelplane/">https://blog.crossplane.io/building-modelplane/&lt;/a>&lt;/li>
&lt;li>Modelplane — &lt;a href="https://modelplane.ai">https://modelplane.ai&lt;/a> · &lt;a href="https://github.com/modelplaneai/modelplane">https://github.com/modelplaneai/modelplane&lt;/a>&lt;/li>
&lt;li>KServe Docs, &lt;em>Understanding LLMInferenceService&lt;/em> — &lt;a href="https://kserve.github.io/website/docs/model-serving/generative-inference/llmisvc/llmisvc-overview">https://kserve.github.io/website/docs/model-serving/generative-inference/llmisvc/llmisvc-overview&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>De la nube pública a la privada: qué se pierde de verdad y qué proyectos tapan el hueco</title><link>https://blog.lo0.es/posts/de-la-nube-publica-a-la-privada-mapa/</link><pubDate>Mon, 31 Aug 2026 09:15:00 +0200</pubDate><guid>https://blog.lo0.es/posts/de-la-nube-publica-a-la-privada-mapa/</guid><description>&lt;blockquote>
&lt;p>Con este abro una tanda sobre el hueco más grande que te deja una plataforma soberana: cómo darles a tus equipos la experiencia de autoservicio de una nube pública, sin la nube pública. Aquí tienes el mapa del problema; los dos siguientes bajan al detalle de las herramientas, &lt;a href="https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/">Crossplane&lt;/a> como plano de control de infraestructura y &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">KubeVela con Score&lt;/a> como autoservicio centrado en la aplicación.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Salir de la nube pública tiene un caso de negocio sólido, y no me lo invento. 37signals declaró un ahorro cercano a los dos millones de dólares en 2024 tras repatriar, el análisis clásico de a16z cifra el gasto en nube en torno a la mitad del coste de ingresos de una empresa de software, y la encuesta de CIOs de Barclays de 2024 registró la intención de repatriación más alta de su historia. Si tu carga es base predecible y sostenida (que es justo la inferencia LLM continua de la que va este blog) los números te salen, y en Europa se suman los motivos de soberanía: el Data Act, la tensión con el CLOUD Act estadounidense, y esa dependencia de tres hiperescalares que controlan alrededor del 70 % del mercado cloud europeo.&lt;/p>
&lt;p>Pero el problema no es el cómputo. Tu rack de GPU on-premise sirve tokens igual de bien que uno alquilado. Lo que la nube te vendía y ahora tienes que reconstruir es otra cosa: la elasticidad de pedir cien máquinas a las diez y devolverlas a las once, el catálogo de cientos de servicios gestionados con una guardia detrás, la API unificada de aprovisionamiento con permisos finos, la red multi-región, la factura que llega desglosada, y ese modelo en el que operar todo eso era problema de otro. Todo eso lo reconstruyes pieza a pieza con proyectos open source, y la reconstrucción tiene un coste que las cifras de ahorro no suelen contarte. Lo que viene es el mapa de qué pierdes, qué proyecto tapa cada hueco, y dónde queda un hueco que no vas a cerrar del todo con nada.&lt;/p>
&lt;h2 id="la-analogía-dejar-el-hotel-para-montar-casa-propia">La analogía: dejar el hotel para montar casa propia&lt;/h2>
&lt;p>Piénsalo así: vivir en la nube pública es vivir en un hotel. Pagas caro la noche, pero no cambias bombillas, la recepción está abierta a las tres de la mañana, si necesitas otra habitación la pides y aparece, y cuando te vas no te llevas nada que mantener. Montar tu propia casa te sale mucho más barato por metro cuadrado si vas a quedarte años, y encima decides tú quién entra y dónde se guardan tus cosas. El problema llega el día que se rompe una tubería: ahí no llamas a recepción, porque la recepción eres tú.&lt;/p>
&lt;p>La repatriación es esa mudanza. El ahorro es real y la propiedad del dato también, pero lo que en el hotel venía incluido en el precio de la noche ahora es tu lista de tareas: la fontanería es tu red, la caldera es tu almacenamiento, el conserje que te conseguía cualquier cosa es el catálogo de servicios gestionados que ya no tienes, y la factura detallada que te deslizaban bajo la puerta es un modelo de costes que te toca construir, porque la electricidad y la amortización no llegan desglosadas por inquilino. La casa te compensa, pero solo si cuentas lo que cuesta amueblarla y arreglar las tuberías, no únicamente el precio por metro frente al hotel.&lt;/p>
&lt;p>El resto del artículo recorre esa lista de tareas y te dice, para cada una, qué herramienta open source hace el trabajo que antes te hacía el hotel.&lt;/p>
&lt;h2 id="por-qué-esta-conversación-es-de-2026-no-de-siempre">Por qué esta conversación es de 2026, no de siempre&lt;/h2>
&lt;p>Repatriar no es nada nuevo, pero en 2026 se te juntan tres cosas que lo vuelven urgente si llevas una plataforma de IA europea.&lt;/p>
&lt;p>La primera es económica, y la puso sobre la mesa Andreessen Horowitz en 2021 con &lt;em>The Cost of Cloud, a Trillion Dollar Paradox&lt;/em>. Su tesis, que te toca leer sabiendo que a16z tiene intereses en el ecosistema que analiza, es que el gasto en nube promedia alrededor del 50 % del coste de ingresos en una empresa de software, y que recuperar la mitad de ese gasto liberaría márgenes que el mercado penaliza. El caso más limpio y que puedes verificar es el de 37signals: DHH publicó que su factura de nube bajó de 3,2 a 1,3 millones de dólares anuales tras repatriar, con una inversión inicial de unos 700.000 dólares en servidores Dell. Ahora el matiz honesto, que la propia prensa especializada subraya: esas cifras de ahorro no incluían el personal extra de operación, ni la energía, ni la refrigeración. Lo retomo en la sección de costes ocultos.&lt;/p>
&lt;p>La segunda es de intención declarada. La encuesta de CIOs de Barclays de la primera mitad de 2024 registró que el 83 % planeaba repatriar alguna carga a nube privada u on-premise en los doce meses siguientes, la lectura más alta de la serie. Pero lee ese 83 % con precisión: es la proporción de responsables que piensan mover &lt;em>alguna&lt;/em> carga, no el porcentaje de cargas ni de gasto que se mueve. Flexera, en su informe de 2025, te da la cifra más aterrizada: las empresas grandes han repatriado en torno al 21 % de las cargas que tenían en nube pública, y el ahorro de coste es la prioridad número uno para casi el 60 %.&lt;/p>
&lt;p>La tercera es regulatoria y europea, y es la que convierte la repatriación en algo más que una decisión de FinOps. El Data Act de la Unión Europea entró en vigor en enero de 2024 y es aplicable desde septiembre de 2025; obliga a la portabilidad entre proveedores y, desde enero de 2027, prohíbe las tarifas de salida que hoy te encadenan a tu proveedor. Y por debajo late una tensión legal de fondo: el CLOUD Act estadounidense permite a las autoridades de Estados Unidos reclamar datos a un proveedor americano aunque los guarde en Frankfurt, que es justo el argumento de por qué una región europea de un hiperescalar no te da soberanía. Con AWS, Microsoft y Google controlando alrededor del 70 % del mercado cloud europeo, la conversación sobre nube soberana dejó de ser teórica. Esto lo desarrollé ya en &lt;a href="https://blog.lo0.es/posts/on-premise-soberano-vs-hyperscalers-datos/">on-premise soberano frente a hiperescalares&lt;/a>.&lt;/p>
&lt;h2 id="qué-pierdes-al-salir-de-la-nube-en-concreto">Qué pierdes al salir de la nube, en concreto&lt;/h2>
&lt;p>Vamos al núcleo, ordenado por lo que más te va a doler. Y una cosa antes de empezar: ninguno de estos huecos es de cómputo. Todos son de lo que la nube ponía alrededor del cómputo.&lt;/p>
&lt;p>&lt;strong>La elasticidad de hardware desaparece.&lt;/strong> On-premise, la GPU que no compraste no existe. La nube te factura por hora precisamente porque asume el riesgo de la capacidad ociosa: te deja pedir un pico y devolverlo. Con hierro propio, el pico lo compras por adelantado y lo pagas esté o no en uso, así que tu rentabilidad depende de una utilización sostenida alta. Por debajo de cierto umbral de uso, la nube vuelve a ganarte. Es el hueco irreducible, el que no tapa ninguna herramienta, y si repatrías carga con picos extremos te estás equivocando de decisión.&lt;/p>
&lt;p>&lt;strong>Los servicios gestionados pasan a ser tu operación.&lt;/strong> Cada caja que dabas por hecha (la base de datos, la cola, el almacenamiento de objetos, el balanceador, el DNS, el gestor de secretos) deja de ser una casilla que marcas y pasa a ser un sistema que instalas, actualizas y vigilas tú. El caso 37signals lo enseña bien: salir del almacenamiento de objetos S3 fue lo último y lo más difícil, con petabytes de datos y un contrato que arrastraron durante años. Tu Postgres gestionado se convierte en operar CloudNativePG; tu S3 se convierte en operar MinIO; y así con cada servicio.&lt;/p>
&lt;p>&lt;strong>El plano de control de aprovisionamiento te toca construirlo.&lt;/strong> AWS te da una API unificada donde pides un recurso con permisos finos y aparece. On-premise eso no viene dado: tienes que montar el plano de control que traduce &amp;ldquo;quiero una base de datos&amp;rdquo; en recursos reales. Es exactamente el hueco de &lt;a href="https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/">Crossplane&lt;/a>, y por eso tiene su propio artículo.&lt;/p>
&lt;p>&lt;strong>La red gestionada la sustituyes pieza a pieza.&lt;/strong> La VPC, los grupos de seguridad, el NAT, el balanceador de carga: cada abstracción de red de la nube tiene su equivalente on-premise (Cilium para las políticas de red sobre eBPF, MetalLB para el balanceador sin ELB, Gateway API para la entrada L7), pero son piezas que ensamblas, no un servicio que enciendes. Buena parte de esto ya lo vimos en la vertical de red con &lt;a href="https://blog.lo0.es/posts/cilium-ebpf-dranet-numa-de-red-inferencia/">Cilium y eBPF&lt;/a>.&lt;/p>
&lt;p>&lt;strong>La facturación deja de existir como tal.&lt;/strong> En la nube el coste te llega desglosado por servicio y por etiqueta; tienes un Cost Explorer que responde &amp;ldquo;cuánto me cuesta este equipo&amp;rdquo;. On-premise no hay factura natural: hay una amortización de hardware, un recibo de la luz y unas nóminas, y repartir eso por carga es un modelo que te toca construir. OpenCost te ayuda con el reparto por carga dentro del cluster, pero el coste físico total (amortización más energía más personal) lo modelas aparte, como vimos en &lt;a href="https://blog.lo0.es/posts/opencost-cost-allocation-kubernetes/">OpenCost y la imputación de coste&lt;/a>.&lt;/p>
&lt;p>&lt;strong>La disponibilidad multi-zona la diseñas tú.&lt;/strong> Las tres zonas de disponibilidad que la nube te regala se convierten en varios sites, varios racks y varias acometidas eléctricas que tienes que planificar. 37signals lo resolvió con dos centros de datos y replicación entre ellos. Ni es gratis ni es automático.&lt;/p>
&lt;p>&lt;strong>Y por encima de todo, la guardia es tuya.&lt;/strong> La nube no te vendía solo cómputo: te vendía operación incluida. Cuando algo se cae a las tres de la mañana, en la nube hay un equipo de guardia del proveedor; con open source, ese equipo eres tú. Este es el coste que las hojas de cálculo de ahorro casi nunca meten, y es el que decide si tu repatriación fue una buena idea o una factura escondida.&lt;/p>
&lt;h2 id="el-mapa-de-proyectos-que-tapan-cada-hueco">El mapa de proyectos que tapan cada hueco&lt;/h2>
&lt;p>Con los huecos ordenados, el catálogo de sustitutos se lee solo. Te lo agrupo por capa, de lo más bajo a lo más cercano al desarrollador.&lt;/p>
&lt;p>En el &lt;strong>sustrato de infraestructura&lt;/strong>, lo que te replica las máquinas virtuales, la red virtual y los discos de EC2, tienes OpenStack como estándar clásico de nube privada completa, Harvester de SUSE como hiperconvergencia bare-metal sobre KubeVirt gestionada desde Kubernetes, y proyectos emergentes como Spinifex que reconstruyen una API compatible con AWS sobre hierro propio. Es la capa más pesada y la que menos toco en este blog, porque doy por hecho que tu cluster ya existe.&lt;/p>
&lt;p>En el &lt;strong>plano de control de aprovisionamiento&lt;/strong>, lo que replica la API de IAM y de recursos de AWS, está Crossplane, graduado en la CNCF en noviembre de 2025, que lleva el modelo de APIs declarativas de Kubernetes a la infraestructura. Junto a él, Cluster API para el aprovisionamiento declarativo de clusters. Y para que veas hasta dónde llega esto en nuestro terreno, el propio equipo de Crossplane publicó a mediados de 2026 Modelplane, un plano de control de inferencia construido sobre composiciones que sirve modelos con vLLM. Esta capa la desarrolla el &lt;a href="https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/">artículo de Crossplane&lt;/a>.&lt;/p>
&lt;p>En la &lt;strong>experiencia de autoservicio del desarrollador&lt;/strong>, lo que replica la consola y la CLI de AWS, tienes tres enfoques distintos que no debes confundir. Backstage es el portal web, el catálogo y las plantillas, y ya tiene &lt;a href="https://blog.lo0.es/posts/backstage-portal-autoservicio-plataforma-llm/">su propio artículo&lt;/a>. KubeVela lleva el autoservicio al modelo de la aplicación con una CLI amigable. Score define una especificación de workload portable entre entornos. KubeVela y Score comparten el &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">tercer artículo&lt;/a> porque cubren la misma capa desde ángulos que se complementan.&lt;/p>
&lt;p>En los &lt;strong>servicios gestionados on-premise&lt;/strong>, CloudNativePG te opera Postgres con alta disponibilidad y copias a almacenamiento de objetos, MinIO te da el almacenamiento S3-compatible, y OpenCost cubre esa imputación de coste que perdiste con Cost Explorer.&lt;/p>
&lt;p>La forma de leer este mapa es que ninguna de estas piezas te sobra si quieres la experiencia de nube: son las casillas que la nube marcaba por ti y que ahora marcas una a una.&lt;/p>
&lt;h2 id="el-hueco-que-no-vas-a-cerrar">El hueco que no vas a cerrar&lt;/h2>
&lt;p>Te lo digo sin adornos, porque es la parte que los folletos de &amp;ldquo;sal de la nube&amp;rdquo; se saltan. Ninguna combinación de proyectos open source te reproduce el 100 % de la nube pública, y no por falta de madurez, sino por diseño.&lt;/p>
&lt;p>Lo que no vas a replicar es, primero, la elasticidad instantánea de hardware: sigues comprando los picos por adelantado. Segundo, la profundidad y amplitud del catálogo de servicios gestionados, cientos de servicios con un acuerdo de nivel de servicio y una guardia detrás, que ningún equipo interno iguala. Tercero, la red global multi-región que la nube te da casi gratis. Y cuarto, ese modelo de responsabilidad operativa transferida: con open source, la operación te vuelve a casa.&lt;/p>
&lt;p>La lectura correcta no es que repatriar sea mala idea, sino que cambias un gasto operativo predecible y una responsabilidad delegada por una inversión de capital más barata y una responsabilidad propia. Para carga base sostenida te sale a cuenta. Para todo lo demás, piénsatelo.&lt;/p>
&lt;h2 id="cuándo-no-repatriar">Cuándo NO repatriar&lt;/h2>
&lt;p>Esta sección tiene que estar, porque repatriar mal aplicado te sale caro. Hay tres señales claras de que la nube sigue siendo tu respuesta correcta.&lt;/p>
&lt;p>La primera es carga con picos extremos o tráfico muy variable. La mayoría de despliegues de inferencia operan entre el 40 y el 65 % de utilización de GPU, y por debajo de aproximadamente el 70 % de uso sostenido la nube te gana en coste total. Si tu carga tiene valles largos, estás comprando hierro para que duerma.&lt;/p>
&lt;p>La segunda es incertidumbre o arranque de proyecto. El punto de equilibrio a favor de comprar solo te aplica cuando la utilización es consistentemente alta y, sobre todo, medida y no proyectada. Comprar GPU contra una previsión optimista es la forma más rápida de acabar con un almacén de silicio ocioso. Dimensionar bien da para un artículo entero: &lt;a href="https://blog.lo0.es/posts/dimensionar-justificar-inversion-gpu/">dimensionar y justificar la inversión en GPU&lt;/a>.&lt;/p>
&lt;p>La tercera es la falta de equipo de operación. El coste total de propiedad on-premise incluye entre medio y un ingeniero a tiempo completo por servidor de GPU. Sin ese equipo, tu ahorro es ilusorio, porque la guardia que la nube incluía ahora no la cubre nadie. El propio a16z plantea su tesis como un enfoque híbrido, no como &amp;ldquo;salir de la nube&amp;rdquo; en absoluto.&lt;/p>
&lt;h2 id="los-números-para-aterrizarlo">Los números, para aterrizarlo&lt;/h2>
&lt;p>Para no dejarte la discusión en abstracto, aquí van los órdenes de magnitud, triangulando dos fuentes con sesgos opuestos, un proveedor de nube y una herramienta neutral de FinOps. Un H100 en la nube te ronda entre 2,90 y casi 7 dólares por GPU-hora según proveedor; comprado, una tarjeta H100 está en torno a 31.000 dólares y un sistema de ocho entre 250.000 y 320.000. A plena utilización, un H100 alquilado supera su precio de compra en menos de un año, y un sistema de ocho con hardware de segunda mano puede amortizarse en torno a siete meses. El coste total a tres años de un sistema de ocho H100, contando personal, colocation, energía y refrigeración, se estima entre 700.000 y 950.000 dólares, y el umbral donde on-premise te gana frente a los hiperescalares está alrededor del 80 % de utilización sostenida.&lt;/p>
&lt;p>Las dos fuentes discrepan en el número exacto, como era de esperar, pero coinciden en el factor que decide: la utilización sostenida, medida y no proyectada. El desarrollo completo de este cálculo lo tienes en &lt;a href="https://blog.lo0.es/posts/tco-on-premise-gpu-cluster/">el TCO del cluster GPU on-premise&lt;/a>. Aquí te vale la conclusión: para carga base continua los números salen, y ese es justo el perfil de una factoría de inferencia.&lt;/p>
&lt;h2 id="para-tu-factoría-de-inferencia-soberana">Para tu factoría de inferencia soberana&lt;/h2>
&lt;p>Todo lo anterior se te ordena en una decisión práctica. Si operas una plataforma de inferencia LLM sobre hierro propio, no estás decidiendo si repatriar (esa decisión ya la tomaste al montar el cluster), sino cómo reconstruir la experiencia de nube que tus equipos echan de menos.&lt;/p>
&lt;p>La secuencia sensata empieza por el sustrato, que probablemente ya tienes en forma de RKE2 y almacenamiento. Sigue por el plano de control de aprovisionamiento, donde Crossplane te convierte el &amp;ldquo;abre un ticket y espera&amp;rdquo; en una API declarativa. Continúa por la experiencia del desarrollador, donde eliges entre el portal de Backstage, el modelo de aplicación de KubeVela o la especificación portable de Score, según si tu gente prefiere una web o una CLI. Y no te olvides de los servicios gestionados on-premise ni de la imputación de coste, porque sin factura tu plataforma pierde la disciplina que la nube imponía por defecto.&lt;/p>
&lt;p>Los dos artículos siguientes bajan a las dos capas que menos cubiertas están en este blog: &lt;a href="https://blog.lo0.es/posts/crossplane-control-plane-autoservicio-soberano/">Crossplane&lt;/a> para el plano de control de infraestructura, y &lt;a href="https://blog.lo0.es/posts/kubevela-score-autoservicio-cli-desarrollador/">KubeVela con Score&lt;/a> para el autoservicio por CLI centrado en la aplicación. Con ellos, el mapa de esta capa te queda cubierto, y tu casa propia empieza a parecerse al hotel que dejaste, con la diferencia de que el dato se queda dentro.&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/on-premise-soberano-vs-hyperscalers-datos/">On-premise soberano frente a hiperescalares, con datos&lt;/a> — el caso de negocio y de soberanía, en detalle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tco-on-premise-gpu-cluster/">El TCO de un cluster GPU on-premise&lt;/a> — el cálculo completo del punto de equilibrio.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/backstage-portal-autoservicio-plataforma-llm/">Backstage como portal de autoservicio&lt;/a> — la capa de portal, la tercera vía de autoservicio.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Los cinco niveles de madurez de la plataforma&lt;/a> — en qué momento cada una de estas piezas empieza a compensarte.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mapa-del-blog-stack-inferencia-soberana/">El mapa del blog por capas&lt;/a> — dónde encaja todo esto en el stack completo.&lt;/li>
&lt;/ul>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>Andreessen Horowitz (S. Wang, M. Casado), &lt;em>The Cost of Cloud, a Trillion Dollar Paradox&lt;/em> — &lt;a href="https://a16z.com/the-cost-of-cloud-a-trillion-dollar-paradox/">https://a16z.com/the-cost-of-cloud-a-trillion-dollar-paradox/&lt;/a>&lt;/li>
&lt;li>Data Center Dynamics, &lt;em>37signals claims it saved almost 2M USD last year from cloud repatriation&lt;/em> — &lt;a href="https://www.datacenterdynamics.com/en/news/37signals-claims-it-saved-almost-2m-last-year-from-cloud-repatriation/">https://www.datacenterdynamics.com/en/news/37signals-claims-it-saved-almost-2m-last-year-from-cloud-repatriation/&lt;/a>&lt;/li>
&lt;li>The Register, &lt;em>Developer pockets 2M USD in savings from going cloud-free&lt;/em> — &lt;a href="https://www.theregister.com/2024/10/21/37signals_aws_savings/">https://www.theregister.com/2024/10/21/37signals_aws_savings/&lt;/a>&lt;/li>
&lt;li>Barclays, &lt;em>Technology: 1H24 CIO Survey&lt;/em> (PDF) — &lt;a href="https://8198920.fs1.hubspotusercontent-na1.net/hubfs/8198920/Barclays_Cio_Survey_2024-1.pdf">https://8198920.fs1.hubspotusercontent-na1.net/hubfs/8198920/Barclays_Cio_Survey_2024-1.pdf&lt;/a>&lt;/li>
&lt;li>Channelnomics, &lt;em>Breaking Down the 83% Public Cloud Repatriation Number&lt;/em> — &lt;a href="https://channelnomics.com/breaking-down-the-83-public-cloud-repatriation-number/">https://channelnomics.com/breaking-down-the-83-public-cloud-repatriation-number/&lt;/a>&lt;/li>
&lt;li>The New Stack, &lt;em>Updated Stats on Cloud Sustainability, Repatriation and Cost Optimization&lt;/em> (Flexera 2025) — &lt;a href="https://thenewstack.io/updated-stats-on-cloud-sustainability-repatriation-and-cost-optimization/">https://thenewstack.io/updated-stats-on-cloud-sustainability-repatriation-and-cost-optimization/&lt;/a>&lt;/li>
&lt;li>Comisión Europea, &lt;em>Data Act | Shaping Europe&amp;rsquo;s digital future&lt;/em> — &lt;a href="https://digital-strategy.ec.europa.eu/en/policies/data-act">https://digital-strategy.ec.europa.eu/en/policies/data-act&lt;/a>&lt;/li>
&lt;li>EU Data Act, &lt;em>Article 29 — Gradual withdrawal of switching charges&lt;/em> — &lt;a href="https://www.eu-data-act.com/Data_Act_Article_29.html">https://www.eu-data-act.com/Data_Act_Article_29.html&lt;/a>&lt;/li>
&lt;li>Kiteworks, &lt;em>How the EU Data Act and GDPR Conflict with U.S. CLOUD Act&lt;/em> — &lt;a href="https://www.kiteworks.com/gdpr-compliance/eu-data-act-gdpr-cloud-conflict/">https://www.kiteworks.com/gdpr-compliance/eu-data-act-gdpr-cloud-conflict/&lt;/a>&lt;/li>
&lt;li>Computerworld, &lt;em>EU takes first steps to reduce reliance on US hyperscalers&lt;/em> — &lt;a href="https://www.computerworld.com/article/4181816/eu-takes-first-steps-to-reduce-reliance-on-us-hyperscalers.html">https://www.computerworld.com/article/4181816/eu-takes-first-steps-to-reduce-reliance-on-us-hyperscalers.html&lt;/a>&lt;/li>
&lt;li>CNCF, &lt;em>Announces Graduation of Crossplane&lt;/em> (6-nov-2025) — &lt;a href="https://www.cncf.io/announcements/2025/11/06/cloud-native-computing-foundation-announces-graduation-of-crossplane/">https://www.cncf.io/announcements/2025/11/06/cloud-native-computing-foundation-announces-graduation-of-crossplane/&lt;/a>&lt;/li>
&lt;li>CNCF, &lt;em>Score accepted as a CNCF Sandbox Project&lt;/em> — &lt;a href="https://www.cncf.io/blog/2024/08/08/score-accepted-as-a-cncf-sandbox-project/">https://www.cncf.io/blog/2024/08/08/score-accepted-as-a-cncf-sandbox-project/&lt;/a>&lt;/li>
&lt;li>Harvester HCI (SUSE) — &lt;a href="https://harvesterhci.io/">https://harvesterhci.io/&lt;/a>&lt;/li>
&lt;li>CloudNativePG — &lt;a href="https://cloudnative-pg.io/">https://cloudnative-pg.io/&lt;/a>&lt;/li>
&lt;li>Crossplane Blog, &lt;em>Building Modelplane on Crossplane&lt;/em> — &lt;a href="https://blog.crossplane.io/building-modelplane/">https://blog.crossplane.io/building-modelplane/&lt;/a> · &lt;a href="https://modelplane.ai">https://modelplane.ai&lt;/a>&lt;/li>
&lt;li>Spheron, &lt;em>LLM Inference On-Premise vs GPU Cloud: 2026 Cost and Break-Even Analysis&lt;/em> — &lt;a href="https://www.spheron.network/blog/llm-inference-on-premise-vs-cloud/">https://www.spheron.network/blog/llm-inference-on-premise-vs-cloud/&lt;/a>&lt;/li>
&lt;li>CloudZero, &lt;em>H100 GPU Cost in 2026: Buy, Rent, and Cloud Pricing Compared&lt;/em> — &lt;a href="https://www.cloudzero.com/blog/h100-gpu-cost/">https://www.cloudzero.com/blog/h100-gpu-cost/&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>