K8s - Spec.Template.metadata 部分的意义

Kit*_*son 4 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
Run Code Online (Sandbox Code Playgroud)

Die*_*des 5

是什么让您认为它不是必需的?

如果您没有为Metadata部署模板提供 ,它将失败并显示如下消息:

The Deployment "nginx" is invalid: spec.template.metadata.labels: 
Invalid value: map[string]string(nil): `selector` does not match template `lab
els`
Run Code Online (Sandbox Code Playgroud)

或者,如果元数据与选择器不匹配,则会失败并显示如下消息:

The Deployment "nginx" is invalid: spec.template.metadata.labels: 
Invalid value: map[string]string{"run":"nginxv1"}: `selector` does not match template `labels`
Run Code Online (Sandbox Code Playgroud)

此外,如果您不提供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
Run Code Online (Sandbox Code Playgroud)

使用的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
Run Code Online (Sandbox Code Playgroud)

当您阅读docs 时,其描述如下selector

selector 字段定义了 Deployment 如何找到要管理的 Pod。在这种情况下,您只需选择在 Pod 模板(应用程序:nginx)中定义的标签。然而,更复杂的选择规则是可能的,只要 Pod 模板本身满足规则

元数据

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

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

这样设计是为了让资源之间松散耦合,如果你对这个部署\replicaSet创建的一个pod的标签做简单的修改,你会发现旧的POD继续运行,但是创建了一个新的,因为旧的不再参与选择器规则,ReplicaSet 创建一个新的以保留所需副本的数量。