KYAML: Convergencia entre la robustez de JSON y la flexibilidad de YAML en Kubernetes

22 January 2026 · 4 min lectura

En la gestión operativa de Kubernetes, la definición de manifiestos ha oscilado históricamente entre dos extremos. Por un lado, YAML, el estándar de facto, ofrece legibilidad humana pero es intrínsecamente frágil debido a su dependencia de la indentación y la ambigüedad en el tipado de datos. Por otro lado, JSON, preferido por las máquinas por su estructura estricta, carece de soporte para comentarios y obliga a la definición monolítica de objetos, lo que dificulta su mantenimiento en entornos complejos gestionados por herramientas como Helm o Kustomize.

Con la llegada de Kubernetes 1.35, se consolida una solución que unifica las mejores características de ambos formatos: KYAML.

¿Qué es KYAML?

KYAML no es un nuevo lenguaje, sino la adopción estandarizada del estilo de flujo (flow style) de YAML. Su sintaxis se caracteriza por el uso explícito de delimitadores:

  • Objetos: Encapsulados en llaves {}.
  • Arrays: Definidos mediante corchetes [].
  • Tipado: Exige que todos los valores de tipo string estén delimitados por comillas dobles ("").

Esta aproximación elimina la ambigüedad del parseo sin sacrificar la ergonomía del desarrollador.

Beneficios Técnicos y Operativos

La adopción de KYAML impacta directamente en la estabilidad de los pipelines de CI/CD y en la experiencia de desarrollo (DevEx):

  1. Integridad Estructural: Al utilizar bloques delimitados ({} y []), el manifiesto se vuelve inmune a los errores de indentación. La estructura lógica prevalece sobre la visual, eliminando los fallos críticos provocados por espacios en blanco errantes durante operaciones de copy-paste.
  2. Capacidad de Documentación: A diferencia de JSON, KYAML conserva la capacidad de YAML para incluir comentarios (#). Esto es vital para documentar decisiones de infraestructura (ej. requests/limits, magic numbers) directamente en el código.
  3. Seguridad de Tipos: La obligatoriedad de comillas para los strings mitiga errores de coerción de tipos implícita (como el conocido caso del código de país “NO” interpretado como booleano false en YAML 1.1).

Estado de Madurez y Adopción

La transición a KYAML está diseñada para ser transparente y de baja fricción:

  • Retrocompatibilidad: kubectl procesa KYAML nativamente, ya que cumple con la especificación YAML existente.
  • Sin cambios en la extensión: Los ficheros mantienen la extensión .yaml, facilitando la integración con herramientas de linting y validación actuales.
  • Soporte Nativo en v1.35: Kubernetes 1.35 introduce soporte explícito en el CLI. Ahora es posible serializar objetos existentes al nuevo formato mediante kubectl ... -o kyaml.
  • Soporte en IDEs: Editores modernos como VSCode o Cursor interpretan la sintaxis correctamente, aunque la diferenciación visual (coloreado de sintaxis) entre claves y valores aún tiene margen de mejora en el ecosistema de extensiones.

Implementación Práctica: YAML vs. KYAML

A continuación, se contrasta la definición de un objeto Deployment en ambos formatos. Estos ejemplos están disponibles en el repositorio de referencia erase-una-vez-k8s/encodings.

Formato Clásico (Block Style)

Dependiente de la indentación y verticalidad:

# fragmento de manifiesto en formato YAML (Block Style)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: erase-una-vez-2-prod
  labels:
    app: erase-una-vez-2
    env: prod
    tier: frontend
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 25%
  selector:
    matchLabels:
      app: erase-una-vez-2
  template:
    metadata:
      labels:
        app: erase-una-vez-2
    spec:
      containers:
      - name: server
        image: ghcr.io/mmorejon/erase-una-vez-2:v0.5.0

        ports:
        - containerPort: 8000
          name: http

        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 256Mi

Formato KYAML (Flow Style)

Estructurado, compacto y con tipado explícito:

# fragmento de manifiesto en formato KYAML (Flow Style)
apiVersion: "apps/v1"
kind: "Deployment"
metadata: {
  name: "erase-una-vez-2-prod",
  labels: { app: "erase-una-vez-2", env: "prod", tier: "frontend" }
}
spec: {
  replicas: 3,
  strategy: {
    type: "RollingUpdate",
    rollingUpdate: { maxUnavailable: 1, maxSurge: "25%" }
  },
  selector: {
    matchLabels: { app: "erase-una-vez-2" }
  },
  template: {
    metadata: {
      labels: { app: "erase-una-vez-2" }
    },
    spec: {
      containers: [
        {
          name: "server",
          image: "ghcr.io/mmorejon/erase-una-vez-2:v0.5.0",

          ports: [{ containerPort: 8000, name: "http" }],
          resources: {
            requests: { cpu: "100m", memory: "128Mi" },
            limits:   { cpu: "500m", memory: "256Mi" }
          }
        }
      ]
    }
  }
}

KYAML en la práctica

Primero necesitas un clúster con la versión 1.35. Puedes utilizar el repositorio erase-una-vez-k8s para levantar un clúster local compatible en cuestión de segundos (aproximadamente 40 segundos).

git clone https://github.com/mmorejon/erase-una-vez-k8s.git
cd erase-una-vez-k8s
./bash/cluster.sh create

Garantiza el estés utilizando la versión 1.35 de kubectl:

kubectl version --client

Client Version: v1.35.0
Kustomize Version: v5.7.1

Una vez tengas el clúster, envía el manifiesto en formato KYAML a tu clúster:

kubectl apply --filename https://raw.githubusercontent.com/mmorejon/erase-una-vez-k8s/refs/heads/main/encodings/kyaml/deployment.yaml

deployment.apps/erase-una-vez-2-prod created

Verifica que el deployment se ha creado correctamente:

kubectl get deployment erase-una-vez-2-prod

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
erase-una-vez-2-prod   3/3     3            3           33s

Aprovecha esta oportunidad para exportar el manifiesto en formato KYAML:

kubectl get deployment erase-una-vez-2-prod -o kyaml

KYAML representa el siguiente paso lógico en la madurez de la configuración de Kubernetes: la precisión que exigen las máquinas con la flexibilidad que necesitan los humanos.

comments powered by Disqus