016_kubernetes_05_集群调度_kube-scheduler_20190930

1.简介

Scheduler是Kubernetes的调度器,主要任务是把定义的Pod分配到集群的节点上。调度要考虑以下几点:

  1.   公平:保证每个节点都能被分配资源
  2.   资源高效利用:集群所有资源最大化被使用
  3.   调度效率:尽快地完成大批量的Pod的调度工作
  4.   灵活:允许用户根据自己的需求控制调度的逻辑

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优选

经过预选,如果有多个节点满足条件,就会开始优选过程:按照优先级大小进行排序

优先级项目由一系列键值对组成,键--优先级项的名称,值---优先级项的权重。优先级常见算法包括:

  1. LeastRequestPriority:通过CPU和Memory的使用率来决定权重。使用率越低权重越高。倾向于选择资源使用率更低的节点
  2. BalancedResourceAllocation:节点上CPU和Memory使用率越接近,权重越高。配合LeastRequestPriority一起使用,不单独使用
  3. ImageLocaltiyPriority:节点要使用镜像的总大小值越大,权重越高

根据优先级项目和权重对节点进行计算排序,得出结果。

3.自定义调度器

自定义调度器实质上是根据需要定义 优选 这个过程

3.1nodeAffinity(节点亲和性,范围:node,软策略preferred与硬策略required)

示例:

016_kubernetes_05_集群调度_kube-scheduler_20190930_第1张图片

1)查看节点标签:

# kubectl get node --show-labels

2)键值运算符:

  1. In:label的值在某个列表中
  2. NotIn:label的值不在某个列表中
  3. Gt:label的值大于指定值
  4. Lt:label的值小于指定值
  5. Exists:指定label存在
  6. DoesNotExist:指定label不存在

3.2 podAffinity/podAnitAffinity(pod亲和性,范围:topology,软策略preferred与硬策略required)

示例:

016_kubernetes_05_集群调度_kube-scheduler_20190930_第2张图片

  • 查看pod标签
    # kubectl get pod -o wide --show-labels
  • 运算符
    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-

污点类型:

  1. NoSchedule(不调度)
  2. PreferNoSchedule(尽量不调度)
  3. NoExecute(不调度,并且驱离节点上已存在但不能容忍该污点的pod)

容忍使用:

定义位置 pod.spec.tolerations
示例

016_kubernetes_05_集群调度_kube-scheduler_20190930_第3张图片

说明:

  1. operator选项为:Equal、Exists
  2. Equal要求容忍的 key、value、effect 与 污点指定完全一致
  3. Exists: 默认都容忍
    - operations:"Exists" 容忍所有污点
    - key: "key1"
            operator: "Exists"
          容忍key1的所有值和所有 effect
  4. 不能容忍NoExecute的情况下,tolerationSeconds 指定被驱离前可以继续运行的时间

3.4指定节点调度

和nodeAffinity 硬策略required功能重复,这里简单介绍

  • 方式一:Pod.spec.nodeName: k8s-node02
  • 方式二:label 标签匹配
    Pod.spec.nodeSelector:
              labelname:labelvalue

3.5其他

维护或者关闭节点前,请先对该节点先打NoExecute类型的污点驱离pod,避免服务临时中断

你可能感兴趣的:(016_kubernetes_05_集群调度_kube-scheduler_20190930)