首页 > 编程语言 >K8S调度:实战完nodeSelector后,再谈应用场景。

K8S调度:实战完nodeSelector后,再谈应用场景。

时间:2023-06-21 15:12:41浏览次数:78  
标签:调度 K8S app goweb 再谈 nodeSelector k8s 节点

Part1写在开篇

nodeSelector是什么鬼?这么说吧,假设有一个K8S集群,其中有多个节点,并且想将一个特定的应用程序只部署在具有特定标签的节点上。这时候就可以在Pod的定义中添加nodeSelector字段,指定一个键值对,例如app: my-app。然后,K8S调度器将查找具有app=my-app标签的节点,并将该Pod调度到其中之一上运行。

需要注意的是,nodeSelector是一种基本的、也是最简单的调度机制,还有其他更高级的调度特性可供选择,如Node Affinity、nodeAffinity、podAffinity、Taints and Tolerations(污点和容忍)等。在实际工作中,可以根据实际需求和复杂性来选择不同的调度机制满足特定的业务需求。关于这些内容的实战,后面都会逐一分享。

关于更多详情可参考官方文档:

Part2实验环境

本次实战基于以下K8S集群环境进行:

节点 主机名 IP
Master节点 k8s-b-master 192.168.11.100
工作节点1 k8s-b-node01 192.168.11.101
工作节点2 k8s-b-node02 192.168.11.102
工作节点3 k8s-b-node03 192.168.11.103
工作节点4 k8s-b-node04 192.168.11.104
工作节点5 k8s-b-node05 192.168.11.105
工作节点6 k8s-b-node06 192.168.11.106

Part3开始实战

从这里开始,通过实战演示如何在K8S集群中使用nodeSelector来将Pod调度到指定的节点上。

1步骤 1:创建Node标签

首先,我们需要为目标节点添加标签。在本次实战中,我们将以goweb应用为例,将Pod调度到具有app=goweb-node标签的节点上。在Master节点上执行以下命令,为节点添加标签:

kubectl label node k8s-b-node01 app=goweb-node
kubectl label node k8s-b-node02 app=goweb-node

查看标签:

kubectl get node k8s-b-node01 --show-labels
kubectl get node k8s-b-node02 --show-labels

2步骤 2:编写goweb应用的Deployment文件

我们假设有一个goweb应用,用于测试目的。你可以自己开发一个类似的应用,或者使用下面提供的示例。

创建一个名为goweb-deployment.yaml的文件,并使用以下内容编写Deployment的定义:

kubectl create deployment goweb --image=192.168.11.253/library/goweb:latest --port=80 -r 3 -n goweb-namespace --dry-run=client -o yaml

对应YMAL:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goweb
  name: goweb
  namespace: goweb-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      containers:
      - image: 192.168.11.253/library/goweb:latest # 注意替换为你自己的私有仓库地址
        name: goweb
        ports:
        - containerPort: 80

保存并应用该文件,执行以下命令:

kubectl apply -f goweb-deployment.yaml

3步骤 3:配置nodeSelector

现在,需要修改Deployment文件,添加nodeSelector字段,以指定Pod应该调度到具有app=goweb-node标签的节点上。

编辑goweb-deployment.yaml文件,修改Deployment的定义如下:

```yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goweb
  name: goweb
  namespace: goweb-namespace
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goweb
  template:
    metadata:
      labels:
        app: goweb
    spec:
      nodeSelector: # 添加nodeSelector字段
        app: goweb-node
      containers:
      - image: 192.168.11.253/library/goweb:latest # 注意替换为你自己的私有仓库地址
        name: goweb
        ports:
        - containerPort: 80

保存并应用该文件,执行以下命令:

kubectl apply -f goweb-deployment.yaml

4步骤 4:验证调度结果

这是添加nodeSelector字段之前的调度情况:

NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
goweb-77bcc56b49-9q6f4   1/1     Running   0          6m42s   10.244.151.61    k8s-b-node06   <none>           <none>
goweb-77bcc56b49-k2j68   1/1     Running   0          6m42s   10.244.232.141   k8s-b-node02   <none>           <none>
goweb-77bcc56b49-s9757   1/1     Running   0          6m42s   10.244.25.76     k8s-b-node05   <none>           <none>

等待一段时间,让K8S调度器将Pod调度到相应的节点上。可以使用以下命令检查Pod的调度情况:

kubectl get pod -n goweb-namespace -o wide

你应该会看到类似以下的输出:

[root@k8s-b-master ~]# kubectl get pod -n goweb-namespace -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
goweb-79db84d884-646rg   1/1     Running   0          87s   10.244.51.202    k8s-b-node01   <none>           <none>
goweb-79db84d884-9f97p   1/1     Running   0          83s   10.244.232.140   k8s-b-node02   <none>           <none>
goweb-79db84d884-kd8lm   1/1     Running   0          89s   10.244.232.142   k8s-b-node02   <none>           <none>

注意到Pod被成功调度到了具有app=goweb-node标签的节点上。

Part4使用场景

实战案例演示完毕,接下来看看nodeSelector的使用场景:

  • 节点特性要求:  这个使用场景针对的就是应用程序有特定的硬件或软件要求,例如goweb这个应用程序可能需要在具有高性能 GPU 的节点上运行,这时候就可以为这些节点添加相应的标签,然后使用nodeSelector将Pod调度到这些节点上。
  • 资源分配和负载均衡:  这种情况就很适合需要精细化分配和负载均衡的场景,比如将Pod调度到资源充足的节点上。这时候就可以为节点设置不同的标签,根据节点的资源情况来调度到指定的节点。
  • 特定环境要求:  例如生产环境或开发环境,相应的节点可以添加环境标签,然后调度到特定的环境,这个场景相信是用的比较多的了。
  • 地理位置和数据局部性:  这个场景怎么说好呢,比如说应用程序需要与特定地理位置相关的数据进行交互,这时候就可以选择最近的节点来运行应用程序,以减少数据传输的延迟,这种情况就可以按地理位置的维度来设定标签。

Part5写在最后

希望本文对你理解和应用nodeSelector调度机制有所帮助!如有疑问,欢迎留言讨论。

注重运维实战,我们比谁都拼!日常分享实用干货,助你成为运维大神!探索技术的魅力,从这里开始!

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

【K8S(专注于深入研究K8S相关的各种技术和知识分享。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2474851867500544003&count=3#wechat_redirect

【Go&Py(涵盖了Go和Python两种流行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869340550028771330&count=3#wechat_redirect

【Ops(运维领域的讨论和交流。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUzMTkyODc4NQ==&scene=1&album_id=2869345486221262853&count=3#wechat_redirect

标签:调度,K8S,app,goweb,再谈,nodeSelector,k8s,节点
From: https://www.cnblogs.com/ttropsstack/p/17496255.html

相关文章

  • kubeadm搭建单master多node的k8s集群
    一、实验环境准备镜像选择:CentOS-7-x86_64-DVD-2009.iso配置:4核、6G内存、80G硬盘兼容性:ESXI7.0及更高版本服务器信息:k8s集群角色ip主机名安装的组件控制节点10.104.26.192hqs-masterapiserver、controller-manager、scheduler、etcd、kube-proxy、docker、ca......
  • docker-k8s-日志分析
    1.mac安全模式关了2.docker源改了,国内的3、k8s的git仓库,匹配到版本后,下载了。依旧无法正常启动···2023062113:36:45第一次日志记录2023-06-2113:31:23.630123+0800localhostcom.docker.backend[17097]:(0fd28985)ead7cf58-KubernetesManagerC<-Sd75b0a51-VMD......
  • k8s1.26.3部署
    1.设置hostnamehostnamectlset-hostnamek8s-master//master节点hostnamectlset-hostnamek8s-node1//node1节点hostnamectlset-hostnamek8s-node2//node2节点2.设置hosts后续可以使用别名直接访问别的节点cat>>/etc/hosts<<EOF192.168.100.40k8s-master192.......
  • 常见k8s开源网络组件
    目前,已经有多个开源组件支持容器网络模型。常见的网络组件,包括Flannel、Open vSwitch、直接路由和Calico。1.FlannelFlannel之所以可以搭建k8s依赖的底层网络,是因为它能实现以下两个功能。(1)它能协助k8s,给每一个Node上的Docker容器分配互相不冲突的IP地址。(2)它能在这些IP地址之......
  • nodeSelector + deamonset
    DaemonSet配置文件的语法和结构与Deployment几乎完全一样,只是将 kind 设为 DaemonSet。选择运行节点:当指定.spec.template.spec.nodeSelector,DaemonSet将会在匹配的节点上创建pod。如果都没有指定,DaemonSet在所有node节点上创建pod. spec:  nodeSelector:.com/role:dev......
  • k8s Deployment 金丝雀发布
    创建应用depoly-demoapp-v10.yamlapiVersion:v1kind:Namespacemetadata:name:demoapp---apiVersion:apps/v1kind:Deploymentmetadata:name:demoapp-deploymentnamespace:demoappspec:replicas:3selector:matchLabels:app:demoapp......
  • (转)kubernetes(k8s) yaml 文件详解2
    原文:https://juejin.cn/post/7202145223014252602#heading-0一、K8S支持的文件格式kubernetes支持YAML和JSON文件格式管理资源对象。JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读1、yaml和json的主要区......
  • k8s pod版本升级与回滚
    创建应用depoly-demoapp-v10.yamlapiVersion:v1kind:Namespacemetadata:name:demoapp---apiVersion:v1kind:Servicemetadata:labels:app:demoappv10name:demoappv10namespace:demoappspec:ports:-name:http-8080port:8080......
  • K8s Kubectl 技巧集锦
    kubectl是Kubernetes的一个命令行管理工具,可用于Kubernetes上的应用部署和日常管理。本文列举了9个常见的kubectl命令,并总结了一些使用技巧,希望可以帮助系统管理员简化管理工作。一、使用Kubectl查询、创建、编辑和删除资源对于刚开始使用命令行工具的开发者,最保险的方......
  • k8s~volumeMounts资源的限制与作用
    当配置了本地存储的限制之后,当超出了这个限制,将会出现如下错误,你的pod将会失败Podephemerallocalstorageusageexceedsthetotallimitofcontainers2Gi.原因与解决你可能在pod中设置了本地存储的大小限制,当它达到后,将会出现这个错误,如下配置kind:DeploymentapiVer......