0

我通过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

4

2 回答 2

0

通过运行检查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并不会阻止您被安排在此类节点上。仍然可以在没有任何污点的每个节点上进行调度(以这种方式防止某些没有在其上安排特定容忍度的节点)或在任何具有一些污点的节点上进行调度,但是调度可以容忍这些污点。NodesPodnodeSelectorPodsPodsPodsPod

在您的情况下,工作节点是唯一没有污点的节点,防止Pods它不容忍在其上安排此特定污点。由于工作节点没有任何污点,因此将Pod其安排在其上。

如果您想防止Pod在该特定节点上安排任何其他不需要 GPU 的例如,您可以创建自己的污点,并且只有Pods具有特定容忍度的污点才能在该节点上安排。

我希望它能消除你的疑虑。

于 2020-02-28T13:20:43.130 回答
0

这是一个DaemonSet,这意味着它将被部署到所有工作节点中。

从文档

如果您指定 .spec.template.spec.nodeSelector,则 DaemonSet 控制器将在与该节点选择器匹配的节点上创建 Pod。同样,如果您指定 .spec.template.spec.affinity,则 DaemonSet 控制器将在与该节点关联性匹配的节点上创建 Pod。如果两者都不指定,则 DaemonSet 控制器将在所有节点上创建 Pod

从 Kubernetes 1.6 开始,默认情况下 DaemonSets 不会在主节点上调度。如果添加低于容忍度,它将被部署到所有主节点以及所有工作节点。

tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
于 2020-02-27T10:14:24.463 回答