K8s scheduler 调度:NodeName、NodeSelector与Taint

d81a408015e5049f43d0984337b06156.gif

1

前言

上篇介绍了k8s调度的预选和优选策略,K8s scheduler 调度:预选和优选策略。

本篇介绍三个影响pod调度的配置:NodeName、NodeSelector与Taint。

2

NodeName


NodeName是根据node的名称调度pod。可用于强制约束Pod跳过默认的Kubernetes调度规则,直接调度Pod到指定的Node节点上。参数Pod.spec.nodeName。

例如我们有3台k8s节点,其中249.11状态是notReady,我们将nginx的deploy设置nodeName:192-168-249-11。

K8s scheduler 调度:NodeName、NodeSelector与Taint_第1张图片

尽管249.12节点是正常的,但是nginx pod仍然会调度到249.11。所以除了测试或开发期间,我们最好不要使用 nodeName。

00f8455d2fccd91bbc5943a5b404bdfc.jpeg


3

NodeSelector


使用 nodeSelector 可以约束 Pod 在有特定标签的节点上运行,例如我们在249.11打上 A=a的标签

K8s scheduler 调度:NodeName、NodeSelector与Taint_第2张图片

然后给nginx打上 参数Pod.spec.nodeSelector:A:a。

38de95e014f119cb74833117316372fe.jpeg

这时由于249.11节点是notReady的,所以pod状态仍然为pending。通过kubectl describe pod可以查看pod的event信息。

8d83f7c12ed267ff0974e8db5d20553b.jpeg

这时候我们给249.12也打上 A=a的标签,那么nginx的pod就可以调度到249.12上了,状态也变成running。

8db7061910273145674f0bcd4cd1d1f0.jpeg

4

污点taint

可以通过如下命令给node设置污点

kubectl taint nodes 192-168-249-12 key=value:NoSchedule

如果设置NoSchedule的污点,则node上面的pod仍然会继续运行,只是新建的pod无法调度到 192-168-249-12上。

如果设置污点为NoExecute,则node上面运行的无法容忍node污点的pod将立即被驱逐。如下图,nginx pod在node打完污点后立即变成pending状态。

K8s scheduler 调度:NodeName、NodeSelector与Taint_第3张图片

此时node上仍然是有nodeSelector的,说明taint污点的优先级高于nodeSelector。

我们可以通过如下在pod上设置tolerations的方式容忍node污点。

K8s scheduler 调度:NodeName、NodeSelector与Taint_第4张图片

设置完tolerations容忍污点后可以发现,pod又可以调度到有污点的node上,状态为running。

K8s scheduler 调度:NodeName、NodeSelector与Taint_第5张图片


点个赞

f27e03d873f21a209d9f2cf91faf3044.gif

再走吧

你可能感兴趣的:(kubernetes,运维,docker,容器,云原生)