<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Terraform on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/terraform/</link><description>Recent content in Terraform 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/terraform/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></channel></rss>