Keywords: Kubernetes | YAML Error | Indentation Issues
Abstract: This article provides an in-depth analysis of the common 'error converting YAML to JSON: did not find expected key' error in Kubernetes YAML files. Through specific case studies, it examines root causes such as indentation issues and structural errors, offers guidance on using yamllint tools and manual debugging methods, and helps developers master YAML syntax to ensure the correctness of Kubernetes resource configuration files.
Analysis of YAML Syntax Errors and Debugging Methods
In Kubernetes deployment processes, syntax errors in YAML files are common issues. When the system reports error converting YAML to JSON: yaml: line 34: did not find expected key, it typically indicates that the YAML parser encountered structural problems at the specified line number. Such errors often stem from inconsistent indentation, malformed key-value pairs, or disorganized nested structures.
Case Study of Specific Errors
The following is a typical erroneous YAML file example containing multiple indentation issues:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
spec:
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: php-config
configMap:
name: php-config
containers:
- image: php-fpm:7.2
name: php
ports:
- containerPort: 9000
volumeMounts:
- name: persistent-storage
mountPath: /var/www/data
- name: php-config
mountPath: /usr/local/etc/php-fpm.d/www.conf
subPath: www.conf
- image: nginx:latest
name: nginx
- containerPort: 80
volumeMounts:
- name: persistent-storage
mountPath: /var/www/data
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: nfs-pvcKey issues include: erroneous nesting of the spec key under selector, and incorrect indentation for ports and volumeMounts in the second container of the containers list. YAML relies on strict indentation to define hierarchical structures, typically using two spaces per indentation level.
Automated Detection with yamllint Tool
yamllint is a command-line tool specifically designed for checking YAML file syntax and style. Installation methods include:
npm install -g yaml-lintOr using npx for temporary execution:
npx yaml-lint yamllint file_nameAfter running yamllint filename.yaml, the tool outputs detailed error messages and repair suggestions, such as pointing out indentation levels, missing keys, or extraneous characters.
Manual Debugging and Correction Strategies
Beyond tool assistance, developers should master manual inspection methods for YAML files:
- Check indentation line by line: Ensure all sibling elements are aligned, using consistent indentation characters (spaces instead of tabs).
- Verify key-value pair formats: Each key should be followed by a colon and space; values, especially strings containing special characters, may require quotation marks.
- Inspect list and mapping structures: List items start with
-, and mapping key-value pairs must be correctly nested.
Referencing other cases, such as valueFROM should be valueFrom in MongoDB deployment files, or unquoted strings in Helm templates causing parsing errors, underscores the importance of attention to detail.
Corrected YAML Example
Based on the above analysis, the corrected Deployment configuration should be as follows:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: php-config
configMap:
name: php-config
- name: persistent-storage
persistentVolumeClaim:
claimName: nfs-pvc
containers:
- image: php-fpm:7.2
name: php
ports:
- containerPort: 9000
volumeMounts:
- name: persistent-storage
mountPath: /var/www/data
- name: php-config
mountPath: /usr/local/etc/php-fpm.d/www.conf
subPath: www.conf
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
volumeMounts:
- name: persistent-storage
mountPath: /var/www/data
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.confKey corrections include: moving spec under template, adjusting indentation for volumes and containers, and ensuring each container has a complete ports definition.
Preventive Measures and Best Practices
To avoid similar errors, it is recommended to: use editors that support YAML syntax highlighting and validation (such as VS Code), regularly run yamllint during writing, follow YAML structure specifications in official Kubernetes documentation, and test complex configurations in segments. Mastering these skills will significantly improve the efficiency and reliability of Kubernetes resource management.