创建部署时 spec - selector - matchLabels 用于什么?

创建部署时 spec - selector - matchLabels 用于什么?

Kubernetes 文档

选择器字段定义 Deployment 如何找到要管理的 Pod。

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

它是否应该像服务一样使用,其中 pod 已经单独启动,但后来纳入 Deployment 的保护范围内进行一起管理?

答案1

我们可以在本节中找到此问题的答案部署来自 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 中创建 Deployment 后,.spec.selector 是不可变的。

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

Pod 已经单独启动,但后来被纳入 Deployment 的保护范围内进行一起管理?

简单来说,

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

答案2

虽然spec.template.metadata.labels可以有额外的标签来注释 pod,但是选择器部分(即matchLabels)需要固定其中一些/少数,这样它才会知道哪些 pod 在其治理之下。

相关内容