Part1写在开篇

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

须要留神的是,nodeSelector是一种根本的、也是最简略的调度机制,还有其余更高级的调度个性可供选择,如Node Affinity、nodeAffinity、podAffinity、Taints and Tolerations(污点和容忍)等。在理论工作中,能够依据理论需要和复杂性来抉择不同的调度机制满足特定的业务需要。对于这些内容的实战,前面都会逐个分享。

对于更多详情可参考官网文档:

  • https://kubernetes.io/docs/concepts/scheduling-eviction/assig...
  • https://kubernetes.io/docs/concepts/scheduling-eviction/assig...
  • https://kubernetes.io/docs/tasks/configure-pod-container/assi...

Part2试验环境

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

节点主机名IP
Master节点k8s-b-master192.168.11.100
工作节点1k8s-b-node01192.168.11.101
工作节点2k8s-b-node02192.168.11.102
工作节点3k8s-b-node03192.168.11.103
工作节点4k8s-b-node04192.168.11.104
工作节点5k8s-b-node05192.168.11.105
工作节点6k8s-b-node06192.168.11.106

Part3开始实战

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

1步骤 1:创立Node标签

首先,咱们须要为指标节点增加标签。在本次实战中,咱们将以goweb利用为例,将Pod调度到具备app=goweb-node标签的节点上。在Master节点上执行以下命令,为节点增加标签:

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

查看标签:

kubectl get node k8s-b-node01 --show-labelskubectl 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/v1kind: Deploymentmetadata:  labels:    app: goweb  name: goweb  namespace: goweb-namespacespec:  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的定义如下:

```ymlapiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: goweb  name: goweb  namespace: goweb-namespacespec:  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 GATESgoweb-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 wideNAME                     READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATESgoweb-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...

【Go&Py(涵盖了Go和Python两种风行的编程语言。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...

【Ops(运维畛域的探讨和交换。)】:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz...