kubernetes - 为什么这个 Manifest 创建的 Pod 可以在不指定 Nodeselector 的情况下部署到 GPU Worker
问题描述
我通过kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.9/nvidia-device-plugin.yml创建了一个 pod
但是,我注意到没有 nodeSelector。那么如何将 pod 正确部署到目标 gpu 机器?为什么它选择跳过主控机?AFAK,守护进程使其 pod 部署在每个节点上,而不仅仅是集群的一部分,而无需指定任何节点选择器。
部分清单:
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: CriticalAddonsOnly
node.kubernetes.io/disk-pressure:NoSchedule
node.kubernetes.io/memory-pressure:NoSchedule
node.kubernetes.io/not-ready:NoExecute
node.kubernetes.io/pid-pressure:NoSchedule
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unschedulable:NoSchedule
事件:
集群信息:
2台机器,一台作为master,只有一个CPU,另一台作为worker,里面有cpu和gpu。
Kubernetes:1.15
解决方案
通过运行检查taints
所有节点:
kubectl describe node <node-name> | grep -i taint
默认情况下,主节点有一个taint
防止常规Pods
在该特定节点上调度。请注意,主节点旨在专门用于运行位于命名空间中的Kubernetes 控制平面组件kube-system
。这样的方案保证了kubernetes集群的稳定性,完全有道理。通常在主节点上部署任何额外的生产工作负载都是一个坏主意。对于非生产解决方案,例如Minikube,当您拥有单节点集群时,这是完全可以接受的。您可能想熟悉taints 和 tollerations以更好地理解这个概念。
除了向Pod
规范添加 tollerations 之外,您还可以考虑从节点中删除 taints(也在这里描述):
从节点中移除污点您可以
kubectl taint
用来移除污点。key
您可以通过、key-value
或删除污点key-effect
。例如,以下命令从节点 foo 中删除所有具有专用键的污点:
kubectl taint nodes foo dedicated-
重要提示:污点不是标签!正如一些评论可能暗示的那样。它们可能与标签有关,但它们本身不是标签。
您可以通过运行轻松检查它:
kubectl get node <tainted-node> -o yaml
你会在节点的规范部分看到所有当前应用的污点:
spec:
...
taints:
- effect: NoSchedule
key: key
value: some-value
通常在主节点上,您有以下污点:
spec:
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
在许多其他标签中,有一个与此污点相关的特定标签:
node-role.kubernetes.io/master: ""
回答您在标题中发布的具体问题:
为什么这个 Manifest 创建的 Pod 可以在不指定 Nodeselector 的情况下部署到 GPU Worker
我建议您在本文中阅读有关kubernetes用于分配Pods
的不同机制的更多信息,如果您想保证您将被安排在具有特定标签的节点上,您将看到可以使用nodeSelector 。但是,没有 a并不会阻止您被安排在此类节点上。仍然可以在没有任何污点的每个节点上进行调度(以这种方式防止某些没有在其上安排特定容忍度的节点)或在任何具有一些污点的节点上进行调度,但是调度可以容忍这些污点。Nodes
Pod
nodeSelector
Pods
Pods
Pods
Pod
在您的情况下,工作节点是唯一没有污点的节点,防止Pods
它不容忍在其上安排此特定污点。由于工作节点没有任何污点,因此将Pod
其安排在其上。
如果您想防止Pod
在该特定节点上安排任何其他不需要 GPU 的例如,您可以创建自己的污点,并且只有Pods
具有特定容忍度的污点才能在该节点上安排。
我希望它能消除你的疑虑。
推荐阅读
- delphi - Delphi 10.3 Android远程服务绑定时崩溃
- python - 我需要从python中的文本文件中获取特定数据
- mysql - 选择 1 个随机行和 n 行后的行数
- c# - Xamarin Forms - C# - HttpUtility.ParseQueryString - 自动格式化字符串?
- python - 带有 Docker 错误的 Django 管理员不正确的填充
- azerothcore - Azerothcore - Autobalance DungeonScaleDownXP 为单人玩家添加额外检查
- excel - Excel计数粘贴为单元格中的值的单元格,这些单元格包含带有“”的公式作为结果
- javascript - Redux Saga 中的去抖动
- conv-neural-network - 调用模型子类时预期的字符串或类似字节的对象
- cucumber - 是否可以在水豚中选择多个相等的元素?