K8s-Spec.Template.metadata部分的重要性

时间:2019-02-23 03:31:59

标签: kubernetes

拥有此部分-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

3 个答案:

答案 0 :(得分:2)

是什么使您认为不需要?

如果不为部署模板提供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

当您阅读docs时,对selector的描述是:

  

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

Metadata

Kubernetes中的大多数对象都有元数据,它负责存储有关资源的信息,例如名称,标签,注释等。

创建展开时,创建/更新ReplicaSet和POD需要模板,在这种情况下,它们需要匹配选择器,否则最终将导致集群周围的孤立资源,元数据将存储用于链接它们的数据。

通过这种方式设计,可以使资源彼此松散耦合,如果简单更改此Deployment \ replicaSet创建的Pod的标签,您会注意到旧的POD继续运行,但是新的POD继续运行之所以创建一个,是因为旧的不再遵守选择器规则,而ReplicaSet创建了一个新的来保留所需副本的数量。

答案 1 :(得分:1)

这将成为最终将在Pod上创建的元数据。通常,这与部署本身的元数据非常相似,但不一定必须如此。

答案 2 :(得分:1)

使用部署清单创建了三个不同的对象。

  1. 部署
  2. ReplicaSet
  3. Pod

在您的问题中,规格。模板。元数据被引用到ReplicaSet对象。建议定义这些参数以唯一标识特定部署的每个或相关对象。