K8s scheduler 调度:NodeName、NodeSelector与Taint

本文详细介绍了Kubernetes中影响Pod调度的三个关键配置:NodeName、NodeSelector和Taint。NodeName允许强制Pod在特定Node上运行,跳过默认调度规则;NodeSelector用于约束Pod只在具有特定标签的Node上启动;Taint则通过设置NoSchedule或NoExecute来控制Pod的调度和驱逐策略,而Tolerations则能让Pod容忍Node的污点,正常运行。

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。

153ca4105551d73f900096e291887f5d.jpeg

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

00f8455d2fccd91bbc5943a5b404bdfc.jpeg


3

NodeSelector


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

3a30d1fa7c4b52fc06bcf2b8096077f4.jpeg

然后给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状态。

153665b58e5da436d1707ec87f5a7d41.jpeg

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

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

9a9794be4c168ddaf186f3dbc74d5a7a.jpeg

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

a7af85bc9c560e6dfd8a5a1b79a4e183.jpeg


点个赞

f27e03d873f21a209d9f2cf91faf3044.gif

再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值