1

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

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

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

我唯一能想到的就是污染节点,但如果我这样做,则不会在那里安排任何 Pod。

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

4

2 回答 2

1

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

于 2020-05-21T13:49:49.990 回答
0

您可以使用准入控制器在运行时动态添加NodeSelector到 pod 规范中,而不是修改现有的部署 yaml。您可以在mutating web-hook中编写任何自定义逻辑来满足您的用例。例如,您可以在新的部署规范中有一个标签/注释,并且基于该标签/注释的存在,您可以动态添加一个NodeSelector.

PodNodeSelector准入 web-hook 是一个很好的参考示例。

于 2020-05-21T13:26:02.473 回答