ValidationError:缺少io.k8s.api.v1.DeploymentSpec

时间:2019-12-25 17:02:19

标签: kubernetes hyperledger-sawtooth

我创建了Hyper-V机器,并尝试使用Sawtooth YAML文件在Minikube上部署Sawtooth: https://sawtooth.hyperledger.org/docs/core/nightly/master/app_developers_guide/sawtooth-kubernetes-default.yaml

尽管我已使用此命令在Kubernetes v1.17.0中启动了Minikube,但我将apiVersion即apiVersion: extensions/v1beta1更改为apiVersion: apps/v1

  

minikube start --kubernetes-version v1.17.0

之后,我将无法部署服务器。命令是

  

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

显示“ sawtooth-0”的错误无效。

enter image description here

---
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

3 个答案:

答案 0 :(得分:1)

您需要修复部署yaml文件。从错误消息中可以看到,Deployment.spec.selector字段不能为空。

更新yaml(即添加spec.selector),如下所示:

  spec:
    replicas: 1
    selector:
      matchLabels:
        name: sawtooth-0
    template:
      metadata:
        labels:
          name: sawtooth-0
  • 为什么selector字段很重要?

selector字段定义部署如何查找要管理的Pod。在这种情况下,您只需选择在Pod模板(应用程序:nginx)中定义的标签。但是,只要Pod模板本身满足该规则,就可以使用更复杂的选择规则。

更新

k8s服务的apiVersionv1

- apiVersion: v1 # Update here
  kind: Service
  metadata:
    name: sawtooth-0
  spec:
    type: ClusterIP
    selector:
      name: sawtooth-0
    ... ... ...

答案 1 :(得分:0)

@Kamol 已经回答了这个问题


如果您仍然收到错误,一些可能的一般原因:

missing required field “XXX” in YYY
  1. 检查文件顶部的 apiVersion(对于部署,版本为:apps/v1 & 对于服务,它是 v1
  2. 检查“XXX”的 spelling(未知字段)并检查 syntax 是否不正确。
  3. 再次检查 kind: ...

如果您发现其他原因,请发表评论并让其他人知道:)

答案 2 :(得分:0)

对于 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/