写在开篇
在K8S集群中,调度是一个关键的组件,它负责将容器化的应用程序(Pod)分配给集群中的节点,以便实现高效的资源利用和负载均衡。本篇将介绍如何在K8S集群中使用调度器将Pod指派给指定的节点(nodeName),并展示一个实际的实战案例。
「nodeName字段是用于指定Pod应该调度到哪个节点上的一个字段。通过在Pod的规范中设置spec.nodeName字段,可以将Pod绑定到特定的节点。」
更多信息可以参考官方文档:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#nodename
❝值得注意的是,当明确指定了Pod的nodeName字段时,Pod将会直接绑定到指定的节点,绕过调度器的正常调度过程。
❞
使用场景
在实际的K8S运维工作中,nodeName字段在以下一些场景下是有可能使用到的:
节点维护:当需要在某个节点上执行维护操作时,可以将该节点上的所有Pod迁移到其他节点上。
特定硬件需求:有的时候,应用程序可能需要依赖特定类型的硬件或设备,例如GPU、或专用硬件加速器。就可以将要使用这些特定硬件的Pod调度到拥有相应设备的节点上。
资源隔离:可能希望将一组相关的Pod绑定到特定的节点上,以实现资源隔离或性能隔离。
❝请注意,如果过度使用nodeName字段可能导致资源不均衡和性能问题。如果没什么特别需求,我还是比较建议使用调度器的正常调度流程来动态分配和管理Pod的调度。
❞
实验环境
本次实战中,用到的测试环境还是和上次一样,我的K8S集群环境由以下节点组成:
| 节点 | 主机名 | IP |
|---|---|---|
| Master | k8s-b-master | 192.168.11.100 |
| Worker | k8s-b-node01 | 192.168.11.101 |
| Worker | k8s-b-node02 | 192.168.11.102 |
| Worker | k8s-b-node03 | 192.168.11.103 |
| Worker | k8s-b-node04 | 192.168.11.104 |
| Worker | k8s-b-node05 | 192.168.11.105 |
| Worker | k8s-b-node06 | 192.168.11.106 |
开始实战
和上次一样,继续用我开发好的demo来作为测试应用,也就是以goweb这个测试应用为例,该应用是用Go语言开发的一个简单的Web应用程序。当然,你也可以使用自己开发的应用来进行测试哦!
goweb测试应用的页面效果:

步骤 1:创建命名空间
最近测试的东西太多了,不能都放在default命名空间下了。所以,这次创建一个命名空间,用于隔离我的应用。
kubectl create namespace goweb-namespace
❝提示:在K8S中,命名空间是一种用于组织和管理资源的机制。
❞
步骤 2:创建Deployment
创建一个Deployment来运行我的goweb应用。
kubectl create deployment goweb --image=192.168.11.253/library/goweb:latest -n goweb-namespace
这将创建一个名为goweb的Deployment,并使用指定的容器镜像。
创建完成后,由K8S自身调度到了k8s-b-node02节点:
[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
goweb-6b786cf454-lg648 1/1 Running 0 16s 10.244.232.130 k8s-b-node02 <none> <none>
步骤 3:将Pod指派给节点
要将Pod指派给特定的节点,「可以使用nodeName字段来指定目标节点的名称。」
获取节点的名称。可以使用以下命令列出所有节点:
[root@k8s-b-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-b-master Ready control-plane 47d v1.25.4
k8s-b-node01 Ready <none> 47d v1.25.4
k8s-b-node02 Ready <none> 47d v1.25.4
k8s-b-node03 Ready <none> 47d v1.25.4
k8s-b-node04 Ready <none> 47d v1.25.4
k8s-b-node05 Ready <none> 47d v1.25.4
k8s-b-node06 Ready <none> 47d v1.25.4
选择一个你想要将Pod指派给的节点。
接下来,需要为Deployment添加一个节点选择器,以便将Pod指派给特定的节点。可以通过以下命令实现:
kubectl patch deployment goweb -n goweb-namespace -p '{"spec": {"template": {"spec": {"nodeName": "k8s-b-node05"}}}}'
这里将k8s-b-node05作为选择的节点。
现在,K8S调度器将会将新的Pod指派给指定的节点。
步骤 4:验证Pod的指派结果
可以使用以下命令来验证Pod是否已经正确指派给了指定的节点:
[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
goweb-5b47f6d8f5-vjkf8 1/1 Running 0 5s 10.244.25.73 k8s-b-node05 <none> <none>
goweb-6b786cf454-lg648 0/1 Terminating 0 2m31s 10.244.232.130 k8s-b-node02 <none> <none>
[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
goweb-5b47f6d8f5-vjkf8 1/1 Running 0 9s 10.244.25.73 k8s-b-node05 <none> <none>
完整的yaml
最后给出本次实战完整的yaml,在这里nodeName字段是关键哦。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: goweb
name: goweb
namespace: goweb-namespace
spec:
replicas: 1
selector:
matchLabels:
app: goweb
template:
metadata:
labels:
app: goweb
spec:
containers:
- image: 192.168.11.253/library/goweb:latest
name: goweb
nodeName: k8s-b-node05
最后总结
本篇的分享就到此结束啦!在本次实战中,以一个名为goweb的测试应用为例,演示了如何将Pod指派给指定的节点。大家可以根据自己的实际需求和应用特点,灵活运用这些概念和技术。希望本文可以帮助到有需要的朋友。
注重运维实战,我们比谁都拼!日常分享实用干货,助你成为运维大神!探索技术的魅力,从这里开始!
云原生合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2474851867500544003&count=3#wechat_redirect]
运维开发合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869340550028771330&count=3#wechat_redirect]
运维杂谈合集:[https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869345486221262853&count=3#wechat_redirect]
点击链接,畅读精彩文章,从中获取洞见,为自己的技术之旅注入新的动力!关注我的微信公众号,不错过更多精彩内容。




