暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S调度:实战将POD指派给节点,以及搞清楚使用场景。

不背锅运维 2023-06-18
1539

写在开篇

在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
Masterk8s-b-master192.168.11.100
Workerk8s-b-node01192.168.11.101
Workerk8s-b-node02192.168.11.102
Workerk8s-b-node03192.168.11.103
Workerk8s-b-node04192.168.11.104
Workerk8s-b-node05192.168.11.105
Workerk8s-b-node06192.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]

点击链接,畅读精彩文章,从中获取洞见,为自己的技术之旅注入新的动力!关注我的微信公众号,不错过更多精彩内容。


文章转载自不背锅运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论