Kubernetes实战:Deployment 如何选择 Pod

2024-12-30#Kubernetes

在使用 Kubernetes 部署应用时,通常会创建 Deployment,在其中定义 Pod 的模板、 副本数量、更新策略等关键信息。一般来说,Deployment 中的匹配标签(即 spec.selector.matchLabels )定义了用于选择 Pod 的标签,当 Deployment 执行诸如扩缩容、更新操作时,就依靠这些标签匹配去找到对应的 Pod。而 Pod 模板元数据中的标签(即 spec.template.metadata.labels)应该与 Deployment 的匹配标签保持一致。今天我在项目中发现,两个不同的 Deployment 居然使用了相同的匹配标签。于是很疑惑,难道两个 Deployment 不会互相干扰吗?经过一般调研,原来不只我有过这样的困惑。

ownerReferences 🔗

首先,Deployment 并不会直接管理 Pod。每个 Deployment 管理一个 ReplicaSet。而 Kubernetes 的控制器(比如 Replicaset)在管理 Pod 时,还会参考 ownerReferences

ownerReferences 是 Kubernetes 中的一种对象间关系标识机制,存在于 metadata 字段内。它允许一个对象声明自己归属于另一个对象,比如 Pod 可以通过 ownerReferences 表明它是某个 Deployment 或者 ReplicaSet 的 “所属物”。当 Deployment 创建 Pod 时,会自动在 Pod 的 metadata.ownerReferences 中添加指向自身的引用。因此,有着明确指向某个 Deployment 的 ownerReferences 的 Pod,其管控权就被锁定在对应的 Deployment 及其衍生的 ReplicaSet 体系内。当进行 Deployment 更新,产生新老 ReplicaSet 交替时,ownerReferences 保障新创建的 Pod 带着正确的归属关系。当 ReplicaSet 缩容时,只会移除那些 ownerReferences 指向自身的 Pod;当 ReplicaSet 扩容时,新 Pod 也明确关联到新的 Deployment。

因此,即使两个不同的 Deployment 有着相同的匹配标签,也不会互相影响。

参考资料 🔗