21
votes

erreur de conversion de YAML en JSON, impossible de trouver la clé attendue kubernetes

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


0 commentaires

5 Réponses :


16
votes

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


1 commentaires

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! :)



18
votes

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


1 commentaires

Pour les utilisateurs d'Ubuntu sudo apt-get update && sudo apt-get install yamllint -y .



4
votes

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:


1 commentaires

Merci beaucoup. C'est exactement ce qui m'est arrivé lorsque j'essaye de charger le contenu de mon fichier dans configmap.



4
votes

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


1 commentaires

Pour les utilisateurs d'Ubuntu sudo apt-get update && sudo apt-get install yamllint -y .



0
votes

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.


0 commentaires