Kubernetes 节点亲和力 - 将 pod 分配给特定节点?

Kubernetes node affinity - Assigning a pod to a specific node?

k8s node affinity 文档解释了如何通过首先使用标签标记节点并使用 nodeSelector 选择节点来将 pod 部署到特定节点。

但是,我有一个用例,我在一个集群中有 40-50 个部署,我想向集群添加一个新节点并将该节点设置为专用于其中一个节点 deployments/pods 而不改变所有那些没有指定任何节点选择器的部署

例如,假设我有 3 个部署,没有定义 nodeSelector 和 3 个工作节点。这意味着 k8s 决定 pods 的部署位置,并且它可以部署在这 3 个节点之一中。现在我必须创建第 4 个部署,并添加第 4 个服务器,我想将第 4 个部署专用于第 4 个服务器,并且还想确保 k8s 不会将前 3 个部署安排到这个第 4 个节点。如果不通过所有这 3 个部署方案并应用 nodeSelector 过滤器不在第 4 个节点上部署,我该如何做到这一点? (可以在 3 个部署上执行此更改,但我说的是现实生活场景中的 50 多个部署)

我唯一能想到的就是 taint 节点,但如果我这样做,pods 的 none 将被安排在那里。

这里有没有更好的方法来实现我不知道的这个目标?

您可以使用 admission controller to dynamically add NodeSelector into a pod spec at runtime rather than modifying existing deployment yamls. You could write any custom logic in the mutating web-hook 来满足您的用例。例如,您可以在新的部署规范中有一个 label/annotation,并且基于该 label/annotation 的存在,您可以动态添加一个 NodeSelector.

PodNodeSelector admission web-hook 是一个很好的参考例子。

如果您污染第 4 个节点,则第 4 个具有容忍度的部署将部署在该节点上,而其他三个则不会。