Pod调度1--定向调度

一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration
    接下来,我们将分章节介绍这几种调度方式及区别

定向调度

定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已

NodeName

NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点
例如。创建一个nginx yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
  nodeName: node1 # 指定调度到node1节点上

创建Pod

[root@k8s-master01 ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created

查看Pod调度到NODE属性,确实是调度到了node1节点上

[root@k8s-master01 ~]# kubectl get pods pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE      ......
pod-nodename   1/1     Running   0          56s   10.203.22.2   node1     ......   

接下来,删除pod,修改nodeName的值为node2(并没有node2节点)

[root@k8s-master01 ~]# kubectl delete -f pod-nodename.yaml
pod "pod-nodename" deleted
[root@k8s-master01 ~]# vim pod-nodename.yaml
[root@k8s-master01 ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created

再次查看,发现已经向Node2节点调度,但是由于不存在node2节点,所以pod无法正常运行

[root@k8s-master01 ~]# kubectl get pods pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP       NODE    ......
pod-nodename   0/1     Pending   0          6s    <none>   node2   ...... 

NodeSelector

通过kubernetes的label-selector机制,NodeSelector用于将pod调度到添加了指定标签的node节点上,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

首先分别为node节点添加标签

[root@k8s-master01 ~]# kubectl label nodes node1 nodeenv=pro
node/node2 labeled
[root@k8s-master01 ~]# kubectl label nodes node2 nodeenv=dev
node/node2 labeled

继续创建一个nignx yaml文件,并使用它创建Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-selector
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
  nodeSelector: 
    nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上

创建Pod

[root@k8s-master01 ~]# kubectl create -f pod-selector.yaml
pod/pod-selector created

查看Pod调度到NODE属性,确实是调度到了node1节点上

[root@k8s-master01 ~]# kubectl get pods pod-selector -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP          NODE    ......
pod-noselector   1/1     Running   0          47s   10.203.22.8   node1   ......

接下来,删除pod,修改nodeSelector的值为nodeenv: xxxx(不存在打有此标签的节点)

[root@k8s-master01 ~]# kubectl delete -f pod-eselector.yaml
pod "pod-selector" deleted
[root@k8s-master01 ~]# vim pod-selector.yaml
[root@k8s-master01 ~]# kubectl create -f pod-selector.yaml
pod/pod-selector created

再次查看,发现pod无法正常运行,Node的值为none

[root@k8s-master01 ~]# kubectl get pods -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP       NODE    
pod-selector   0/1     Pending   0          2m20s   <none>   <none>

查看详情,发现node selector匹配失败的提示

[root@k8s-master01 ~]# kubectl describe pods pod-selector -n dev
.......
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容