一体化监控管理平台解决方案,一体化监控管理平台的应用范围
784
2022-10-12
简单聊聊Kubernetes的定向调度
在Kubernetes中,默认的部署方式是根据调度算法分析Kubernetes中资源的使用情况来进行动态分配的,但有时候调度应用时需要设置应用部署到特定的节点上,例如,确保Pod最终部署在连接了SSD磁盘的node节点上,或者将来自两个不同的服务且有大量通信的Pods被放置在同一个可用区等。其实这是用到了 Kubernetes的定向调度,主要有nodeName和nodeSelector两种。
nodeName 是节点选择约束的最简单方法,但是由于其自身限制,通常不使用它。 nodeName 是 PodSpec 的一个字段。如果它不为空,调度器将忽略 Pod,并且给定节点上运行的 kubelet 进程尝试执行该 Pod。因此,如果 nodeName 在 PodSpec 中指定了,Pod将直接调度到指定的Node节点上,会【跳过Scheduler的调度策略】,该匹配规则属于【强制】匹配,可以越过Taints污点进行调度。
使用 nodeName 来选择节点的一些限制:
如果指定的节点不存在,则容器将不会运行,并且在某些情况下可能会自动删除。如果指定的节点没有资源来容纳 Pod,Pod 将会调度失败并且其原因将显示为, 比如 OutOfmemory 或 OutOfcpu。云环境中的节点名称并非总是可预测或稳定的。
下面的是使用 nodeName 字段的 Pod 配置文件的例子:
集群环境信息:
[root@worker01 ~]# kubectl get noNAME STATUS ROLES AGE VERSIONworker01 Ready controlplane,etcd,master,worker 424d v1.18.3worker02 Ready controlplane,etcd,worker 424d v1.18.3worker03 Ready controlplane,etcd,worker 424d v1.18.3worker04 Ready worker 361d v1.18.3worker05 Ready worker 423d v1.18.3worker06 Ready worker 423d v1.18.3worker07 Ready worker 411d v1.18.3worker08 Ready worker 361d v1.18.3worker09 Ready worker 361d v1.18.3worker10 Ready worker 361d v1.18.3
[root@worker01 test]# cat nodename.yaml apiVersion: v1kind: Podmetadata: name: nginxspec: containers: - name: nginx image: nginx nodeName: worker10[root@worker01 test]# kubectl apply -f nodename.yaml[root@worker01 test]# kubectl get pods nginx -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 1/1 Running 0 76s 172.18.0.160 worker10
由上可见,yaml文件中nodeName: worker10生效,所有pod被调度到了worker10节点。
nodeSelector 是节点选择约束的最简单推荐形式。nodeSelector 是 PodSpec 的一个字段。它包含键值对的映射。为了使 pod 可以在某个节点上运行,该节点的标签中 必须包含这里的每个键值对(它也可以具有其他标签)。最常见的用法的是一对键值对。
nodeSelector是通过Kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后调度Pod到目标节点,该匹配规则属于【强制】约束。由于是调度器调度,因此不能越过Taints污点进行调度。
让我们来看一个使用 nodeSelector 的例子,当前的节点信息
[root@worker01 test]# kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELSworker01 Ready controlplane,etcd,master,worker 424d v1.18.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kube-ovn/role=master,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker01,kubernetes.io/os=linux,node-role.kubernetes.io/controlplane=true,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/master=true,node-role.kubernetes.io/worker=trueworker02 Ready controlplane,etcd,worker 424d v1.18.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kube-ovn/role=master,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker02,kubernetes.io/os=linux,node-role.kubernetes.io/controlplane=true,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=trueworker03 Ready controlplane,etcd,worker 424d v1.18.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kube-ovn/role=master,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker03,kubernetes.io/os=linux,node-role.kubernetes.io/controlplane=true,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=trueworker04 Ready worker 361d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker04,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true,role=monitor-cicdworker05 Ready worker 424d v1.18.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker05,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true,role=monitor-cicdworker06 Ready worker 424d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker06,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true,role=monitor-cicdworker07 Ready worker 411d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker07,kubernetes.io/os=linux,node-role.kubernetes.io/worker=trueworker08 Ready worker 361d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker08,kubernetes.io/os=linux,node-role.kubernetes.io/worker=trueworker09 Ready worker 361d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker09,kubernetes.io/os=linux,node-role.kubernetes.io/worker=trueworker10 Ready worker 361d v1.18.3 app=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker10,kubernetes.io/os=linux,node-role.kubernetes.io/worker=true
假如worker07的磁盘为SSD,我们为其添加label标签disktype=ssd,指定pod部署在拥有标签disktype=ssd的节点上
#为node添加标签[root@worker01 test]# kubectl label nodes worker07 disktype=ssdnode/worker07 labeled#有标签disktype=ssd的节点查看[root@worker01 test]# kubectl get nodes -l disktype=ssdNAME STATUS ROLES AGE VERSIONworker07 Ready worker 411d v1.18.3
[root@worker01 test]# cat nodeSelector.yaml apiVersion: v1kind: Podmetadata: name: nginx labels: env: testspec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent nodeSelector: disktype: ssd
[root@worker01 test]# kubectl get pods -n test -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx 1/1 Running 0 2m35s 172.18.0.162 worker07
由上可见,所有pod都被调度到了worker07节点。当然如果其他节点也有disktype=ssd 标签,那么pod也会调度到这些节点上。
但如果nodeSelector匹配的标签不存在,则容器将不会运行,会一直处于Pending 状态。
转眼已经秋天,这个夏天收获很多,也有遗憾,我还没过够就要结束了,时间总是这样不会等你一步,与夏日告别,期待秋天。希望你有很好的朋友,可以跟他说说心里话;希望你有喜欢的事,可以暂时摆脱世界困扰;希望你难过的时候,有一份美食一份音乐。祝好。
发表评论
暂时没有评论,来抢沙发吧~