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。
尽管249.12节点是正常的,但是nginx pod仍然会调度到249.11。所以除了测试或开发期间,我们最好不要使用 nodeName。3
NodeSelector
使用 nodeSelector 可以约束 Pod 在有特定标签的节点上运行,例如我们在249.11打上 A=a的标签
然后给nginx打上 参数Pod.spec.nodeSelector:A:a。这时由于249.11节点是notReady的,所以pod状态仍然为pending。通过kubectl describe pod可以查看pod的event信息。
这时候我们给249.12也打上 A=a的标签,那么nginx的pod就可以调度到249.12上了,状态也变成running。
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状态。
此时node上仍然是有nodeSelector的,说明taint污点的优先级高于nodeSelector。
我们可以通过如下在pod上设置tolerations的方式容忍node污点。
设置完tolerations容忍污点后可以发现,pod又可以调度到有污点的node上,状态为running。
点个赞
再走吧