web-dev-qa-db-ja.com

「配列」の取得と「マップ」の予期に関するエラーを受け取りましたが、YAMLが正しいようです

私はk8s 1.11.2を使用してサービスを構築していますが、YAMLファイルは次のようになります。

導入

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-test
  namespace: default
  labels:
  - type: test 
spec:
  replicas: 1
  selector:
    matchLabels:
    - type: test 
  template:
    metadata:
      labels:
      - type: test 
    spec:
      containers:
      - image: nginx:1.14
        name: filebeat
        ports:
        - containerPort: 80

サービス

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test
spec:
  type: ExternalName
  externalName: my.nginx.com
  externalIPs:
  - 192.168.125.123
  clusterIP: 10.240.20.1
  ports: 
  - port: 80
    name: tcp
  selector:
  - type: test

そして私はこのエラーを受け取ります:

データの検証中にエラーが発生しました:[ValidationError(Service.metadata.labels):io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta.labelsの型が無効です:got "array"、expected "map"、ValidationError(Service.spec .selector):io.k8s.api.core.v1.ServiceSpec.selectorのタイプが無効です: "array"を取得しました、 "map"が必要です];

私はウェブサイト http://www.yamllint.com/ を使用して検証したので、YAMLファイルの形式は正しいと確信しています。

このエラーが発生するのはなぜですか?

3
李向朋

yamllint.com は、それがチェックしているYAMLバージョンと使用している実装を通知しないため、疑わしいサービスです。それを避けなさい。

さらに重要なことに、入力は有効なYAMLである可能性がありますが、これがkubernetesの有効な入力であることを意味するものではありません。 YAMLでは、あらゆる種類の構造を作成できますが、kubernetesでは特定の構造を想定しています。これはエラーがあなたに言っていることです:

「配列」を取得しましたが、「マップ」が必要です

これは、kubernetesがmappingを期待する場所で、配列(sequence適切なYAML用語で)。エラーメッセージには、この問題が発生する場所も表示されます。

ValidationError(Service.metadata.labels):

Kubernetesのメタデータラベルを簡単に確認すると、ラベルが配列ではなくマッピングである必要があることを示す このドキュメント がわかります。

したがって、あなたの入力では、ここの最後の行は犯人です:

metadata:
  name: nginx-test
  namespace: default
  labels:
  - type: test

-はシーケンスアイテムのYAMLインジケーターで、キーlabels:の値としてシーケンスを作成します。ドロップすると、代わりにマッピングになります。

metadata:
  name: nginx-test
  namespace: default
  labels:
    type: test
11
flyx

Yamlフォーマットでは、文字「-」は配列の開始を意味します。

あなたが持っている:

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test

あなたが欲しい:

apiVersion: v1
kind: Service
metadata:
    labels:
      type:test
3
Connolly

問題は2番目のファイルにあります。

apiVersion: v1
kind: Service
metadata:
    labels:
    - type:test
        #  ^

キャレットの上(^)スペースを作りませんtype:testマッピングの代わりに単一のスカラー(文字列)を使用して得られるマッピング

apiVersion: v1
kind: Service
metadata:
    labels:
    - type: test

そして、あなたがプログラムに期待することは何ですか。

どちらも有効なYAMLであるため、プリミティブな構文チェックは役に立ちません。

1
Anthon