共计 4522 个字符,预计需要花费 12 分钟才能阅读完成。
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-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…
【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…