ValidationError: missing required field "selector" in io.k8s.api.v1.DeploymentSpec
ValidationError: missing required field "selector" in io.k8s.api.v1.DeploymentSpec
我已经创建了 Hyper-V 机器并尝试使用 Sawtooth YAML 文件在 Minikube 上部署 Sawtooth:
https://sawtooth.hyperledger.org/docs/core/nightly/master/app_developers_guide/sawtooth-kubernetes-default.yaml
我将 apiVersion 即 apiVersion: extensions/v1beta1
更改为 apiVersion: apps/v1
,尽管我已经使用此命令在 Kubernetes v1.17.0 中启动了 Minikube
minikube start --kubernetes-version v1.17.0
之后我无法部署服务器。命令是
kubectl apply -f sawtooth-kubernetes-default.yaml --validate=false
显示错误 "sawtooth-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
您需要修复部署 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
字段定义部署如何找到要管理的 Pods。在这种情况下,您只需 select Pod 模板中定义的标签 (app.kubernetes.io/name: sawtooth-0
)。然而,更复杂的 selection 规则是可能的,只要 Pod 模板本身满足规则。
更新:
k8s 服务的 apiVersion
是 v1
:
- apiVersion: v1 # Update here
kind: Service
metadata:
app.kubernetes.io/name: sawtooth-0
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: sawtooth-0
... ... ...
@Kamol 已经涵盖了这个问题的答案
如果您仍然收到错误,一些一般可能的原因是:
missing required field “XXX” in YYY
- 检查文件顶部的
apiVersion
(对于部署,版本为:apps/v1
& 对于服务,它是 v1
- 检查“XXX”的
spelling
(未知字段)并检查syntax
是否不正确。
- 再次检查
kind: ...
。
如果您发现其他原因,请发表评论并让其他人知道:)
对于 api 版本 v1(以及 apps/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/
我已经创建了 Hyper-V 机器并尝试使用 Sawtooth YAML 文件在 Minikube 上部署 Sawtooth: https://sawtooth.hyperledger.org/docs/core/nightly/master/app_developers_guide/sawtooth-kubernetes-default.yaml
我将 apiVersion 即 apiVersion: extensions/v1beta1
更改为 apiVersion: apps/v1
,尽管我已经使用此命令在 Kubernetes v1.17.0 中启动了 Minikube
minikube start --kubernetes-version v1.17.0
之后我无法部署服务器。命令是
kubectl apply -f sawtooth-kubernetes-default.yaml --validate=false
显示错误 "sawtooth-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
您需要修复部署 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
字段定义部署如何找到要管理的 Pods。在这种情况下,您只需 select Pod 模板中定义的标签 (app.kubernetes.io/name: sawtooth-0
)。然而,更复杂的 selection 规则是可能的,只要 Pod 模板本身满足规则。
更新:
k8s 服务的 apiVersion
是 v1
:
- apiVersion: v1 # Update here
kind: Service
metadata:
app.kubernetes.io/name: sawtooth-0
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: sawtooth-0
... ... ...
@Kamol 已经涵盖了这个问题的答案
如果您仍然收到错误,一些一般可能的原因是:
missing required field “XXX” in YYY
- 检查文件顶部的
apiVersion
(对于部署,版本为:apps/v1 & 对于服务,它是 v1 - 检查“XXX”的
spelling
(未知字段)并检查syntax
是否不正确。 - 再次检查
kind: ...
。
如果您发现其他原因,请发表评论并让其他人知道:)
对于 api 版本 v1(以及 apps/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/