<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>IHE on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/ihe/</link><description>Recent content in IHE on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Thu, 18 Jun 2026 10:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/ihe/index.xml" rel="self" type="application/rss+xml"/><item><title>Cómo usamos nuestra infraestructura para cumplir las normas sanitarias con IA</title><link>https://blog.lo0.es/posts/infra-cumplimiento-normativo-sanidad-ia/</link><pubDate>Thu, 18 Jun 2026 10:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/infra-cumplimiento-normativo-sanidad-ia/</guid><description>&lt;p>En un entorno sanitario, el reto de poner IA en producción no es el modelo: es el cumplimiento. Las normas que aplican —tanto los estándares técnicos de interoperabilidad como las leyes— imponen requisitos concretos de control de acceso, confidencialidad, trazabilidad, localización del dato y gobernanza. Una demostración en un portátil ignora todo eso; una plataforma real tiene que satisfacerlo, y tiene que poder demostrarlo ante una auditoría.&lt;/p>
&lt;p>Este artículo no es un recorrido por tecnologías. Es lo contrario: tomamos los requisitos que imponen las normas y, para cada uno, mostramos cómo se usa nuestra infraestructura para cumplirlo. La infraestructura es real —dos clústeres RKE2 (Kubernetes v1.35) con Cilium como red, GitOps con Flux, Keycloak como servidor de identidad, inferencia en GPU propias y, en preproducción, scheduling con Volcano— y cada componente está aquí porque resuelve un requisito normativo, no porque quede bien en un diagrama. Como toda infraestructura, además, se mide por eficiencia y coste, que es lo que hace el cumplimiento sostenible en lugar de un gasto que no se aguanta.&lt;/p>
&lt;p>Conviene empezar por una idea que mucha gente desconoce: para esto &lt;strong>ya existen estándares del sector&lt;/strong>, y no hay que inventarse nada. Hay estándares de interoperabilidad clínica (HL7, FHIR, DICOM y los perfiles IHE que los combinan), hay un estándar Kubernetes-native para empaquetar y ejecutar IA de imagen médica (MONAI Deploy y su MONAI Application Package), y hay un estándar emergente de cómo debe ser un clúster para ejecutar IA con garantías (el CNCF Kubernetes AI Conformance). Vamos primero a situar ese mapa de estándares, y después a recorrer los requisitos uno a uno.&lt;/p>
&lt;h2 id="el-mapa-de-estándares-del-sector">El mapa de estándares del sector&lt;/h2>
&lt;p>Tres familias de estándares se cruzan en una plataforma de IA sanitaria, y entender qué cubre cada una evita reinventar ruedas.&lt;/p>
&lt;p>&lt;strong>Interoperabilidad clínica: HL7, FHIR, DICOM e IHE.&lt;/strong> Los formatos base son conocidos —HL7 v2 para la mensajería heredada, FHIR para el dato clínico moderno sobre REST, DICOM/DICOMweb para la imagen—. Lo que mucha gente pasa por alto es que existe un cuerpo, &lt;strong>IHE (Integrating the Healthcare Enterprise)&lt;/strong>, que no inventa formatos sino que define &lt;strong>perfiles&lt;/strong>: combinaciones concretas de esos estándares para resolver un caso de uso de forma interoperable. Perfiles como &lt;strong>XDS/XCA&lt;/strong> (intercambio de documentos), &lt;strong>PIX/PDQ&lt;/strong> (identificación y consulta de pacientes) y, crucial para la seguridad, &lt;strong>ATNA (Audit Trail and Node Authentication)&lt;/strong>, que especifica los cuatro pilares de un nodo seguro: autenticación de nodo, autenticación de usuario, registro de auditoría y cifrado de las comunicaciones. Y se apoya en un perfil hermano, &lt;strong>Consistent Time (CT)&lt;/strong>, que sincroniza los relojes de todos los nodos: sin tiempo fiable, un registro de auditoría no sirve como prueba, porque no se puede ordenar ni correlacionar lo que pasó. ATNA se ha modernizado además con &lt;strong>RESTful ATNA&lt;/strong> y el perfil &lt;strong>BALP (Basic Audit Log Patterns)&lt;/strong>, que expresan la auditoría como recursos &lt;strong>FHIR AuditEvent&lt;/strong>. IHE es, en la práctica, el estándar que dice &lt;em>cómo&lt;/em> se combinan FHIR y DICOM de forma segura y auditable; es la referencia natural para diseñar los controles de cumplimiento.&lt;/p>
&lt;p>&lt;strong>IA médica sobre Kubernetes: MONAI Deploy y el MAP.&lt;/strong> Para el problema específico de empaquetar, distribuir y ejecutar aplicaciones de IA de imagen médica existe un estándar de facto: &lt;strong>MONAI Deploy&lt;/strong>, parte del proyecto MONAI (framework open source de deep learning para imagen sanitaria, del ecosistema PyTorch), y su &lt;strong>MONAI Application Package (MAP)&lt;/strong>. Un MAP es una imagen de contenedor que cumple una especificación definida por el &lt;em>MONAI Deploy working group&lt;/em> —expertos de más de una docena de instituciones de imagen médica— y, según esa especificación, &lt;strong>un MAP debe soportar el despliegue en Kubernetes&lt;/strong> e integrarse con DICOM y FHIR para el intercambio de datos. Es decir, hay un formato estándar para &amp;ldquo;una app de IA médica&amp;rdquo; que corre nativamente en Kubernetes, que es exactamente nuestro sustrato. Esto importa para el cumplimiento porque un MAP encapsula el modelo, sus dependencias y su contrato de entrada/salida de forma versionada y reproducible. Alrededor del MAP, MONAI Deploy aporta además las piezas de orquestación que un entorno clínico necesita: un &lt;em>Informatics Gateway&lt;/em> que recibe estudios DICOM y dispara la inferencia, y un &lt;em>Workflow Manager&lt;/em> que encadena los pasos de un pipeline sobre Kubernetes. No es solo un formato de empaquetado: es una manera estándar de llevar una app de imagen médica desde el registro hasta el PACS sin integraciones a medida en cada hospital.&lt;/p>
&lt;p>&lt;strong>Clústeres preparados para IA: CNCF Kubernetes AI Conformance.&lt;/strong> En noviembre de 2025 la CNCF lanzó el &lt;strong>Certified Kubernetes AI Conformance Program&lt;/strong>, que estandariza cómo se ejecutan cargas de IA sobre Kubernetes mediante un conjunto de requisitos —los &lt;strong>KARs (Kubernetes AI Requirements)&lt;/strong>— sobre integración de GPU, gestión de volúmenes y &lt;em>networking&lt;/em> a nivel de job, alineados con Kubernetes v1.35. Y lo más relevante para sanidad: el programa anunció que durante 2026 se amplía con una línea de &lt;strong>Sovereign AI&lt;/strong>, centrada en &lt;em>sandboxing&lt;/em> reforzado y privacidad del dato. Es la formalización, a nivel de industria, de que un clúster que ejecuta IA seria debe cumplir unas garantías mínimas —y de que la soberanía del dato es ya una categoría de primera clase, no una preferencia.&lt;/p>
&lt;p>Con este mapa sobre la mesa, recorramos los requisitos.&lt;/p>
&lt;h2 id="requisito-interoperabilidad-sobre-estándares-ehds-mdr-ihe">Requisito: interoperabilidad sobre estándares (EHDS, MDR, IHE)&lt;/h2>
&lt;p>El EHDS obliga a que los datos de salud se intercambien en formatos estándar, y su perfilado se construye sobre &lt;strong>FHIR R4&lt;/strong>; los perfiles IHE definen cómo se hace ese intercambio de forma interoperable; el MDR exige trazabilidad del dato cuando el software es producto sanitario. El requisito: la plataforma no puede hablar un dialecto propio.&lt;/p>
&lt;p>Cómo lo cumplimos: ponemos una &lt;strong>capa de interoperabilidad&lt;/strong> como frontera entre el dominio clínico y el de inferencia. Un servidor FHIR (R4, porque es la versión normativa y la que perfila el EHDS; R5 tiene adopción marginal y el sector espera a R6, en balotaje desde enero de 2026) expone los recursos clínicos; un nodo DICOMweb sirve la imagen mediante QIDO-RS, WADO-RS y STOW-RS; y una pasarela transforma a FHIR el HL7 v2 entrante. Sobre esa base aplicamos los perfiles IHE pertinentes: identificación de paciente con PIX/PDQ para no cruzar identidades entre fuentes, e intercambio documental con XDS/XCA cuando procede. El modelo de IA nunca toca la base de datos clínica directamente: consume FHIR y DICOMweb a través de esta capa, que es donde se normaliza, se perfila y se controla el acceso. Cuando desplegamos una aplicación de IA de imagen, el objetivo es empaquetarla como &lt;strong>MAP&lt;/strong>, de modo que su contrato con DICOM/FHIR sea el estándar del sector y no una integración a medida.&lt;/p>
&lt;h2 id="requisito-los-resultados-de-la-ia-vuelven-al-flujo-clínico-en-estándar-dicom-fhir-mdr">Requisito: los resultados de la IA vuelven al flujo clínico en estándar (DICOM, FHIR, MDR)&lt;/h2>
&lt;p>Una IA clínica no termina cuando produce una salida: esa salida tiene que volver al sistema en un formato que el clínico y la historia entiendan, y de forma trazable (MDR). Devolver un PDF o un JSON propietario rompe la interoperabilidad y deja el resultado fuera del registro clínico, donde nadie lo audita ni lo reutiliza.&lt;/p>
&lt;p>Cómo lo cumplimos: los resultados de los modelos de imagen se reinyectan como objetos DICOM estándar —&lt;strong>DICOM SR&lt;/strong> (Structured Report) para hallazgos y mediciones, &lt;strong>DICOM SEG&lt;/strong> para segmentaciones, o &lt;em>Secondary Capture&lt;/em> para representaciones visuales— mediante STOW-RS, de modo que el PACS y el visor los tratan como cualquier otra serie del estudio. Los resultados no relacionados con imagen se expresan como recursos &lt;strong>FHIR&lt;/strong> (&lt;code>Observation&lt;/code>, &lt;code>DiagnosticReport&lt;/code>) ligados al paciente y al estudio de origen. Así, el resultado de la IA es un ciudadano de primera del registro clínico —referenciable, versionado y auditable—, no un artefacto suelto en un disco. Empaquetar la aplicación como MAP ayuda también aquí: el contrato de salida hacia DICOM/FHIR forma parte de la propia especificación del paquete, no de un script de pegamento distinto en cada despliegue.&lt;/p>
&lt;h2 id="requisito-acceso-mínimo-y-autorizado-rgpd-ens-ehds-ihe-atna">Requisito: acceso mínimo y autorizado (RGPD, ENS, EHDS, IHE ATNA)&lt;/h2>
&lt;p>El RGPD impone minimización (art. 5) y protección reforzada de los datos de salud como categoría especial (art. 9); el ENS exige identificación y control de acceso; el EHDS, control sobre quién accede y para qué; e IHE ATNA exige &lt;strong>autenticación de nodo&lt;/strong> y &lt;strong>autenticación de usuario&lt;/strong> como pilares de un nodo seguro. Traducido a infraestructura: cada acceso a datos clínicos autenticado, autorizado al mínimo y atado a un propósito; y cada nodo que participa, identificado.&lt;/p>
&lt;p>Cómo lo cumplimos: un único servidor de identidad, &lt;strong>Keycloak&lt;/strong>, gobierna toda la autorización con OAuth 2.1 y OpenID Connect, perfilados por &lt;strong>SMART on FHIR&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Scopes orientados a recurso y propósito.&lt;/strong> SMART distingue &lt;code>patient/&lt;/code>, &lt;code>user/&lt;/code> y &lt;code>system/&lt;/code>, y su versión 2 separa permisos por operación (&lt;code>create&lt;/code>, &lt;code>read&lt;/code>, &lt;code>update&lt;/code>, &lt;code>delete&lt;/code>, &lt;code>search&lt;/code>). Un agente de IA recibe el mínimo, por ejemplo &lt;code>system/ImagingStudy.rs&lt;/code> (solo leer y buscar estudios). Es la minimización del RGPD implementada en el token —y la autenticación de usuario que pide ATNA.&lt;/li>
&lt;li>&lt;strong>Identidad de servicio sin secretos compartidos.&lt;/strong> Las cargas desatendidas usan &lt;code>private_key_jwt&lt;/code> (aserción firmada con clave privada).&lt;/li>
&lt;li>&lt;strong>Binding de audiencia.&lt;/strong> El token lleva en &lt;code>aud&lt;/code> la URL del servidor de destino y este la valida, evitando la reutilización lateral de credenciales; se apoya en extensiones de Keycloak específicas para FHIR.&lt;/li>
&lt;li>&lt;strong>Autenticación de nodo (ATNA) con mTLS.&lt;/strong> Entre los nodos que tratan datos clínicos exigimos TLS mutuo, de modo que no solo se autentica al usuario o al servicio, sino a la propia máquina/servicio que participa en el intercambio.&lt;/li>
&lt;/ul>
&lt;p>DICOMweb se protege con el mismo token y el mismo Keycloak. El resultado es un plano de identidad único para FHIR, DICOMweb y los servidores MCP: un solo sitio donde demostrar quién puede acceder a qué.&lt;/p>
&lt;p>El mismo principio de mínimo privilegio se aplica un nivel más abajo, al propio plano de Kubernetes, que el ENS también alcanza. Los operadores no acceden con un &lt;code>cluster-admin&lt;/code> universal: el acceso de los administradores a la API del clúster se federa contra Keycloak por OIDC, con roles acotados por namespace, de modo que también el acceso técnico queda autenticado, limitado y auditado. Y las cargas de trabajo usan &lt;em>service accounts&lt;/em> sin permisos por defecto, a las que se concede solo lo imprescindible. Quien administra la plataforma está sujeto al mismo régimen de identidad que quien consume los datos clínicos a través de ella.&lt;/p>
&lt;h2 id="requisito-confidencialidad-aislamiento-y-prevención-de-fugas-rgpd-art-32-ens-atna-cifrado">Requisito: confidencialidad, aislamiento y prevención de fugas (RGPD art. 32, ENS, ATNA cifrado)&lt;/h2>
&lt;p>El RGPD (art. 32) exige confidencialidad, integridad, disponibilidad y resiliencia, con medidas como la separación de datos y el cifrado; el ENS detalla controles de segregación y protección de las comunicaciones; ATNA exige cifrado de las comunicaciones entre nodos. En una plataforma multi-cliente esto se traduce en dos cosas: que lo de un centro no sea visible para otro, y que un componente comprometido no pueda sacar datos fuera.&lt;/p>
&lt;p>Cómo lo cumplimos en el aislamiento entre inquilinos: cada tenant vive en su propio &lt;strong>namespace&lt;/strong>, con &lt;strong>RBAC&lt;/strong> acotado, &lt;strong>ResourceQuota&lt;/strong> y &lt;strong>LimitRange&lt;/strong>, una &lt;strong>base de datos dedicada&lt;/strong> por operador (CloudNativePG) —no una base compartida con un filtro de aplicación— y su propio espacio de almacenamiento de objetos. La identidad se segrega por realm en Keycloak. Todo se define en Git y lo reconcilia &lt;strong>Flux&lt;/strong> (GitOps): la separación es declarativa y auditable por historial de cambios. Ante &amp;ldquo;demuéstrame que el centro A no ve los datos del centro B&amp;rdquo;, la respuesta es un commit.&lt;/p>
&lt;p>Cómo lo cumplimos en la confidencialidad de red y la prevención de exfiltración: la red la gestiona &lt;strong>Cilium&lt;/strong> (eBPF) con modelo &lt;strong>default-deny&lt;/strong>. Un pod no tiene conectividad salvo la que una política le concede explícitamente, flujo a flujo, lo que convierte la exfiltración en algo que se bloquea en el kernel. Por ejemplo, el componente de trazabilidad solo puede hablar con su base analítica, su PostgreSQL, el almacenamiento de objetos, la caché y el DNS:&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="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cilium.io/v2&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">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">CiliumNetworkPolicy&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">metadata&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">trazabilidad-egress-minimo&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">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">trazabilidad&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">spec&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">endpointSelector&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">matchLabels&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">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">trazabilidad-web&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">egressDeny&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">toEntities&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">world] &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># nada hacia fuera del clúster por defecto&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">egress&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">toEndpoints&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">matchLabels&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">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">postgres&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">toEndpoints&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">matchLabels&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">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">analitica&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">toEndpoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># DNS, sin esto el pod no resuelve&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">matchLabels&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">k8s:io.kubernetes.pod.namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kube-system&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">k8s-app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kube-dns&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">toPorts&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">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>{&lt;span class="w"> &lt;/span>&lt;span class="nt">port&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;53&amp;#34;&lt;/span>&lt;span class="nt">, protocol&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">UDP }]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dos matices que separan una política correcta de una rota o permeable: hay que permitir explícitamente el &lt;strong>DNS&lt;/strong> (si no, el pod no funciona) y filtrar por &lt;strong>identidad de endpoint&lt;/strong>, no por CIDR, porque en una red basada en identidad el filtrado por rangos de IP no se comporta como la intuición sugiere. Sobre esto añadimos observabilidad de flujos con &lt;strong>Hubble&lt;/strong> y seguridad en runtime con &lt;strong>Tetragon&lt;/strong> (eBPF), que vigila ejecución de procesos, acceso a ficheros y conexiones &lt;strong>dentro&lt;/strong> del contenedor, permitiendo detectar y bloquear comportamiento anómalo en cargas que tratan datos sensibles. Para el cifrado en tránsito que exigen el art. 32 y ATNA, cert-manager gestiona TLS en los ingress y Cilium puede cifrar de forma transparente el tráfico entre nodos.&lt;/p>
&lt;p>A esto se suman dos controles de base que el art. 32 y el ENS dan por descontados. Primero, los &lt;strong>Pod Security Standards&lt;/strong> en perfil restringido —contenedores sin privilegios, sin ejecutarse como root y con el sistema de ficheros en solo lectura donde es posible—, que reducen la superficie de un contenedor comprometido. Segundo, una &lt;strong>gestión disciplinada de secretos y claves&lt;/strong>: las claves privadas de &lt;code>private_key_jwt&lt;/code>, los certificados y las credenciales de base de datos no viven en manifiestos planos en Git, sino gestionadas y rotadas, con cert-manager emitiendo y renovando certificados de forma automática. Un secreto filtrado en un repositorio es una brecha de datos en potencia, y se trata como tal desde el diseño.&lt;/p>
&lt;h2 id="requisito-ciclo-de-vida-del-dato--minimización-retención-y-pseudonimización-rgpd-ehds">Requisito: ciclo de vida del dato — minimización, retención y pseudonimización (RGPD, EHDS)&lt;/h2>
&lt;p>El RGPD no solo limita quién accede: limita cuánto dato se trata (minimización, art. 5) y cuánto tiempo se conserva (limitación del plazo de conservación), y promueve la pseudonimización como medida de protección (art. 32). El requisito: no acumular datos clínicos identificables más de lo necesario, y desidentificar donde el caso de uso lo permita.&lt;/p>
&lt;p>Cómo lo cumplimos: la &lt;strong>capa de interoperabilidad&lt;/strong> es también el punto de control del ciclo de vida del dato. Allí se aplica pseudonimización cuando el flujo de IA no necesita identidad directa —por ejemplo, evaluación o ajuste sobre cohortes—, manteniendo la tabla de reidentificación separada del resto del sistema y tras sus propias políticas de acceso. Un principio que aplicamos de forma estricta: las &lt;strong>trazas y los logs no contienen datos clínicos&lt;/strong>. Registran identificadores de recurso, modelo, coste, latencia y tenant, no el contenido de la historia ni la imagen, de modo que la capa de observabilidad no se convierte en un segundo almacén de datos sensibles que haya que proteger y auditar por duplicado. Y las &lt;strong>políticas de retención&lt;/strong> se aplican por tipo de dato —trazas, cachés, copias intermedias— con expiración automática, de forma que el plazo de conservación es una propiedad declarada y verificable, no un olvido que va acumulando riesgo en discos que nadie revisa.&lt;/p>
&lt;h2 id="requisito-localización-y-soberanía-del-dato-rgpd-ehds-cncf-sovereign-ai">Requisito: localización y soberanía del dato (RGPD, EHDS, CNCF Sovereign AI)&lt;/h2>
&lt;p>Tratar datos de salud de categoría especial enviándolos a una API de inferencia de un tercero, fuera del control del responsable, es difícil de justificar bajo el RGPD y contrario al espíritu del EHDS. Y no es solo un requisito legal: la línea de &lt;strong>Sovereign AI&lt;/strong> del CNCF AI Conformance lo eleva a categoría técnica de primera clase para 2026. El requisito implícito es que el dato clínico no salga del perímetro.&lt;/p>
&lt;p>Cómo lo cumplimos: la inferencia se sirve &lt;strong>en local&lt;/strong>, sobre GPU propias, con un motor de serving de alto rendimiento (vLLM). Las aplicaciones de IA de imagen se empaquetan, idealmente, como &lt;strong>MAP&lt;/strong>, que corren nativamente en el clúster sin sacar el dato fuera. Delante ponemos una &lt;strong>pasarela de modelos&lt;/strong> por la que pasa todo el tráfico de inferencia: es el punto donde se decide qué se ejecuta dentro y dónde, de forma que el dato clínico no sale por defecto y cualquier excepción es explícita y registrada. Que esto sea viable —y no un lujo— depende de la eficiencia: para servir en casa con un coste razonable hay que exprimir el hardware, y ahí entra el scheduling. La soberanía deja de ser una promesa de la diapositiva para ser una propiedad de cómo está montada la inferencia.&lt;/p>
&lt;p>Hay un matiz que conviene explicitar, porque marca la diferencia entre &amp;ldquo;decimos que el dato no sale&amp;rdquo; y &amp;ldquo;el dato no puede salir sin que conste&amp;rdquo;. La pasarela invierte la carga: el comportamiento por defecto es la inferencia local, y cualquier salida hacia un servicio externo es una excepción que hay que habilitar de forma explícita, que queda registrada y que, además, choca con las políticas de red default-deny si no se ha abierto el destino correspondiente. Es decir, la soberanía no se sostiene solo en una decisión de diseño, sino en varios controles que se refuerzan entre sí —pasarela, política de red y registro—, de modo que un descuido de configuración no se traduce en una fuga silenciosa. En un dato de categoría especial, esa diferencia entre confianza y garantía es justo lo que pide el RGPD cuando habla de protección de datos &lt;em>desde el diseño y por defecto&lt;/em> (art. 25).&lt;/p>
&lt;h2 id="requisito-ejecución-fiable-de-cargas-críticas-y-eficiencia-ens-cncf-ai-conformance">Requisito: ejecución fiable de cargas críticas y eficiencia (ENS, CNCF AI Conformance)&lt;/h2>
&lt;p>Mantener la inferencia en casa solo es sostenible si la GPU se aprovecha, y ciertas cargas (un lote nocturno de procesamiento de imagen) deben ejecutarse de forma fiable y completa. El KAR del CNCF AI Conformance formaliza, además, requisitos de integración de GPU y de &lt;em>networking&lt;/em> a nivel de job que un clúster serio de IA debe cumplir. El planificador por defecto de Kubernetes programa pod a pod, lo que para cargas distribuidas produce trabajos a medias que retienen GPU sin avanzar.&lt;/p>
&lt;p>Cómo lo cumplimos: el reparto de GPU lo gobierna &lt;strong>Volcano&lt;/strong> (proyecto incubado en la CNCF), hoy en &lt;strong>preproducción&lt;/strong>, con los mecanismos que importan para fiabilidad y eficiencia:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Gang scheduling&lt;/strong> (&lt;code>PodGroup&lt;/code> con &lt;code>minAvailable&lt;/code>): un trabajo distribuido arranca completo o no arranca, evitando GPU bloqueadas a la espera.&lt;/li>
&lt;li>&lt;strong>Colas por tenant&lt;/strong> con cuota y prioridad, que materializan el reparto justo entre inquilinos que la multitenancy solo declara.&lt;/li>
&lt;li>&lt;strong>Fair-share (DRF)&lt;/strong> para repartir proporcionalmente y &lt;strong>preempción&lt;/strong> para que una carga urgente adelante a un lote diferible.&lt;/li>
&lt;li>&lt;strong>Conciencia de topología&lt;/strong> (NVLink/PCIe) para reducir la fragmentación.&lt;/li>
&lt;/ul>
&lt;p>Esto eleva la utilización efectiva del parque de GPU, que es lo que hace económicamente viable la inferencia soberana. Y se gestiona con métricas, no con impresiones: utilización efectiva frente a asignada, porcentaje de tiempo en &lt;em>idle&lt;/em>, fragmentación, rendimiento por GPU (tokens por segundo) y horas-GPU consumidas por tenant. Son las cifras que permiten decidir si hace falta más hardware o si sobra capacidad mal repartida, y las que convierten una discusión sobre coste en una decisión con datos. Sobre el estado del arte: Kubernetes 1.34 llevó &lt;strong>DRA (Dynamic Resource Allocation)&lt;/strong> a disponibilidad general —asignación de aceleradores por atributos en lugar de por conteo—, y &lt;strong>Kueue&lt;/strong> cubre la gestión de cuotas de jobs; ambos se combinan con un scheduler de gang como Volcano. La eficiencia no es un extra de FinOps: aquí es la condición que hace sostenible cumplir el requisito de soberanía.&lt;/p>
&lt;p>Conviene además leer estos componentes a la luz del &lt;strong>CNCF AI Conformance&lt;/strong>: sus requisitos (los KAR) verifican que un clúster integra correctamente las GPU, gestiona los volúmenes que las cargas de IA necesitan y resuelve el &lt;em>networking&lt;/em> a nivel de job. No son adornos: son justo las capacidades sobre las que se apoyan el serving de inferencia, el almacenamiento de modelos y datos, y el scheduling distribuido que acabamos de describir. Alinearse con ese estándar es, en la práctica, garantizar que la plataforma ejecuta IA con las mismas propiedades que la industria ha acordado como mínimo exigible —y poder demostrarlo, que en un entorno regulado vale tanto como cumplirlo.&lt;/p>
&lt;h2 id="requisito-registro-de-actividad-y-supervisión-humana-ai-act-ehds-ihe-atnabalp">Requisito: registro de actividad y supervisión humana (AI Act, EHDS, IHE ATNA/BALP)&lt;/h2>
&lt;p>El AI Act, para sistemas de alto riesgo —y la IA clínica casi siempre lo es—, exige registro automático de la actividad (logging, art. 12) y supervisión humana significativa (art. 14); el EHDS impone trazabilidad sobre el uso de los datos; e IHE ATNA/BALP define &lt;strong>cómo&lt;/strong> debe ser ese registro de auditoría, expresándolo como recursos &lt;strong>FHIR AuditEvent&lt;/strong>. El requisito: poder reconstruir cada acceso y cada decisión, en un formato estándar y consultable.&lt;/p>
&lt;p>Cómo lo cumplimos en dos planos. En el plano de &lt;strong>acceso al dato&lt;/strong>, los eventos de auditoría (quién accedió a qué recurso clínico, cuándo, con qué propósito) se emiten siguiendo el patrón &lt;strong>FHIR AuditEvent&lt;/strong> de BALP, de modo que la auditoría es interoperable y no un log propietario. En el plano de &lt;strong>decisión de la IA&lt;/strong>, cada inferencia se registra como una &lt;strong>traza auditable&lt;/strong> con Langfuse —prompt, respuesta, modelo y versión, coste, latencia y tenant—, almacenada en componentes propios encerrados tras políticas de red que impiden su salida. La traza cumple el logging del AI Act y la trazabilidad del EHDS, y a la vez sirve de base para la evaluación continua y para la supervisión humana, que se ejerce en la pasarela (revisión, límites, posibilidad de intervención). La instrumentación converge en las convenciones semánticas GenAI de OpenTelemetry, correlacionables con el resto de la observabilidad.&lt;/p>
&lt;p>Un registro de auditoría solo vale como prueba si es &lt;strong>íntegro&lt;/strong> y está &lt;strong>ordenado en el tiempo&lt;/strong>. Por eso los eventos se conservan en almacenamiento de solo-añadir (sin posibilidad de edición a posteriori) con su retención definida, y los relojes de los nodos se mantienen sincronizados —el perfil Consistent Time de IHE llevado a la práctica con NTP—, de modo que la secuencia de &amp;ldquo;quién hizo qué y cuándo&amp;rdquo; es reconstruible y defendible. Sin integridad y sin tiempo fiable, un log es un apunte, no una evidencia.&lt;/p>
&lt;h2 id="requisito-disponibilidad-continuidad-y-recuperación-rgpd-art-32-ens">Requisito: disponibilidad, continuidad y recuperación (RGPD art. 32, ENS)&lt;/h2>
&lt;p>El art. 32 del RGPD exige no solo confidencialidad e integridad, sino &lt;strong>disponibilidad y resiliencia&lt;/strong>, y la capacidad de &lt;strong>restaurar&lt;/strong> el acceso a los datos tras un incidente; el ENS detalla medidas de continuidad de servicio. Un sistema clínico que se cae y no se recupera es un incumplimiento, no solo una incidencia operativa.&lt;/p>
&lt;p>Cómo lo cumplimos: la plataforma corre sobre &lt;strong>dos emplazamientos&lt;/strong> (site01 y site02), lo que permite separar cargas y disponer de capacidad ante la caída de un sitio. El plano de control de cada clúster es de &lt;strong>alta disponibilidad&lt;/strong>, con varios nodos de control y etcd replicado. Las bases de datos por tenant las gestiona un operador que automatiza réplicas y &lt;strong>copias de seguridad&lt;/strong> hacia el almacenamiento de objetos, y el estado declarativo en Git permite &lt;strong>reconstruir un entorno completo&lt;/strong> desde su repositorio. La recuperación no depende de un servidor concreto ni de la memoria de quien lo montó, sino de volver a aplicar lo que está versionado. La combinación de copias de datos y reproducibilidad de configuración es, en términos del art. 32, precisamente la capacidad de restaurar el servicio en un plazo razonable.&lt;/p>
&lt;h2 id="requisito-operación-reproducible-y-demostrable-ens-mdriso-13485-ai-act">Requisito: operación reproducible y demostrable (ENS, MDR/ISO 13485, AI Act)&lt;/h2>
&lt;p>Las normas no solo piden que el sistema haga lo correcto: piden poder demostrarlo y reproducirlo. El ENS exige gestión de la configuración y trazabilidad de cambios; el MDR (vía ISO 13485) exige control de cambios y reproducibilidad; el AI Act, gestión de riesgos y documentación técnica.&lt;/p>
&lt;p>Cómo lo cumplimos: todo el estado de la plataforma —despliegues, políticas de red, cuotas, RBAC, configuración de identidad— se describe en Git y lo aplica &lt;strong>Flux&lt;/strong> por GitOps. Cada cambio es una revisión con autor, fecha y revisor; cada entorno es reproducible desde su repositorio. Las versiones de modelo quedan registradas en las trazas, y empaquetar la IA como &lt;strong>MAP&lt;/strong> versionado refuerza la reproducibilidad: se sabe exactamente qué artefacto se ejecutó. Una auditoría de configuración se convierte así en una consulta al historial, con capacidad de reconstruir qué estaba desplegado en una fecha dada.&lt;/p>
&lt;h2 id="la-pieza-que-lo-ata-todo-isoiec-42001">La pieza que lo ata todo: ISO/IEC 42001&lt;/h2>
&lt;p>Todo lo anterior son controles técnicos que satisfacen requisitos concretos. Pero las normas también exigen un sistema de gestión que los ordene, evalúe y mejore de forma continua, con roles y responsabilidades definidos. Esa pieza es &lt;strong>ISO/IEC 42001&lt;/strong>, la norma certificable de sistemas de gestión de IA: la que transforma &amp;ldquo;tenemos los controles&amp;rdquo; en &amp;ldquo;tenemos una IA gobernada y demostrable&amp;rdquo;. Es, precisamente, el contenido del curso de Sistemas de Gestión de IA que publicaremos en breve, pensado para acompañar el salto de la implementación técnica a la gobernanza certificable.&lt;/p>
&lt;h2 id="visión-del-sector-a-junio-de-2026">Visión del sector a junio de 2026&lt;/h2>
&lt;p>Vale la pena fijar la foto del momento, porque varias corrientes han convergido justo ahora y condicionan cualquier decisión de plataforma.&lt;/p>
&lt;p>&lt;strong>Todo lo de IA converge en Kubernetes.&lt;/strong> La propia CNCF lo describió en 2026 como &amp;ldquo;la gran migración&amp;rdquo;: las plataformas de IA, antes dispersas en soluciones propietarias, se están consolidando sobre Kubernetes como sustrato común. La consecuencia práctica es que las capacidades antes reservadas a sistemas HPC —gang scheduling, conciencia de topología, integración con fabric de red— son ya ciudadanas de primera en Kubernetes.&lt;/p>
&lt;p>&lt;strong>La asignación de aceleradores se estandariza.&lt;/strong> Con &lt;strong>DRA en disponibilidad general&lt;/strong> (Kubernetes 1.34) el modelo viejo de &amp;ldquo;contar GPU&amp;rdquo; da paso a la asignación por atributos del dispositivo, con particionado dinámico. Es un cambio de fondo en cómo se reparte el hardware caro, y nuestros clústeres (v1.35) ya están en la rama donde esto es real.&lt;/p>
&lt;p>&lt;strong>Aparecen sellos de conformidad para IA.&lt;/strong> El &lt;strong>CNCF Kubernetes AI Conformance&lt;/strong> (lanzado en noviembre de 2025, con los KARs) define qué hace &amp;ldquo;AI-ready&amp;rdquo; a un clúster, y en 2026 incorpora la línea de &lt;strong>Sovereign AI&lt;/strong>: sandboxing reforzado y privacidad del dato como requisitos formales. Para sanidad esto es enorme, porque convierte la soberanía del dato —que veníamos defendiendo por obligación legal— en una propiedad certificable de la plataforma.&lt;/p>
&lt;p>&lt;strong>La IA médica de imagen tiene su estándar de empaquetado.&lt;/strong> &lt;strong>MONAI Deploy&lt;/strong> y el &lt;strong>MAP&lt;/strong> maduran como la forma estándar de construir, validar y ejecutar aplicaciones de imagen médica, con Kubernetes como destino y DICOM/FHIR como contrato. Quien despliega IA de imagen seria en 2026 mira hacia MAP, no hacia integraciones a medida.&lt;/p>
&lt;p>&lt;strong>La regulación entra en su ventana de aplicación.&lt;/strong> El &lt;strong>EHDS&lt;/strong> está en vigor desde marzo de 2025 y sus hitos se acercan: organismos de acceso a datos hacia 2027, uso primario transfronterizo hacia 2029, todo perfilado sobre FHIR R4. El &lt;strong>AI Act&lt;/strong> vio sus plazos de alto riesgo aplazados por el &lt;em>Digital Omnibus&lt;/em> (Anexo III a diciembre de 2027, Anexo I a agosto de 2028), pero sus obligaciones —gestión de riesgos, logging, supervisión humana— no se mueven. Y la transición &lt;strong>FHIR R4 → R6&lt;/strong> se planifica saltando R5. La foto es la de un sector donde la técnica (Kubernetes, eBPF, DRA, MAP) y la norma (EHDS, AI Act, IHE) por fin avanzan a la vez.&lt;/p>
&lt;p>&lt;strong>La economía de la GPU empuja hacia dentro de casa.&lt;/strong> El recurso sigue siendo escaso y caro, y eso tiene dos efectos que se refuerzan. Por un lado, la presión por la eficiencia —utilización, fragmentación, densidad— es máxima, y por eso el scheduling (Volcano) y la asignación por atributos (DRA) están en el centro del debate. Por otro, la maduración de los &lt;strong>modelos de pesos abiertos&lt;/strong>, que rinden cada vez mejor en hardware modesto, ha hecho viable servir inferencia de calidad en local sin depender de una API externa. La combinación —modelos abiertos competentes más herramientas de eficiencia sobre Kubernetes— es justo la que convierte la soberanía del dato, en sanidad, de aspiración costosa a opción razonable. La tendencia de 2026 no es solo &amp;ldquo;IA en la nube&amp;rdquo;; es también un regreso pragmático del cómputo a infraestructura propia donde el dato y el coste lo exigen.&lt;/p>
&lt;p>Dónde estamos nosotros en esa foto: con la plataforma sobre Kubernetes, eBPF como sustrato de red y seguridad, scheduling de GPU madurando en preproducción, inferencia soberana por diseño, trazabilidad en formato auditable y el marco de gestión (ISO 42001) como siguiente paso. No perseguimos la moda; estamos exactamente en la línea por donde el sector ha decidido avanzar.&lt;/p>
&lt;h2 id="resumen-requisito-por-requisito">Resumen: requisito por requisito&lt;/h2>
&lt;p>La tesis es simple: cada norma o estándar del sector impone un requisito, y cada requisito se satisface con una pieza concreta de la infraestructura. La interoperabilidad del EHDS y los perfiles IHE, con una capa FHIR R4 + DICOMweb y, para la IA de imagen, el empaquetado MAP. El acceso mínimo y autorizado del RGPD/ENS y la autenticación de ATNA, con Keycloak, SMART on FHIR y mTLS. La confidencialidad y la prevención de fugas del art. 32, con multitenancy, Cilium en default-deny y Tetragon. La soberanía del dato (RGPD/EHDS y CNCF Sovereign AI), con inferencia local viable gracias a la eficiencia de Volcano. El logging y la supervisión del AI Act y la auditoría de ATNA/BALP, con trazabilidad en formato FHIR AuditEvent. La operación reproducible del ENS y el MDR, con GitOps y MAP versionado. Y la gobernanza que lo ata todo, con ISO 42001.&lt;/p>
&lt;p>No es un PowerPoint: es infraestructura que corre, que cumple y que —por ser infraestructura— se mide por eficiencia y coste. De eso, del control de costes de una plataforma de IA sanitaria, va el próximo artículo.&lt;/p>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.hl7.org/fhir/">HL7 FHIR — especificación y versiones&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://hl7.org/fhir/smart-app-launch/">SMART App Launch (SMART on FHIR) v2&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://profiles.ihe.net/ITI/TF/Volume1/ch-9.html">IHE — Audit Trail and Node Authentication (ATNA)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://profiles.ihe.net/ITI/BALP/index.html">IHE — Basic Audit Log Patterns (BALP) con FHIR AuditEvent&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.dicomstandard.org/using/dicomweb">DICOMweb — DICOM Standard&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Project-MONAI/monai-deploy/blob/main/guidelines/monai-application-package.md">MONAI Deploy y MONAI Application Package (MAP)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/cncf/k8s-ai-conformance">CNCF — Certified Kubernetes AI Conformance&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/">Kubernetes — Dynamic Resource Allocation (DRA)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://volcano.sh/en/docs/">Volcano — scheduling batch (CNCF)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cilium.io/">Cilium y Tetragon (eBPF)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/european-health-data-space-regulation-ehds_en">Reglamento (UE) 2025/327 — EHDS&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://artificialintelligenceact.eu/">EU AI Act (Reglamento (UE) 2024/1689)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.iso.org/standard/81230.html">ISO/IEC 42001 — Sistemas de gestión de IA&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>