选择器字段定义 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 在其治理之下。