kubernetes集群中有多个节点,Pod调度调度到那个节点上是根据调度算法,这些算法会根据节点的各种因素的综合权重来决定Pod最终会调度到那个节点上,调度器(预选策略-->优选函数-->选择)。



优选函数:


LeastRequested:根据CPU使用率,内存使用情况来计算权重。

BlancedResourceAllocation:根据CPU与内存使用比率来计算权重。

NodePreferAvoidPods:根据注解annotation来计算权重。

SelectorSpreading:尽量不要将相同的Pod调度到一个节点,就是将Pod散开调度。

NodeAffinity、InterPodAffinity:https://www.scriptjc.com/article/1019

TaintToleration:https://www.scriptjc.com/article/1018

ImageLocality:根据节点已近拥有的镜像来调度,比如某个节点已近拥有了镜像其他节点没有,这个节点权重就高,默认没启用。



        根据Pod或节点的默认调度方法可能并不是我们想要的,可以手动设置使其达到我们预期的效果,如某些节点上有SSD硬盘或有GPU,我们就可以指定某些Pod到某个特定的节点上运行。



hostName


hostName的方式:直接指定主机名 pod.spec.hostName 。

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command: ["sleep","3600"]
  nodeName: k8s-node2


nodeSelector


        nodeSelector的调度方式是主动指定到含有一些特定的标签的节点上。只要在节点上打上标签在Pod中使用nodeSelector选择这个标签即可。

给节点打标签:

kubectl label nodes node1 disktype=ssd

将Pod调度到含有指定标签的节点上:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-ssd
spec:
  containers:
  - name: myapp
    image: myapp:v1
  nodeSelector:
    disktype: ssd