简单聊聊Kubernetes的定向调度

网友投稿 784 2022-10-12

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

简单聊聊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              [root@worker01 test]# kubectl describe pods nginx Name:         nginxNamespace:    defaultPriority:     0Node:         worker10/172.16.75.23Start Time:   Tue, 31 Aug 2021 17:26:37 +0800Labels:       Annotations:  ovn.kubernetes.io/allocated: true              ovn.kubernetes.io/cidr: 172.18.0.0/16              ovn.kubernetes.io/gateway: 172.18.0.1              ovn.kubernetes.io/ip_address: 172.18.0.160              ovn.kubernetes.io/logical_switch: ovn-default              ovn.kubernetes.io/mac_address: 00:00:00:09:60:C4              ovn.kubernetes.io/network_types: geneve              ovn.kubernetes.io/routed: trueStatus:       RunningIP:           172.18.0.160IPs:  IP:  172.18.0.160Containers:  nginx:    Container ID:   docker://eddc12b5327ad77387ec097ab7bb70a5adb883e3dbfaf6e4fb9b4710d0606fed    Image:          nginx    Image ID:       docker-pullable://nginx@sha256:5e95e5eb8be4322e3b3652d737371705e56809ed8b307ad68ec59ddebaaf60e4    Port:               Host Port:          State:          Running      Started:      Tue, 31 Aug 2021 17:27:25 +0800    Ready:          True    Restart Count:  0    Environment:        Mounts:      /var/run/secrets/kubernetes.io/serviceaccount from default-token-sck49 (ro)Conditions:  Type              Status  Initialized       True   Ready             True   ContainersReady   True   PodScheduled      True Volumes:  default-token-sck49:    Type:        Secret (a volume populated by a Secret)    SecretName:  default-token-sck49    Optional:    falseQoS Class:       BestEffortNode-Selectors:  Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s                 node.kubernetes.io/unreachable:NoExecute for 300sEvents:  Type    Reason   Age   From               Message  ----    ------   ----  ----               -------  Normal  Pulling  81s   kubelet, worker10  Pulling image "nginx"  Normal  Pulled   36s   kubelet, worker10  Successfully pulled image "nginx"  Normal  Created  36s   kubelet, worker10  Created container nginx  Normal  Started  35s   kubelet, worker10  Started container nginx[root@worker01 test]#

由上可见,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              [root@worker01 test]# kubectl describe pods -n test nginx     Name:         nginxNamespace:    testPriority:     0Node:         worker07/172.16.75.20Start Time:   Tue, 31 Aug 2021 17:55:27 +0800Labels:       env=testAnnotations:  ovn.kubernetes.io/allocated: true              ovn.kubernetes.io/cidr: 172.18.0.0/16              ovn.kubernetes.io/gateway: 172.18.0.1              ovn.kubernetes.io/ip_address: 172.18.0.162              ovn.kubernetes.io/logical_switch: ovn-default              ovn.kubernetes.io/mac_address: 00:00:00:A7:8F:B2              ovn.kubernetes.io/network_types: geneve              ovn.kubernetes.io/routed: trueStatus:       RunningIP:           172.18.0.162IPs:  IP:  172.18.0.162Containers:  nginx:    Container ID:   docker://9d9c2cd9824270a8c4384a8c36d4727f1e38d698bbe70ebe4fccdc96fd39c4b6    Image:          nginx    Image ID:       docker-pullable://nginx@sha256:5e95e5eb8be4322e3b3652d737371705e56809ed8b307ad68ec59ddebaaf60e4    Port:               Host Port:          State:          Running      Started:      Tue, 31 Aug 2021 17:55:36 +0800    Ready:          True    Restart Count:  0    Environment:        Mounts:      /var/run/secrets/kubernetes.io/serviceaccount from default-token-xncw4 (ro)Conditions:  Type              Status  Initialized       True   Ready             True   ContainersReady   True   PodScheduled      True Volumes:  default-token-xncw4:    Type:        Secret (a volume populated by a Secret)    SecretName:  default-token-xncw4    Optional:    falseQoS Class:       BestEffortNode-Selectors:  disktype=ssdTolerations:     node.kubernetes.io/not-ready:NoExecute for 300s                 node.kubernetes.io/unreachable:NoExecute for 300sEvents:  Type     Reason            Age                   From               Message  ----     ------            ----                  ----               -------  Warning  FailedScheduling  100s (x4 over 2m44s)  default-scheduler  0/10 nodes are available: 10 node(s) didn't match node selector.  Normal   Scheduled         31s                   default-scheduler  Successfully assigned test/nginx to worker07  Normal   Pulling           29s                   kubelet, worker07  Pulling image "nginx"  Normal   Pulled            23s                   kubelet, worker07  Successfully pulled image "nginx"  Normal   Created           22s                   kubelet, worker07  Created container nginx  Normal   Started           22s                   kubelet, worker07  Started container nginx[root@worker01 test]#

由上可见,所有pod都被调度到了worker07节点。当然如果其他节点也有disktype=ssd 标签,那么pod也会调度到这些节点上。

但如果nodeSelector匹配的标签不存在,则容器将不会运行,会一直处于Pending 状态。

转眼已经秋天,这个夏天收获很多,也有遗憾,我还没过够就要结束了,时间总是这样不会等你一步,与夏日告别,期待秋天。希望你有很好的朋友,可以跟他说说心里话;希望你有喜欢的事,可以暂时摆脱世界困扰;希望你难过的时候,有一份美食一份音乐。祝好。

上一篇:MySQL主从切换
下一篇:Kubernetes服务发现Service(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~