kubernetes_06_集群调度_20190930
1.简介
Scheduler是Kubernetes的调度器,主要任务是把定义的Pod分配到集群的节点上。调度要考虑以下几点:
公平:保证每个节点都能被分配资源
资源高效利用:集群所有资源最大化被使用
调度效率:尽快地完成大批量的Pod的调度工作
灵活:允许用户根据自己的需求控制调度的逻辑
Scheduler是作为单独的程序运行的,启动之后会一直连接API Server,获取PodSpec.NodeName为空的Pod,为每个pod都会创建一个binding,表明该Podd应该放到哪个节点上
2.调度过程
调度分为两个步骤:
1)Predicate:预选,过滤掉不满足条件的节点。
2)Priority:优选,对符合条件的节点按照优先级排序,从中选择优先级最高的节点
如果中间任何一步骤有错误,就直接返回错误
2.1Predicate预选
预选步骤:
1)PodFitsResources:节点剩余资源是否大于 Pod请求资源
2)PodFitsHost:如果Pod指定了NodeName,检查节点名称是否与NodeName匹配
3)PodFitsHostPorts:节点上已经使用的port是否和Pod申请的Port冲突
4)PodSelectorMatches:过滤掉和Pod指定的label不匹配的节点
5)NoDiskConflict:已经mount的volume和pod指定的volume不能冲突,都是只读不冲突ReadOnlyMany
如果没通过以上预选条件,Pod会一直pending状态,不断重试调度,知道有节点满足条件。
2.2Priority优选
经过预选,如果有多个节点满足条件,就会开始优选过程:按照优先级大小进行排序
优先级项目由一系列键值对组成,键--优先级项的名称,值---优先级项的权重。优先级常见算法包括:
LeastRequestPriority:通过CPU和Memory的使用率来决定权重。使用率越低权重越高。倾向于选择资源使用率更低的节点
BalancedResourceAllocation:节点上CPU和Memory使用率越接近,权重越高。配合LeastRequestPriority一起使用,不单独使用
ImageLocaltiyPriority:节点要使用镜像的总大小值越大,权重越高
根据优先级项目和权重对节点进行计算排序,得出结果。
3.自定义调度器
自定义调度器实质上是根据需要定义 优选 这个过程。
3.1nodeAffinity(节点亲和性,范围:node,软策略preferred与硬策略required)
示例:
1)查看节点标签:
# kubectl get node --show-labels
2)键值运算符:
In:label的值在某个列表中
NotIn:label的值不在某个列表中
Gt:label的值大于指定值
Lt:label的值小于指定值
Exists:指定label存在
DoesNotExist:指定label不存在
3.2 podAffinity/podAnitAffinity(pod亲和性,范围:topology,软策略preferred与硬策略required)
示例:
1) 查看pod标签
# kubectl get pod -o wide --show-labels
2) 运算符
In NotIn Exists DoesNotExist
3.3污点Taint(node)与容忍Toleration(Pod)
污点taint:node设置一组污点,用以排斥一类pod
容忍toleration:pod可标记一组容忍,可以容忍某些污点标记的节点
污点使用:
设置污点:
# kubectl taint nodes k8s-node02 key1=value:NoSchedule
查看节点的污点:
# kubectl describe node k8s-ha-master01
修改污点:
# kubectl taint nodes k8s-ha-master01 node-role.kubernetes.io/master=:PreferNoSchedule
去除污点
# kubectl taint nodes k8s-node02 key1:NoSchedule-
污点类型:NoSchedule(不调度)、PreferNoSchedule(尽量不调度)、NoExecute(不调度,并且驱离节点上已存在但不能容忍该污点的pod,主要用于维护节点主机)
容忍使用:
定义位置:pod.spec.tolerations
示例
说明:
1.operator选项为:Equal、Exists
2. Equal要求容忍的 key、value、effect 与 污点指定完全一致
3. Exists: 默认都容忍
1)- operations:"Exists" 容忍所有污点
2)- key: "key1"
operator: "Exists"
容忍key1的所有值和所有 effect
4.不能容忍NoExecute的情况下,tolerationSeconds 指定被驱离前可以继续运行的时间
3.4指定节点调度
和nodeAffinity 硬策略required功能重复,这里简单介绍
方式一:Pod.spec.nodeName: k8s-node02
方式二:label 标签匹配
Pod.spec.nodeSelector:
labelname:labelvalue