Je fais un laboratoire sur Kubernetes dans Google Cloud.
J'ai créé le fichier YAML, mais lorsque j'essaie de le déployer, un shell me montre cette erreur:
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-pvc
Fichier YAML:
error converting YAML to JSON: yaml: line 34: did not find expected key
5 Réponses :
Le fichier global semble bon. Il y a des problèmes d'indentation, je suppose.
Fichier YAML
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 # looks like indentation issue here mountPath: /var/www/data - name: php-config # looks like indentation issue here 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-pvc
Là, je pensais que les problèmes d'indentation avaient été laissés pour compte avec FORTRAN à l'ère des cartes perforées. Si seulement les gens revenaient à leurs sens et utilisaient des TABS et non des espaces! :)
Le paquet yamllint est utile pour déboguer et trouver ce genre d'erreurs, il suffit de faire yamllint filename
et il yamllint filename
les problèmes possibles qu'il trouve. Installez via votre gestionnaire de paquets de distribution (généralement recommandé si disponible) ou via la commande npm install ci-dessous (elle sera installée globalement)
npm install -g yaml-lint
Merci à Kyle VG pour la commande npm
Pour les utilisateurs d'Ubuntu sudo apt-get update && sudo apt-get install yamllint -y
.
J'ai eu cette erreur lors de la création d'un fichier yaml pour une Ingress
aide de Helm. J'avais quelque chose comme ça comme spécification Ingress
- {{ .Values.ingress.host | quote }}
et dans les valeurs.yaml
ingress: host: "[NAMESPACE]-example.com"
Il s'est avéré que les crochets étaient à l'origine de l'erreur.
Le problème peut être résolu en mettant des guillemets sur la valeur à l'aide de la fonction de quote
.
spec: tls: - hosts: - {{ .Values.ingress.host }}
C'est aussi ce que recommande le doc Helm
Le moyen le plus simple d'éviter les erreurs de conversion de type est d'être explicite sur les chaînes et implicite sur tout le reste. Ou, en bref, citez toutes les chaînes.
et ici
Lorsque vous travaillez avec des données de chaîne, il est toujours plus sûr de citer les chaînes que de les laisser sous forme de mots nus:
Merci beaucoup. C'est exactement ce qui m'est arrivé lorsque j'essaye de charger le contenu de mon fichier dans configmap.
Suite à la réponse de higuita
, vous pouvez lint votre yaml et vérifier les erreurs sans installer un module dans votre machine en utilisant npx . Je préfère cette approche pour les commandes que je n'ai pas l'intention d'utiliser souvent. NPX télécharge le package, exécute la commande et supprime le package une fois terminé.
npx yaml-lint yamllint file_name
Pour les utilisateurs d'Ubuntu sudo apt-get update && sudo apt-get install yamllint -y
.
Bien que le fichier yaml ci-dessus ait l'air correct, l'indentation était le problème (ce qui est à peine visible en regardant le fichier). Un autre problème qui pourrait provoquer cette erreur est un problème avec le fichier, tel qu'un nom de champ manquant ou un collon.