Pod详解之Pod调度(定向调度)
Pod调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。
但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?
这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:
- 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出 - 定向调度:NodeName、NodeSelector - 亲和性调度:NodeAffinity(pod与node之间)、PodAffinity(pod与pod之间)、PodAntiAffinity - 污点(容忍)调度:Taints、Toleration 注:Node可设置污点,不让Pod过来;而Pod可设置容忍污点,强行到污点Node内
定向调度
定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,
这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod会运行失败而已。
NodeName
NodeName用于强制约束将Pod调度到指定的Name的Node节点上。
这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。
案例
创建一个pod-nodename.yaml文件
apiVersion: v1 kind: Pod metadata: name: pod-nodename namespace: dev spec: nodeName: node1 # 指定调度到node1节点上 containers: - name: nginx image: nginx:1.17.1
创建Pod,观察效果
#创建Pod [root@master ~]# kubectl create -f pod-nodename.yaml #查看Pod调度到NODE属性,确实是调度到了node1节点上 [root@master ~]# kubectl get pods pod-nodename -n dev -o wide # 接下来,删除pod,修改nodeName的值为node3(注:并没有node3节点) [root@master ~]# kubectl delete -f pod-nodename.yaml [root@master ~]# vim pod-nodename.yaml [root@master ~]# kubectl create -f pod-nodename.yaml #再次查看,发现已经向Node3节点调度,但是由于不存在node3节点,所以pod无法正常运行 [root@master ~]# kubectl get pods pod-nodename -n dev -o wide

NodeSelector
NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,
也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。
案例
1 首先分别为node节点添加标签 [root@master ~]# kubectl label nodes node1 nodeenv=pro [root@master ~]# kubectl label nodes node2 nodeenv=test 查看node上的标签 [root@master ~]# kubectl get nodes --show-labels

2 创建一个pod-nodeselector.yaml文件
apiVersion: v1 kind: Pod metadata: name: pod-nodeselector namespace: dev spec: containers: - name: nginx image: nginx:1.17.1
nodeSelector: nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上 #创建Pod [root@master ~]# kubectl create -f pod-nodeselector.yaml #查看Pod调度到NODE属性,确实是调度到了node1节点上 [root@master ~]# kubectl get pods pod-nodeselector -n dev -o wide
# 接下来,删除pod,修改nodeSelector的值为nodeenv: xxxx(不存在打有此标签的节点) [root@master ~]# kubectl delete -f pod-nodeselector.yaml [root@master ~]# vim pod-nodeselector.yaml [root@master ~]# kubectl create -f pod-nodeselector.yaml #再次查看,发现pod无法正常运行,Node的值为none(因为没有节点符合要求) [root@master ~]# kubectl get pods -n dev -o wide # 查看详情,发现node selector匹配失败的提示 [root@master ~]# kubectl describe pods pod-nodeselector -n dev
参考
黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」