在 Kubernetes Deployment.yaml 文件中定义 .spec.selectors 需要什么?

What is the need of defining .spec.selectors in Kubernetes Deployment.yaml file?

.spec.selector 字段定义部署如何找到要管理的 Pods。但是我们还在模板中定义了标签,那么我们通过 .spec.selectors 字段获得的额外内容是什么,因为 Deployment 也可以找到要使用模板中定义的标签进行管理的 Pods ?

在下面的代码中,带有“label occloud.oracle.com/open-network-policy: allow”的 pod 如何由部署管理,因为它没有在 spec.selectors[=13= 中描述]

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cheeseshop
spec:
  replicas: 1
  progressDeadlineSeconds: 180
  selector:
     matchLabels:
       app.kubernetes.io/name: tutorial
       app.kubernetes.io/component: cheeseshop
  template:
     metadata:
       labels:
         app.kubernetes.io/name: tutorial
         app.kubernetes.io/component: cheeseshop
         occloud.oracle.com/open-network-policy: allow
       name: cheeseshop
   

spec.seletor 字段被 Deployment/Replicaset 控制器使用。它必须是 podTemplate 中指定标签的 子集 。这就是为什么您的 pods 中可能有其他标签。但它们仍将由部署管理。

spec.selector 也用于检查是否有任何现有的 ReplicaSet 已经符合这些条件。如果 Deployment controller 发现一个孤儿 ReplicaSet,部署将使用它而不是创建一个新的。 参见 https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/deployment/deployment_controller.go#L222