Kubernetes实战:Deployment 如何选择 Pod
在使用 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 有着相同的匹配标签,也不会互相影响。