私はYAML形式とkubernetesの初心者です。
以下は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
---
しかし...私が実行したときkubectl create -f dep_prom.yml
エラー:YAMLからJSONへの変換エラー:yaml:行47:このコンテキストではマッピング値は許可されていません
行47はnodeSelectorです:westporch-kubeminion-1
YAMLファイルのフォーマットは正常だと思います。
このエラーの原因は何ですか?
YAML形式は正常であると思われますが、正常ではありません。これは、最初のドキュメントの最後の行がkubernetes.io/hostname
で始まり、その前の行に相対的にインデントされているために発生するYAMLエラーです。これらはどちらもキーと値のペアの行(つまり、ブロックスタイルのマッピングのアイテムのペア)なので、
nodeSelector: westporch-kubeminion-1
kubernetes.io/hostname: 10.0.24.52
あなたはどちらかをする必要があります:
nodeSelector: westporch-kubeminion-1
kubernetes.io/hostname: 10.0.24.52
しかし、nodeSelector
は、現在持っているスカラーwestporch-kubeminion-1
ではなく、引数としてマッピングを必要とする可能性があります。
nodeSelector:
kubernetes.io/hostname: 10.0.24.52
このエラーは、kubernetesの許容度によっては、ファイル内の2番目のエラーをマスクする場合があります。 ---
はディレクティブの終了マーカーであり、ディレクティブはオプションであるため、YAMLドキュメントの先頭で発生する可能性があります。例の下部にあるものは、新しいドキュメントの開始を示しています。最初のエラーに対処すると、それに基づいて単一のドキュメントに関する警告が表示される場合があります。 (ドキュメントの終わりマーカーは、3つのドットで構成されています:...
は行の先頭にあり、その後に空白が続きます。
もちろん、変更を加える場合は、kubernetesが予期していることを確認する必要がありますが、上記のストリームはYAML自体としては明らかに無効です。
このようなエラーが発生するほとんどの場合(一般的で意味のある用語で言えば)は、次のいずれかが原因です。
1)。 yamlファイルの構文エラー(あなたの場合はそうではありません)。
2)。または、「値のマッピングはこのコンテキストでは許可されていません」というエラーのように。これは、yamlで使用したキー/値は構文的には正しいが、意味的には正しくない可能性があることを意味します。
たとえば、あなたの場合、コンテキストは「apiversion:extensions/v1beta1」に属する「デプロイメント」であり、ノードセレクターが以下のようになることを期待しています:-
nodeSelector:
kubernetes.io/hostname: 10.0.24.52
上記のようなIPではなく、次のようなキーと値のペアを使用するのが理想的です:-topologyKey: failure-domain.beta.kubernetes.io/zone
ORあなたの場合、次のようになります:-kubernetes.io/hostname: zone-a-node
デフォルトでは、「kubernetes.io/hostname」は 既知のラベル であり、IPアドレスではなくノードの名前が含まれています。これは、$ kubectl get nodes --show-labels
を実行して確認できます。そのため、次の変更を行うことをお勧めします。
nodeSelector:
kubernetes.io/hostname: westporch-kubeminion-1
前述のように、nodeSelectorはそのような値を持つことはできません。キーと値のペアのマップを指定します。特定の使用法の詳細については、 ここ を参照してください。たとえば、nodeSelectorの適切な使用法は次のとおりです。
nodeSelector:
disktype: ssd