Получена ошибка о получении "массива" и ожидании "карты", пока мой YAML кажется правильным - PullRequest
0 голосов
/ 30 августа 2018

Я использую 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: получил «массив», ожидаемая «карта», ValidationError (Service.spec.selector): недопустимый тип для io.k8s.api.core.v1.ServiceSpec.selector: получил «массив», ожидается "Карта"];

Я уверен, что формат моего файла YAML правильный, потому что я использовал веб-сайт http://www.yamllint.com/ для его проверки.

Почему я получаю эту ошибку?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

yamllint.com - сомнительный сервис, поскольку он не сообщает нам, какую версию YAML он проверяет и какую реализацию он использует. Избегайте этого.

Что еще более важно, хотя ваш ввод может быть действительным YAML, это не означает, что это допустимый ввод для kubernetes. YAML позволяет вам создавать любые структуры, в то время как kubernetes ожидает от вас определенной структуры. Вот что говорит вам ошибка:

получил "массив", ожидаемую "карту"

Это означает, что в месте, где kubernetes ожидает отображение , вы предоставили массив ( 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
0 голосов
/ 30 августа 2018

Проблема в вашем втором файле:

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

Над кареткой (^) пропущен пробел, из которого type:test вместо единственного скаляра (строки) вместо отображения, которое вы получаете, используя

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

и что ожидает ваша программа.

Оба являются допустимыми YAML, поэтому примитивная проверка синтаксиса вам не поможет.

0 голосов
/ 30 августа 2018

В формате yaml символ "-" означает начало массива.

У вас есть:

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

Вы хотите:

apiVersion: v1
kind: Service
metadata:
    labels:
      type:test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...