ValidationError: отсутствует селектор обязательного поля в io.k8s.api.v1.DeploymentSpec

Я создал машину Hyper-V и попытался развернуть Sawtooth на Minikube с помощью файла Sawtooth YAML: https://sawtooth.hyperledger.org/docs/core/nightly/master/app_developers_guide/sawtooth-kubernetes-default.yaml

Я изменил apiVersion, т.е. apiVersion: extensions/v1beta1 на apiVersion: apps/v1, хотя я запустил Minikube в Kubernetes v1.17.0 с помощью этой команды

запуск minikube --kubernetes-версия v1.17.0

После этого я не могу развернуть сервер. Команда

kubectl apply -f sawtooth-kubernetes-default.yaml --validate = false

Он показывает, что ошибка с "пилой-0" недопустима.

введите описание изображения здесь

---
apiVersion: v1
kind: List

items:

- apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: sawtooth-0
  spec:
    replicas: 1
    selector:
      matchLabels:
        name: sawtooth-0
    template:
      metadata:
        labels:
          name: sawtooth-0
      spec:
        containers:
          - name: sawtooth-devmode-engine
            image: hyperledger/sawtooth-devmode-engine-rust:chime
            command:
              - bash
            args:
              - -c
              - "devmode-engine-rust -C tcp://$HOSTNAME:5050"

          - name: sawtooth-settings-tp
            image: hyperledger/sawtooth-settings-tp:chime
            command:
              - bash
            args:
              - -c
              - "settings-tp -vv -C tcp://$HOSTNAME:4004"

          - name: sawtooth-intkey-tp-python
            image: hyperledger/sawtooth-intkey-tp-python:chime
            command:
              - bash
            args:
              - -c
              - "intkey-tp-python -vv -C tcp://$HOSTNAME:4004"

          - name: sawtooth-xo-tp-python
            image: hyperledger/sawtooth-xo-tp-python:chime
            command:
              - bash
            args:
              - -c
              - "xo-tp-python -vv -C tcp://$HOSTNAME:4004"

          - name: sawtooth-validator
            image: hyperledger/sawtooth-validator:chime
            ports:
              - name: tp
                containerPort: 4004
              - name: consensus
                containerPort: 5050
              - name: validators
                containerPort: 8800
            command:
              - bash
            args:
              - -c
              - "sawadm keygen \
              && sawtooth keygen my_key \
              && sawset genesis -k /root/.sawtooth/keys/my_key.priv \
              && sawset proposal create \
                -k /root/.sawtooth/keys/my_key.priv \
                sawtooth.consensus.algorithm.name=Devmode \
                sawtooth.consensus.algorithm.version=0.1 \
                -o config.batch \
              && sawadm genesis config-genesis.batch config.batch \
              && sawtooth-validator -vv \
                  --endpoint tcp://$SAWTOOTH_0_SERVICE_HOST:8800 \
                  --bind component:tcp://eth0:4004 \
                  --bind consensus:tcp://eth0:5050 \
                  --bind network:tcp://eth0:8800"

          - name: sawtooth-rest-api
            image: hyperledger/sawtooth-rest-api:chime
            ports:
              - name: api
                containerPort: 8008
            command:
              - bash
            args:
              - -c
              - "sawtooth-rest-api -C tcp://$HOSTNAME:4004"

          - name: sawtooth-shell
            image: hyperledger/sawtooth-shell:chime
            command:
              - bash
            args:
              - -c
              - "sawtooth keygen && tail -f /dev/null"

- apiVersion: apps/v1
  kind: Service
  metadata:
    name: sawtooth-0
  spec:
    type: ClusterIP
    selector:
      name: sawtooth-0
    ports:
      - name: "4004"
        protocol: TCP
        port: 4004
        targetPort: 4004
      - name: "5050"
        protocol: TCP
        port: 5050
        targetPort: 5050
      - name: "8008"
        protocol: TCP
        port: 8008
        targetPort: 8008
      - name: "8800"
        protocol: TCP
        port: 8800
        targetPort: 8800

person debo karmakar    schedule 25.12.2019    source источник
comment
Что стоит за этой ссылкой "введите описание изображения здесь"? Обычно я ожидал увидеть какое-то текстовое сообщение об ошибке; Можете ли вы заменить ссылку фактическим текстом полученной ошибки (не изображением), и можете ли вы включить достаточное количество фактического файла YAML (не ссылку), чтобы продемонстрировать ошибку?   -  person David Maze    schedule 25.12.2019


Ответы (3)


Вам необходимо исправить ваш yaml файл развертывания. Как видно из сообщения об ошибке, поле Deployment.spec.selector не может быть пустым.

Обновите yaml (т.е. добавьте spec.selector), как показано ниже:

  spec:
    replicas: 1
    selector:
      matchLabels:
        app.kubernetes.io/name: sawtooth-0
    template:
      metadata:
        labels:
          app.kubernetes.io/name: sawtooth-0
  • Почему поле selector важно?

Поле selector определяет, как развертывание находит, какими модулями нужно управлять. В этом случае вы просто выбираете метку, которая определена в шаблоне модуля (app.kubernetes.io/name: sawtooth-0). Однако возможны более сложные правила выбора, если сам шаблон Pod удовлетворяет этому правилу.

Обновление:

apiVersion для службы k8s - v1:

- apiVersion: v1 # Update here
  kind: Service
  metadata:
    app.kubernetes.io/name: sawtooth-0
  spec:
    type: ClusterIP
    selector:
      app.kubernetes.io/name: sawtooth-0
    ... ... ...
person Kamol Hasan    schedule 25.12.2019
comment
Я добавил селектор при развертывании и запустил машину minikube, теперь ошибка исправлена. это сообщение, которое я получаю ..................... `` C: \ Users \ Debo ›хост статуса minikube: Выполняется kubelet: Выполняется apiserver: Выполняется kubeconfig: настроен C: \ Users \ Debo ›kubectl apply -f sawtooth-kubernetes-default.yaml --validate = false deployment.apps / sawtooth-0 created не может распознать совпадений для вида Служба в версии apps / v1` ` - person debo karmakar; 26.12.2019
comment
@debokarmakar Можете ли вы добавить обновленный yaml в тело вопроса и результат выполнения команды kubectl version --short после запуска minikube? - person Kamol Hasan; 26.12.2019
comment
C: \ Users \ Debo ›версия kubectl --short Версия клиента: v1.17.0 Версия сервера: v1.17.0 и файл yaml, который я обновил в вопросе - person debo karmakar; 26.12.2019
comment
@debokarmakar, я обновил свой ответ, посмотрите. - person Kamol Hasan; 26.12.2019
comment
@debokarmakar WC, примите ответ, это будет заметнее ???? - person Kamol Hasan; 26.12.2019
comment
О app.kubernetes.io/name означает ли это, что разные поставщики поддерживают разные имена? - person Zufar Muhamadeev; 11.12.2020
comment
@ZufarMuhamadeev см. рекомендуемые ярлыки, но это может быть что угодно. - person Kamol Hasan; 11.12.2020
comment
на данный момент (2021-04) официальный учебник по части k8s устарел, текущая версия k8s - v1.20.2, я запускаю ее с драйвером докера на моем Arch Linux. Мой пригодный для использования файл yaml можно найти здесь, он создан для вас. Обязательно измените путь к тому для постоянного хранилища и сначала запустите minikube mount src:dest, если вы работаете с драйвером докера. gist.github.com/kmahyyg/6b5eb6554e3dc15cc751a66862f4f4 - person PotatoChips; 02.04.2021

Ответ на этот вопрос уже есть в @Kamol.


Некоторые общие возможные причины, если вы все еще получаете сообщение об ошибке:

missing required field “XXX” in YYY
  1. Установите флажок apiVersion в верхней части файла (для развертывания версия: apps / v1, а для службы - v1.
  2. Проверьте spelling из XXX (неизвестное поле) и проверьте, неверно ли значение syntax.
  3. Проверьте kind: ... еще раз.

Если вы найдете другую причину, прокомментируйте и дайте знать другим :)

person Ashutosh Tiwari    schedule 02.01.2021

Для версии API v1 (а также для приложений / v1) вам необходимо использовать app: <your lable>

apiVersion: v1
kind: Service
metadata:
  name: sawtooth-0
spec:
  selector:
    app: sawtooth-0

См .: https://kubernetes.io/docs/concepts/services-networking/service/

person Eylon    schedule 21.01.2021
comment
Не работает. Ошибка: приложение неизвестного поля в io.k8s.apimachinery.pkg.apis.meta.v1.LabelSelector; - person JRichardsz; 27.03.2021