Kubernetes: validar Deployment, Service e Ingress YAML en línea

Kubernetes: validar Deployment, Service e Ingress YAML en línea

Deployment, Service e Ingress: valida la estructura YAML antes de `kubectl apply` — comprobación local en el navegador, sin cluster ni kubectl.

07.09.2026
9 min de lectura
Compartir este artículo:
kubernetesk8sYAMLDevOpsValidaciónTutorial

Validar YAML de Kubernetes antes de `kubectl apply`

Un error tipográfico en apiVersion, un Deployment sin spec.selector.matchLabels o un Ingress sin pathType suele aparecer demasiado tarde, cuando la CI, un compañero o el servidor de la API rechaza el manifiesto. FastMinify no ejecuta kubectl, no habla con un clúster y no es kubeconform. El validador YAML Kubernetes aplica comprobaciones estructurales en el navegador: capa A (apiVersion, kind, metadata) más reglas propias de cada kind para Deployment, Service, Ingress y más. Combínalo con el formateador de manifiestos Kubernetes para un YAML de varios documentos legible. Toda la familia de herramientas está en el hub de herramientas Kubernetes, junto al hub DevOps de Compose, Terraform y Dockerfile.

Detectar incoherencias de apiVersion/kind y metadata que faltan antes del push
Comprobaciones por kind: selectores Deployment, puertos Service, pathType Ingress
YAML de varios documentos (`---`) validado documento a documento
100 % en el navegador: los manifiestos no se suben a un servidor
Límite 512 KiB UTF-8, igual que otras herramientas Kubernetes del sitio

Errores habituales y flujo antes de apply

Lo que la validación detecta con frecuencia

Algunos errores aparecen constantemente en manifiestos pegados, en la salida de Helm y en fragmentos de tutoriales.

Incoherencia apiVersion/kind (Deployment con `v1` en lugar de `apps/v1`)
Labels del selector de un Deployment que no coinciden con los del pod template
Container sin `image` tras un conflicto de fusión mal resuelto
Service con array `ports` vacío
Path Ingress sin `pathType` tras migración networking v1
La configuración vecina en el mismo proyecto

Un despliegue de Kubernetes rara vez viaja solo. Comprueba los manifiestos y pasa después el lint al build de la imagen y a la IaC que aprovisiona el clúster.

Valida Compose y `.env`, como se explica en validación Docker Compose y .env
Formatea el HCL de Terraform de la misma pila con Terraform y HCL en línea
Explora el hub Kubernetes para ver los generadores y los values de Helm
No pegues nunca secretos reales (tokens, kubeconfig, datos de Secret) en un campo de texto público
Trata el YAML validado como una fuente de Git: revisado, versionado y aplicado mediante la CI

Qué cambia entre validar, formatear, kubeconform y kubectl

Elegir la capa correcta

La validación en el navegador, el formateo, las herramientas de esquema OpenAPI y los dry-runs de clúster responden a preguntas distintas. Mezclarlos da una marca verde aquí y un job de CI en rojo después.

Herramienta / capa

format:FastMinify format-kubernetes
validate:FastMinify validate-kubernetes
minify:kubeconform / kubectl apply --dry-run

Qué demuestra

format:YAML legible, no corrección semántica
validate:GVK estructural y reglas por kind, no OpenAPI completo
minify:Aceptación por el esquema o el apiserver, lo que requiere una CLI o un clúster
Orden recomendado

Una secuencia sencilla detecta la mayoría de los errores tipográficos antes de que algo toque un clúster.

Formatear el manifiesto para indentación coherente
Validar estructura en el navegador (FastMinify)
Ejecutar kubeconform o `kubectl apply --dry-run=client` en la CI cuando importan los esquemas
Aplicar en un namespace de desarrollo y hacer una prueba de humo
Mantén los values de Helm aparte y formatéalos con formatear Helm values en lugar de con el formateador de manifiestos

Cuándo basta la herramienta del navegador

Escenarios habituales

No necesitas clúster ni kubeconfig para detectar tres errores estructurales en un manifiesto recibido en un ticket.

Revisar un trío de Deployment, Service e Ingress pegado desde Slack
Hacer una comprobación rápida de la salida de helm template antes de abrir una PR
Enseñar la forma del YAML de Kubernetes sin aprovisionar un clúster
Ayudar a un compañero que no puede ejecutar kubectl en local
Hacer un primer filtro de un manifiesto de proveedor o de tutorial antes de adaptarlo

Los límites de la herramienta del navegador y lo que no sustituye

kubeconform y `kubectl apply --dry-run`

Las herramientas CLI y el apiserver siguen siendo obligatorios en cuanto necesites validación de esquema OpenAPI contra una versión concreta de Kubernetes, esquemas CRD o políticas de admission webhook.

kubeconform con versión de esquema JSON Kubernetes fijada
`kubectl apply --dry-run=server` contra un apiserver real
Manifiestos CRD: FastMinify indica info para los kinds desconocidos, no el esquema CRD completo
Los motores de políticas (OPA, Kyverno) quedan fuera de la validación estructural
La conectividad de red, los image pull secrets y las cuotas de recursos solo se ven en ejecución
Lo que FastMinify no simula

El validador lee solo el YAML pegado. No resuelve charts de Helm ni expande overlays de Kustomize. Tampoco comprueba que un nombre de Service referenciado por un Ingress exista en otro documento.

Sin comprobaciones de referencias cruzadas entre bloques `---`
Sin `helm template` y sin `kustomize build`: pega la salida renderizada
Sin valores por defecto del namespace ni lógica de fusión del server-side apply
ConfigMap/Secret con data vacía → solo una advertencia (un marcador de posición es válido)
Por encima de 512 KiB UTF-8 la entrada se rechaza: divídela o usa herramientas CLI locales

CLI y ecosistema

Herramientas locales de referencia

kubeconform, kubectl y yamllint siguen siendo el estándar en la CI. FastMinify complementa la exploración y los usos puntuales.

kubeconform

Comprueba manifiestos contra los esquemas OpenAPI de Kubernetes (con versión fijada).

Ventajas:
Errores a nivel esquema con control de versión Kubernetes
Encaja en la CI y en los hooks de pre-commit
Admite CRD cuando se proporcionan los esquemas
Inconvenientes:
Requiere instalación y descarga de esquemas
Menos práctico para un único fragmento pegado

kubectl apply --dry-run=client

Dry-run en el cliente con validación local del esquema (depende de la versión de kubectl).

Ventajas:
Ya presente en la mayoría de los equipos de desarrollo
Salida conocida para los equipos que gestionan la plataforma
Se combina con un dry-run en un clúster real cuando está configurado
Inconvenientes:
Necesita kubectl y a menudo un contexto kubeconfig válido
El dry-run del cliente y el del servidor se comportan de forma distinta

yamllint

Linter YAML genérico para indentación y estilo.

Ventajas:
Reglas de indentación configurables
Útil más allá de Kubernetes (CI, Ansible…)
Integración en los editores
Inconvenientes:
No conoce la semántica de apiVersion/kind
No detecta las diferencias entre selector y template

Los manifiestos habituales, como Deployment, Service e Ingress

Forma mínima de un documento Kubernetes

Cada manifiesto es un mapping YAML con apiVersion, kind y metadata (name o generateName). FastMinify comprueba ese emparejamiento. Por ejemplo, Deployment espera apps/v1 y Service espera v1, mientras que Ingress espera networking.k8s.io/v1. Los grupos de API obsoletos como extensions/v1beta1 generan una advertencia, no un bloqueo.

Archivos de varios documentos: separa los recursos con `---`, y cada documento se valida de forma independiente
Los kinds desconocidos (CRD) reciben el nivel info: se omiten las reglas estructurales y metadata se sigue comprobando
apiVersion obsoleta → advertencia con pista para migrar el GVK
Una entrada vacía permanece en reposo y no se indica como «válida»
Los errores de análisis YAML incluyen una pista de línea cuando js-yaml la proporciona
Selector, template y containers en un Deployment

Un Deployment necesita un spec.selector.matchLabels no vacío y un array spec.template.spec.containers no vacío, y cada container debe declarar tanto name como image. FastMinify también comprueba que los valores de spec.selector.matchLabels coincidan con spec.template.metadata.labels. Es un error clásico de copiar y pegar que pasa el lint YAML, pero falla en ejecución.

Antes

apiVersion: apps/v1 kind: Deployment metadata: name: api spec: replicas: 2 selector: matchLabels: app: api template: metadata: labels: app: api-wrong spec: containers: - name: api image: myapp:1.0

Después

Corrige spec.template.metadata.labels.app para que coincida con spec.selector.matchLabels.app (ambos "api").
Selector que falta o matchLabels vacío → error
Container sin name o image → error con la ruta
selector_mismatch cuando los labels de la sección template no coinciden con el selector
El campo `replicas` debe ser un número cuando está presente
Crea un esqueleto con generar Deployment y luego comprueba el resultado
Puertos Service y pathType Ingress

Un Service debe declarar un array spec.ports no vacío, y cada puerto necesita port como número o como cadena IntOrString. Un Ingress con networking.k8s.io/v1 necesita spec.rules con http.paths. Cada path requiere path, pathType (Prefix, Exact o ImplementationSpecific) y backend.service.name más backend.service.port.number o port.name.

Service sin ports → error
Path Ingress sin pathType → error (frecuente tras migración v1)
Backend de Ingress sin nombre de Service o sin puerto → error
Combina Ingress con generar Ingress para obtener un esqueleto v1
Los values de Helm tienen otra forma: usa formatear Helm values en lugar del validador de manifiestos

Un flujo concreto para formatear, validar y generar

Usar el validador YAML Kubernetes

Abre la herramienta validar Kubernetes, pega o sube un archivo .yaml o .yml (máx. 512 KiB) y espera el debounce (~300 ms). El panel de resultados lista los problemas por nivel (error, advertencia, info) con path, un docIndex opcional para archivos de varios documentos y una línea cuando existe. Un resultado Válido con advertencias sigue mostrando problemas: lee las advertencias antes de fusionar.

Capa A: apiVersion, kind, metadata.name o generateName
Capa B: reglas estructurales por kind para kinds integrados
Se admite YAML de varios documentos, y docIndex indica qué bloque `---` falló
No es kubeconform, ni la OpenAPI del apiserver, ni políticas de admisión
Todo queda en local, sin cuenta y sin credenciales de clúster
Formatear los manifiestos antes de la revisión

La herramienta formatear Kubernetes reescribe manifiestos de varios documentos con js-yaml y una indentación de 2 o 4 espacios. Al pegar, subir o cargar el ejemplo, formatea sola. Tras una edición manual, usa el botón Formatear (⌘↵). Los comentarios YAML con # se pierden en la ida y vuelta: cópialos antes si los necesitas.

El `---` de varios documentos se conserva, a diferencia de los embellecedores genéricos de un solo documento
Los comentarios no se conservan, con un aviso discreto cuando la entrada probablemente los tenía
Encadena format → validate para diffs legibles y comprobaciones estructurales
YAML genérico fuera de K8s: embellecer YAML
Los archivos Compose no son manifiestos K8s: usa validar Docker Compose
Un Ingress sin pathType tras actualizar la API

Pasas de networking.k8s.io/v1beta1 a v1. El YAML se sigue analizando, pero cada path necesita un pathType explícito. El validador marca invalid_path_type antes de que desperdicies un paso de pipeline en kubectl apply.

Una apiVersion obsoleta da una advertencia: planifica la migración del GVK
pathType que falta o inválido → error con la ruta
Regenera un esqueleto v1 con generar Ingress si el archivo es sobre todo código repetitivo
Formatea primero para que los números de línea coincidan con tu editor
Para el YAML de CI del mismo repositorio, consulta lint workflow GitHub Actions

Conclusión

Validar la estructura de los manifiestos de Kubernetes antes de kubectl apply evita desperdiciar minutos de CI en errores tipográficos que el navegador puede detectar. Usa FastMinify como filtro estructural rápido: formatea para la legibilidad y comprueba después el GVK y las reglas por kind. Añade kubeconform o un dry-run en un clúster cuando importe el esquema real. Sigue en el hub de Kubernetes para generadores y values de Helm, y en el hub DevOps para Compose y Terraform.

Formatea el YAML de varios documentos antes de la revisión, porque los comentarios se pierden al formatear
Corrige pronto los pares apiVersion/kind y los labels selector/template
Trata las advertencias (API obsoleta, ConfigMap vacía) como bloqueadores de la fusión cuando importan
Ejecuta kubeconform o kubectl dry-run en la CI para comprobar el esquema real
No pegues nunca kubeconfig ni payloads de Secret en una herramienta en línea
Compartir este artículo
Compartir este artículo: