我试图了解 NodeSelector 和 taints 如何在 Kubernetes 中协同工作。具体来说,我想知道在 pod 规范中使用 nodeSelector 是否可以覆盖节点上的污点,从而允许将 pod 调度到受污染的节点上。我在官方文档中找不到任何关于此的内容
这里有一个例子来说明我的设置:
节点配置: 我有一个应用了污点的节点:
kubectl taint nodes example-node key1=value1:NoSchedule
kubectl label nodes example-node environment=production
Pod 配置:
我有一个带有 nodeSelector 的 pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
environment: production
节点选择器影响单个 Pod 模板,指示调度程序将其放置在特定节点上。相反,NoSchedule 污点会影响所有 Pod,指示调度程序阻止它们在这些节点上进行调度。
当 pod 需要节点的某些资源(例如 GPU)时,节点选择器很有用。相比之下,当需要为特定工作负载保留节点时,节点污点是有利的,可确保仅在该节点上调度使用特定资源(例如 GPU)的 pod。
有时,同时使用节点选择器和污点是有利的。例如,如果您只想在节点上使用 GPU 的 Pod,并且需要在 GPU 节点上调度需要 GPU 的 Pod,则可以使用 Dedicated=gpu:NoSchedule 来污染该节点,并同时包含污染容忍和节点选择器在 pod 模板中。