web-dev-qa-db-ja.com

このコンテキストではマッピング値は許可されていません

私は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ファイルのフォーマットは正常だと思います。

このエラーの原因は何ですか?

5
Westporch

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自体としては明らかに無効です。

3
Anthon

このようなエラーが発生するほとんどの場合(一般的で意味のある用語で言えば)は、次のいずれかが原因です。

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

1
Suhas Chikkanna

デフォルトでは、「kubernetes.io/hostname」は 既知のラベル であり、IPアドレスではなくノードの名前が含まれています。これは、$ kubectl get nodes --show-labelsを実行して確認できます。そのため、次の変更を行うことをお勧めします。

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

前述のように、nodeSelectorはそのような値を持つことはできません。キーと値のペアのマップを指定します。特定の使用法の詳細については、 ここ を参照してください。たとえば、nodeSelectorの適切な使用法は次のとおりです。

    nodeSelector:
       disktype: ssd
0
jzeef