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):
- 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. - 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. - 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
falseen 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:
kubectlprocesa 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