web-dev-qa-db-fra.com

les valeurs de mappage ne sont pas autorisées dans ce contexte

Je suis novice en ce qui concerne le format YAML et les kubernetes.

Ce qui suit est un fichier dep_prom.yml .

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    name: prometheus-deployment
  name: prometheus
  #namespace: prometheus
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus:master
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "-config.file=/etc/prometheus/prometheus.yml"
        - "-storage.local.path=/prometheus"
        - "-storage.local.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: "/prometheus"
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      volumes:
      - name: data
        hostPath:
          path: /data/prometheus
      - name: config-volume
        configMap:
          name: prometheus
      nodeSelector: westporch-kubeminion-1
        kubernetes.io/hostname: 10.0.24.52
---

Cependant ... Quand j'ai exécuté kubectl create -f dep_prom.yml

erreur: erreur lors de la conversion de YAML en JSON: yaml: ligne 47: les valeurs de mappage ne sont pas autorisées dans ce contexte

La ligne 47 est nodeSelector: westporch-kubeminion-1

Je pense que le format de fichier YAML est normal.

Qu'est ce qui cause cette erreur?

5
Westporch

Vous indiquez que vous pensez que le format YAML est normal, mais ce n'est pas le cas. Il s'agit d'une erreur YAML provoquée par la ligne à la fin du premier document, commençant par kubernetes.io/hostname étant en retrait par rapport à celui précédent. Parce que ce sont deux lignes de paires clé-valeur (c'est-à-dire des paires d'éléments d'un mappage de style bloc) au lieu de

      nodeSelector: westporch-kubeminion-1
        kubernetes.io/hostname: 10.0.24.52

vous devez soit faire:

      nodeSelector: westporch-kubeminion-1
      kubernetes.io/hostname: 10.0.24.52

mais il se peut que nodeSelector ait besoin d'un mappage comme argument au lieu du scalaire westporch-kubeminion-1 il a maintenant.

      nodeSelector:
        kubernetes.io/hostname: 10.0.24.52

Cette erreur peut en masquer une seconde dans le fichier, en fonction de la clémence des kubernetes. Le --- est le marqueur de fin de directives et comme les directives sont facultatives, elles peuvent apparaître au début d'un document YAML. Celui au bas de votre exemple indique le début d'un nouveau document. Une fois que vous avez corrigé la première erreur, vous pouvez recevoir un avertissement concernant des documents uniques basés sur cela. (Le marqueur de fin de document se compose de trois points: ... au début d'une ligne suivie d'un espace.

Bien sûr, toutes les modifications que vous apportez doivent confirmer ce à quoi Kubernetes s'attend, mais le flux ci-dessus n'est clairement pas valide en tant que YAML en soi.

3
Anthon

La plupart du temps, lorsque vous obtenez une erreur comme celle-ci (en termes généraux et significatifs), c'est soit à cause de: -

1). Une erreur de syntaxe (dans votre cas ce n'est pas le cas) dans le fichier yaml.

2). Ou comme l'erreur dit "les valeurs de mappage ne sont pas autorisées dans ce contexte". Cela signifie que les clés/valeurs que vous avez utilisées dans le yaml peuvent être syntaxiquement correctes mais pas sémantiquement.

Par exemple, dans votre cas, le contexte est "déploiement" qui appartient à "apiversion: extensions/v1beta1", et il s'attend à ce que le sélecteur de nœud soit comme ci-dessous: -

nodeSelector:
  kubernetes.io/hostname: 10.0.24.52

Idéalement, vous ne devriez jamais utiliser IP comme ci-dessus, mais une paire clé-valeur comme celle-ci: - topologyKey: failure-domain.beta.kubernetes.io/zone OR dans votre cas, cela peut ressembler à ceci: - kubernetes.io/hostname: zone-a-node

1
Suhas Chikkanna

Par défaut, 'kubernetes.io/hostname' est un étiquette bien connue qui contient le nom du nœud au lieu de son adresse IP. Cela peut être vérifié en exécutant $ kubectl get nodes --show-labels. À ce titre, je recommande d'apporter les modifications suivantes:

  nodeSelector: 
    kubernetes.io/hostname: westporch-kubeminion-1
1
Irina

Comme mentionné, nodeSelector ne peut pas avoir une valeur comme ça. Il s'agit de spécifier un mappage de paires clé-valeur. Vous pouvez en savoir plus sur l'utilisation spécifique ici . Par exemple, une utilisation correcte de nodeSelector peut être:

    nodeSelector:
       disktype: ssd
0
jzeef