Extender InSpec para Kubernetes CRDs con ayuda de IA
Un ingeniero de plataforma que escribía tests de compliance con InSpec se topó con un problema conocido: el resource pack de Kubernetes no sabe validar CRDs modernos como los de Gateway API. Cuando le pidió ayuda a una IA, esta le inventó un recurso que no existe. Recién con Claude logró construir la abstracción real para extender InSpec para Kubernetes CRDs. El caso, publicado el 6 de julio de 2026 en dev.to, deja una lección clara sobre cómo (y cuándo) confiar en la IA.
InSpec es un framework open source de compliance-as-code de Chef que permite escribir tests legibles para auditar infraestructura, servidores y clusters. Un CRD (Custom Resource Definition) es una extensión de la API de Kubernetes que define recursos propios más allá de los nativos, como los que introduce el estándar Gateway API. El problema es que el resource pack de Kubernetes de InSpec no incorporó helpers para validarlos.
En 30 segundos
- El gap real: el resource pack de Kubernetes de InSpec no evolucionó al ritmo de estándares como Gateway API y le faltan bloques para validar CRDs.
- La alucinación: una IA sugirió el recurso
k8s_custom_resource_definition, que no existe en InSpec. El loop parecía limpio, pero fallaba. - El giro: Claude, en vez de solo disculparse, ayudó a construir la abstracción correcta para leer CRDs sin ensuciar el código.
- Las malas alternativas: Ruby crudo, shell-out a kubectl vía command resources o parsear JSON a mano rompen la expresividad del compliance-as-code.
- La moraleja: la IA acelera, pero vos verificás que la API o el comando que te propone exista de verdad.
¿Por qué InSpec no valida los CRDs modernos de Kubernetes?
Si alguna vez escribiste compliance tests para un cluster, sabés que la promesa de InSpec es buenísima: describís lo que esperás en un lenguaje casi humano y el framework chequea si la infra cumple. El tema es que su resource pack de Kubernetes quedó medio congelado en el tiempo.
El autor lo cuenta sin vueltas en su nota en dev.to: trabajás con arquitecturas cloud-native de verdad, querés testear algo del estándar Gateway API (esos recursos con nombre gateway.networking.k8s.io) y te das cuenta de que faltan los bloques fundamentales. Las librerías de infraestructura suelen estar en ese limbo: útiles, pero con los bordes ásperos.
Un CRD es la forma que tiene Kubernetes de dejarte inventar tus propios tipos de recursos. Operadores, políticas de red custom, gateways: todo eso vive en CRDs. Y si tu herramienta de compliance no los entiende, tenés un agujero justo donde más necesitás controlar. Para más detalles técnicos, mirá proteger secretos en pipelines CI/CD.
¿Qué pasó cuando la IA “resolvió” el problema sin verificar?
Acá viene lo bueno. Cuando el ingeniero se sentó a generar los tests con un modelo de IA, este le escupió exactamente lo que quería ver. Un loop prolijo, intuitivo, natural. Algo así:
expected_standard_crds.each do |crd|
describe k8s_custom_resource_definition(name: 'gateway.networking.k8s.io') do
it { should exist }
end
endSe veía impecable. Había un solo detalle: k8s_custom_resource_definition no existe en el resource pack de Kubernetes de InSpec. El modelo alucinó el wrapper de la API completo. Se lo inventó con toda la confianza del mundo.
¿Por qué pasa esto? Los modelos predicen la respuesta más probable, no la más verdadera. Un recurso llamado k8s_custom_resource_definition es lo que “debería” existir por coherencia con el resto de la API, así que el modelo lo genera. Suena bien, encaja con el patrón, y por eso engaña. Normalmente este es el punto donde suspirás y te preparás para un workaround feo.
¿Cómo ayudó Claude a construir la abstracción real?
El giro interesante es lo que pasó cuando el autor llevó el problema a Claude, el LLM de Anthropic. No se quedó en el “perdón, me equivoqué”. Ayudó a diseñar la abstracción que faltaba, en vez de tapar el agujero con cinta. Te puede servir nuestra cobertura de elegir entre las plataformas CI/CD modernas.
Y eso importa porque las salidas fáciles eran todas malas. Estas son las tres que menciona el artículo y por qué duelen:
- Ruby crudo dentro del test: metés lógica imperativa en un archivo que debería ser declarativo. Adiós a la legibilidad.
- Shell-out a kubectl vía command resources: ejecutás comandos externos y dependés de que kubectl esté configurado en cada corrida. Frágil y lento.
- Parsear JSON crudo a mano: convertís tus controles limpios en un festival de
.digy strings. El compliance-as-code deja de leerse como compliance.
La idea que salió de esa charla fue encapsular la fealdad una sola vez, dentro de un custom resource de InSpec, para que los controles siguieran siendo expresivos. En criollo: escondés el kubectl o la llamada a la API adentro del recurso, y arriba seguís escribiendo tests legibles.
Pasos prácticos para extender InSpec para Kubernetes CRDs
Si querés replicar la idea en tu propio profile, la mecánica de un custom resource de InSpec es conocida. Va un esquema ilustrativo, no copiado del artículo, para que veas la forma:
- Creá el archivo del recurso: dentro de tu profile, en
libraries/, definís una clase Ruby que herede deInspec.resource(1). - Consultá el CRD una sola vez: en el constructor, resolvés el recurso (por API de Kubernetes o kubectl) y guardás el resultado parseado. La parte fea queda acá, aislada.
- Exponé matchers legibles: agregás métodos como
exists?oversionpara que el control final se lea natural. - Escribí el control como siempre: arriba, en tu archivo de controls, volvés a la sintaxis declarativa de siempre.
# libraries/k8s_crd.rb (esquema ilustrativo)
class K8sCrd < Inspec.resource(1)
name 'k8s_crd'
def initialize(opts = {})
@name = opts[:name]
# resolver el CRD una sola vez y guardarlo parseado
end
def exists?
# true si el CRD está presente en el cluster
end
endLa clave es esa: la lógica sucia entra una vez, en un lugar, y el resto de tu suite de compliance no se entera. Lo explicamos a fondo en seleccionar tu herramienta de automatización.
¿Cuándo es crítico validar CRDs en tu cluster?
No en todos los clusters hace falta este nivel de detalle. Pero hay escenarios donde no validar CRDs es jugar a la ruleta.
- Clusters multi-tenant: varios equipos comparten infra y cada uno instala sus operadores. Chequear que los CRDs correctos existan evita sorpresas en producción.
- Configuraciones de Gateway API: el mismo caso del artículo. Si tu ingreso de tráfico depende de
gateway.networking.k8s.io, querés confirmar que esté declarado antes de rutear nada. - Security policies custom: operadores de políticas que definen sus propios CRDs. Si el CRD no está, la política no aplica, y vos creés que estás protegido cuando no lo estás.
Este tipo de infraestructura suele vivir en un VPS o cloud gestionado, así que si estás armando el stack desde cero conviene arrancar sobre un proveedor con soporte serio en español, como donweb.com, y dejar los tests de compliance corriendo desde el día uno.
¿Qué otras herramientas sirven para compliance en Kubernetes?
InSpec no es la única opción. Cada herramienta tiene su lugar, y la elección depende de si querés auditar (validar después) o hacer enforcement (bloquear antes). Acá va la comparación:
| Herramienta | Enfoque | Lenguaje | Fuerte en |
|---|---|---|---|
| InSpec + extensión | Auditoría / compliance-as-code | DSL Ruby legible | Tests expresivos y reportes de compliance |
| OPA / Rego | Policy engine general | Rego | Políticas flexibles, admission control |
| Kyverno | Policy engine nativo K8s | YAML | Curva baja, sin lenguaje nuevo |

OPA con Rego es potente pero verboso, y Rego tiene su propia curva de aprendizaje. Kyverno es más accesible porque usás YAML, algo que ya conocés si vivís en Kubernetes. InSpec brilla cuando lo que buscás es un reporte de compliance legible por humanos y auditores, no solo un bloqueo silencioso en el admission controller. Extenderlo, como muestra el caso, lo mantiene competitivo justo donde le faltaba aire.
Errores comunes al usar IA para tests de infraestructura
- Confiar en que la API sugerida existe: es el error del artículo. La IA propuso
k8s_custom_resource_definitiony no existía. Corrección: verificá el recurso contra la doc oficial del resource pack antes de correr nada. - Meter workarounds sucios por apuro: shell-out a kubectl dentro del test parece rápido, pero rompe la mantenibilidad. Corrección: encapsulá la lógica fea en un custom resource, una sola vez.
- No probar el test en un cluster real: un control que "se ve bien" puede pasar en falso. Corrección: corré la suite contra un cluster de staging con CRDs reales antes de confiar en el resultado.
- Tratar a la IA como oráculo, no como par: el modelo alucina con confianza. Corrección: usalo para diseñar la abstracción y después vos validás el detalle técnico.
Preguntas Frecuentes
¿InSpec soporta testing de CRDs en Kubernetes de fábrica?
No de forma nativa completa. El resource pack de Kubernetes de InSpec no incluye un helper listo para validar Custom Resource Definitions, según el caso publicado en dev.to el 6 de julio de 2026. Para lograrlo hay que extender InSpec con un custom resource propio. En conocer las capacidades de IA disponibles profundizamos sobre esto.
¿Cómo se extiende InSpec para validar recursos personalizados?
Se crea un custom resource en la carpeta libraries/ del profile, una clase Ruby que hereda de Inspec.resource(1). Ahí encapsulás la consulta al CRD una sola vez y exponés matchers legibles, para que los controles sigan siendo declarativos y expresivos.
¿Puede la IA ayudar a escribir tests de infraestructura?
Sí, pero como asistente, no como oráculo. En el caso documentado, Claude ayudó a diseñar la abstracción correcta para leer CRDs. El límite es que los modelos pueden alucinar APIs que no existen, así que el ingeniero tiene que verificar cada recurso o comando contra la documentación oficial.
¿Qué es una alucinación de IA en este contexto?
Es cuando el modelo genera código que parece correcto pero se apoya en algo inexistente, como el recurso k8s_custom_resource_definition que sugirió pero que no está en InSpec. Ocurre porque el modelo predice lo más probable, no lo verificado, y por eso el resultado suena coherente aunque falle.
¿Cuál es mejor para compliance en Kubernetes, InSpec u OPA?
Depende del objetivo. InSpec es ideal para auditoría y reportes de compliance legibles por humanos, mientras que OPA con Rego apunta a enforcement de políticas y admission control. No se excluyen: muchos equipos usan OPA o Kyverno para bloquear e InSpec para auditar y documentar.
Conclusión
Lo que cambió con este caso es la forma de ver a la IA en DevOps. No es la máquina que resuelve sola, tampoco un juguete inútil. Es un par que acelera el diseño y que, si no lo controlás, te clava una API inventada con cara de póker. La diferencia entre un workaround feo y una abstracción limpia estuvo en el ingeniero que supo pedir bien y verificar mejor.
Si trabajás con Kubernetes y usás InSpec, la acción concreta es clara: cuando te falte un bloque para validar CRDs, extendé el framework con un custom resource en vez de romper la expresividad de tus tests. Y cada vez que una IA te sugiera un recurso, chequealo contra la doc antes de correrlo. Ese hábito, aburrido y todo, es lo que separa una suite de compliance confiable de una que pasa en falso.






