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)

示例:

kubernetes_06_集群调度_20190930

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)

示例:

kubernetes_06_集群调度_20190930

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

kubernetes_06_集群调度_20190930

    修改污点:

    # 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

示例

kubernetes_06_集群调度_20190930

说明:

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