拥有此部分-spec.template.metadata
有什么意义?这似乎不是强制性的。但是我想知道它在哪里非常有用!否则,重复所有选择器的意义是什么?
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
selector:
matchLabels:
app: hello
tier: backend
track: stable
replicas: 7
template:
metadata:
labels:
app: hello
tier: backend
track: stable
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-go-gke:1.0"
ports:
- name: http
containerPort: 80
是什么让您认为不需要?
如果您不为部署模板提供Metadata
,则会因这样的消息而失败:
The Deployment "nginx" is invalid: spec.template.metadata.labels:
Invalid value: map[string]string(nil): `selector` does not match template `lab
els`
或如果元数据与选择器不匹配,则会因这样的消息而失败:
The Deployment "nginx" is invalid: spec.template.metadata.labels:
Invalid value: map[string]string{"run":"nginxv1"}: `selector` does not match template `labels`
另外,如果您不提供selector
,则会以这样的消息错误:
error validating "STDIN": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec;
if you choose to ignore these errors, turn validation off with --validate=false
使用的YAML为以下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx
spec:
replicas: 2
selector:
matchLabels:
run: nginx
strategy: {}
template:
metadata:
labels:
run: nginxv1
spec:
containers:
- image: nginx
name: nginx
阅读文档时,selector
的描述说:
选择器字段定义了部署如何找到要管理哪些POD。在这种情况下,您只需选择一个在POD模板中定义的标签(APP:NGINX)。但是,只要POD模板本身满足规则。
元数据
kubernetes中的大多数对象都有一个元数据,负责存储有关资源的信息,例如,名称,标签,注释等。
创建部署时,需要模板来创建更新replicaset和pods,在这种情况下,它们需要匹配选择器,否则您最终会在群集周围获得孤儿资源,而元数据存储了元素用于链接它们的数据。
这是通过这种方式设计的,以使资源彼此之间松散耦合,如果您简单地更改此部署 replicaset创建的POD的标签,您会注意到旧的POD保持运行,但是一个新的POD创建了一个,因为旧的不再参加选择器规则,并且复制品创建一个新的规则来保留所需的副本的数量。
创建了三个不同的对象。
- 部署
- replicaset
- pod
在您的问题中,规格。模板。元数据被引用为replicaset对象。建议定义这些参数以唯一识别特定部署的每个或相关对象。
,它变成了最终将创建的吊舱上的元数据。通常,这与部署本身的元数据非常相似,但不一定是。