创建部署时使用的规范 - 选择器 - 匹配标签是什么?

Pad*_*ddy 29 kubernetes

来自Kubernetes 文档

selector 字段定义了 Deployment 如何找到要管理的 Pod。

但是,在创建部署时,我已经将 pod 模板指定为部署的一部分。那么,为什么我还需要选择器呢?

它是否应该像服务一样使用,其中 pod 已经单独启动,但后来被置于 Deployment 的保护伞下以一起管理?

ale*_*dov 18

我们可以在kubernetes.io 的部署部分找到这个问题的答案

那么,为什么我还需要选择器呢?

以下引用来自k8s v 1.14 的文档

.spec.selector是一个必填字段,用于指定此部署所针对的 Pod 的标签选择器。

.spec.selector必须匹配.spec.template.metadata.labels,否则会被 API 拒绝。

在 API 版本 apps/v1 中,如果未设置,.spec.selector 和 .metadata.labels 不会默认为 .spec.template.metadata.labels。所以他们必须明确设置。另请注意,在 apps/v1 中创建部署后 .spec.selector 是不可变的。

如果模板与 .spec.template 不同,或者此类 Pod 的总数超过 .spec.replicas,Deployment 可能会终止标签与选择器匹配的 Pod。如果 Pod 的数量少于所需的数量,它会使用 .spec.template 调出新的 Pod。

Pods 已经被单独启动,但后来被带到 Deployment 的保护伞下一起管理?

简单地说,没有

注意:您不应直接通过创建 anotherDeployment或通过创建另一个控制器(例如 aReplicaSet或 a ) 来创建标签与此选择器匹配的其他 pod ReplicationController。如果这样做,第一个会Deployment认为它创建了这些其他 pod。Kubernetes不会阻止您这样做。如果您有多个具有重叠选择器的控制器,则这些控制器将相互冲突并且无法正常运行。

  • 那么它是做什么用的呢?似乎您应该始终使选择器与规范的标签相匹配……在某些情况下,不这样做是否有用? (6认同)
  • 并没有真正回答为什么?- 为什么 matchLabels 存在并且必须匹配`.spec.template.metadata.labels`?它有什么意义,因为无论如何在`Deployment`下面定义了`spec`,所以很清楚为Deployment启动了哪些Pod。 (5认同)
  • 是的,它仍然没有任何意义。如果它们必须“**匹配**`spec.template.metadata.labels`”,那么定义它们就完全没有意义了。因为它们*至少*彼此相等是不言自明的。所以问题仍然存在,如果要求它们必须与其他东西完全相同,那么必须编写它们的实际意义是什么?为什么不默认让它们等于模板标签的行为并让用户明确定义它们?这只是糟糕的 UX/UI (5认同)
  • 任何遇到此讨论的人都应该查看最新的文档。例如,目前 .spec.selector 不是可选字段。它是必填字段。https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ (2认同)