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?
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.
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
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
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