调度流程
kube-scheduler 是 kubernetes 的调度器,它的主要作用就是根据特定的调度算法和调度策略将Pod调度到合适的Node 节点上去,是一个独立的二进制程序,启动之后会一直监听APIServer,获取到PodSpec.NodeName 为空的 Pod,对每个 Pod 都会创建一个 binding。
Predicates
Predicates 阶段首先遍历全部节点,过滤掉不满足条件的节点,属于强制性规则,这一阶段输出的所有满足要求的 Node 将被记录并作为第二阶段的输入,如果所有的节点都不满 足条件,那么Pod将会一直处于Pending状态,直到有节点满足条件,在这期间调度器会不断的重试。
Priorities
Priorities 阶段即再次对节点进行筛选,如果有多个节点都满足条件的话,那么系统会按 照节点的优先级(priorites)大小对节点进行排序,最后选择优先级最高的节点来部署 Pod 应用。
LeastRequestedPriority:通过计算 CPU 和内存的使用率来决定权重,使用率越低权重越 高,当然正常肯定也是资源是使用率越低权重越高,能给别的 Pod 运行的可能性就越大
SelectorSpreadPriority:为了更好的高可用,对同属于一个 Deployment 或者 RC 下面 的多个 Pod 副本,尽量调度到多个不同的节点上,当一个 Pod 被调度的时候,会先去查 找该 Pod 对应的 controller,然后查看该 controller 下面的已存在的 Pod,运行 Pod 越少的节点权重越高
ImageLocalityPriority:就是如果在某个节点上已经有要使用的镜像节点了,镜像总大小 值越大,权重就越高
NodeAffinityPriority:这个就是根据节点的亲和性来计算一个权重值,后面我们会详细 讲解亲和性的使用方法
节点调度亲和性
节点硬亲和性
requiredDuringSchedulingIgnoredDuringExecution
方式一:Pod 使用 spec.nodeSelector (基于等值关系)
方式二:Pod 使用 spec.affinity 支持 matchExpressions 属性 (复杂标签选择机制)
节点软亲和性
柔性控制逻辑,当条件不满足时,能接受被编排于其他不符合条件的节点之上 权重 weight 定义优先级,1-100 值越大优先级越高
污点和容忍度
污点 taints 是定义在节点上的键值型属性数据,用于让节点拒绝将 Pod 调度运行于其上,
除非 Pod 有接纳节点污点的容忍度容忍度 tolerations 是定义在 Pod 上的键值属性数据,
用于配置可容忍的污点,且调度器将 Pod 调度至其能容忍该节点污点的节点上或没有污点
的节点上
使用 PodToleratesNodeTaints 预选策略和 TaintTolerationPriority 优选函数完成该机
制
节点亲和性使得 Pod 对象被吸引到一类特定的节点 (nodeSelector 和 affinity)
污点提供让节点排斥特定 Pod 对象的能力
(1)定义污点和容忍度
污点定义于 nodes.spec.taints 容忍度定义于 pods.spec.tolerations
语法: key=value:effect
(2)effect 定义排斥等级:
NoSchedule,不能容忍,但仅影响调度过程,已调度上去的 pod 不受影响,仅对新增加的
pod 生效。
PreferNoSchedule,柔性约束,节点现存 Pod 不受影响,如果实在是没有符合的节点,也
可以调度上来
NoExecute,不能容忍,当污点变动时,Pod 对象会被驱逐
(3)在 Pod 上定义容忍度时:等值比较 容忍度与污点在 key、value、effect 三者完全匹配
存在性判断 key、effect 完全匹配,value 使用空值
一个节点可配置多个污点,一个 Pod 也可有多个容忍度