nodeSelector是什么鬼?这么说吧,假设有一个K8S集群,其中有多个节点,并且想将一个特定的应用程序只部署在具有特定标签的节点上。这时候就可以在Pod的定义中添加nodeSelector字段,指定一个键值对,例如app: my-app。然后,K8S调度器将查找具有app=my-app标签的节点,并将该Pod调度到其中之一上运行。
需要注意的是,nodeSelector是一种基本的、也是最简单的调度机制,还有其他更高级的调度特性可供选择,如Node Affinity、nodeAffinity、podAffinity、Taints and Tolerations(污点和容忍)等。在实际工作中,可以根据实际需求和复杂性来选择不同的调度机制满足特定的业务需求。关于这些内容的实战,后面都会逐一分享。
关于更多详情可参考官方文档:
本次实战基于以下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 |
从这里开始,通过实战演示如何在K8S集群中使用nodeSelector来将Pod调度到指定的节点上。
首先,我们需要为目标节点添加标签。在本次实战中,我们将以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
我们假设有一个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
现在,需要修改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标签的节点上。
实战案例演示完毕,接下来看看nodeSelector的使用场景:
希望本文对你理解和应用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
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。