简介
主要任务是把定义好的Pod分配到集群节点上,启动后一直会监听API Server获取PodSpec.NodeName为空的Pod,对每个Pod都会创建一个binding,表明该Pod应该放到哪个节点上。
调度过程
首先是过滤掉不满足条件的节点,这个过程成为predicate;然后对通过的节点按照优先级排序,这个是priority;最后从选择优先级最高的节点(如果中间有任何一部错误直接报错)。
几种调度的策略
1.节点亲和性(pod.spec.nodeAffinity)
- 软策略(perferredDuringSchedulingIgnoredDuringExecution):没有满足条件也可以
- 硬策略(requiredDuringSchedulingIgnoredDuringExecution):必须满足条件,没有则挂起
软策略可以和硬策略结合使用先写硬策略后写软策略
调度策略
调度策略 | 匹配标签 | 操作符 | 拓扑域支持 | 调度目标 |
nodeAffinty | 主机 | In,NotIn,Exists,DoesNotExists,Gt,Lt | 否 | 指定主机 |
podAffiinity | POD | In,NotIn,Exists,DoesNotExists | 是 | Pod与指定Pod同一拓扑域 |
podAnitAffinity | POD | In,NotIn,Exists,DoesNotExists | 是 | Pod与指定Pod不在同一拓扑域 |
eg:
1.硬策略
下面示例展示无论如何Pod都会运行在k8s-03节点
##requiredDuringSchedulinglgnoredDuringExecution##
查看Node标签,通过标签选择“kubernetes.io/hostname=k8s-03”
# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-01 Ready <none> 17d v1.14.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-01,kubernetes.io/os=linux
k8s-02 Ready <none