kubernetes - 强制执行 nodeaffinity/nodeselector

kubernetes - 强制执行 nodeaffinity/nodeselector

我正在尝试实现这个目标:

  • 应用程序命名空间中的任何内容都会被调度到特定节点上
  • 其他命名空间无法将 pod 调度到特定节点
  • 开发人员不应该有选择干涉这一点

因此,我可能应该使用 PodNodeSelector 和 PodTolerationRestriction,但是它需要重新启动 api,并且一些文章声称一旦 NodeAffinity 足够好它就会被弃用,而且我觉得自己还不够熟练来使用动态准入控制器。

然而,阅读有关 NodeSelector/taints&tolerations 的内容时,似乎这必须由开发人员在部署中进行管理,他们可以忽略它。

我还遗漏了其他选项吗,或者有什么方法可以强制执行 NodeSelector/taints&toleration 以便开发人员无法更改它?

谢谢

答案1

您正在寻找污点和容忍度。除了 nodeSelector。

污点是一种标记节点的方法。此类标记可用于防止工作负载在您的节点上进行调度。同时,您可在工作负载上定义容忍度,以允许出现例外情况。

你可以用类似以下的方式污染你的节点:

kubectl taint nodes worker1.example.com workload=reserved:NoSchedule
kubectl taint nodes workerN.example.com workload=reserved:NoSchedule

并让你的特殊应用程序在其 pod 规范中设置以下内容,以绕过该污点:

spec:
  containers:
  - [...]
  tolerations:
  - key: workload
    operator: Equal
    value: reserved
    effect: NoSchedule

虽然这可以确保没有 pod 会被调度到那里,除非它们具有污点:但您可能需要在节点上添加一些标签,并使用 nodeSelector,确保您的特殊 pod 只能在您的保留节点上启动。

您可以添加带有以下内容的标签:

kubectl label node worker1.example.com workload=reserved
kubectl label node workerN.example.com workload=reserved

并将 nodeSelector 添加到你的 pod 定义中:

spec:
  containers:
  - [...]
  nodeSelector:
    workload: reserved

相关内容