kubernetes集群系列资料14--scheduler介绍

一、scheduler介绍

  scheduler主要任务按照一定规则把定义的pod分配到集群的node上。scheduler作为单独的程序运行,启动之后会一直监听API server,获取podSpec.NodeName为空的pod,对每个pod都会创建一个binding,表明该pod应该放到哪个node上。调度会考虑到很多问题:
  效率:调度的性能要好,能够尽快地对大批量的pod完成调度工作;
  公平:如何保证每个节点都能被分配资源;
  资源高效利用:集群所有资源最大化被使用;
  灵活:允许用户根据自己的需求控制调度的逻辑。
调度过程:
  1)过滤掉不满足条件的node,这个过程称为predicate;如果在predicate过程中没有合适的节点,pod会一直在pending状态,不断重试调度,直到有节点满足条件。经过这个步骤,如果有多个节点满足条件,就继续priority过程。
  2)对通过的node按照优先级排序,该过程称为priority;
  3)最后从中选择优先级最高的node。
  该过程任何一步骤错误,就直接返回错误。
predicate有一系列的算法可以使用:
  podFitsResources:节点上剩余的资源是否大于pod请求的资源;如果不满足,直接pass掉该node。
  podFitsHost:如果pod指定了nodeName,检查节点名称是否和NodeName匹配;如果不满足,直接pass掉该node。
  podFitsHostPorts:节点上已经使用的port是否和pod申请的port冲突;如果不满足,直接pass掉该node。
  podSelectorMatches:过滤掉和pod指定的label节点是否匹配;如果不匹配,直接pass掉该node。
  NoDiskConflict:已经mount的volume和pod指定的volume是否冲突;如果冲突,直接pass掉该node,除非它们都是只读。
priority:优先级由一系列键值对组成,键是该优先级项的名称,值是它的权重(该项的重要性)。这些优先级选型包括:
  LeastRequestedPriority:通过计算CPU和memory的使用率来决定权重,使用率越低权重越高。换句话说,这个优先级指标倾向于资源使用比例更低的节点。
  BalanceResourceAllocation: 节点上CPU和memory使用率越接近,权重越高;该键与上面的键一起使用,不应单独使用。
  ImageLocalityPriority:倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高。
  通过算法对所有的优先级项目和权重进行计算,得出最终结果。
自定义调度器:
  除了K8S自带的调度器default-scheduler,你可以编写自己的调度器。通过spec:schedulername参数指定调度器的名字,可以为pod选择某个调度器进行调度。
node亲和性
  pod.spec.affinity.nodeAffinity
  preferredDuringSchedulingIgnoredDuringExecution:软策略,pod优先调度到该node;若不满足则可进行其他调度;pod有多个软策略时,则会优先选择权重较高的node;
  requiredDuringSchedulingIgnoredDuringExecution:硬策略,pod必须调度到该node;若不满足则不调度,会报错;

kubernetes集群系列资料14--scheduler介绍

kubectl get node --show-labels  #查询node的label;

kubernetes.io/hostname为键名,k8s-node02为键值。

键值运算关系:
  In:label的值在某个列表中;
  NotIn:label的值步在某个列表中;
  Gt:label的值大于某个值;
  Lt:label的值小于某个值;
  Exists:某个label存在;
  DosesNotExist:某个label不存在;

pod亲和性
  pod.spec.affinity.podAffinity/podAntiAffinity
  preferredDuringSchedulingIgnoredDuringExecution:软策略,;
  requiredDuringSchedulingIgnoredDuringExecution:硬策略;
亲和性/反亲和性调度策略比较如下:
kubernetes集群系列资料14--scheduler介绍

 

案例1:node亲和性---硬策略

cat >node_hard_policy.yaml<<eof
apiVersion: v1
kind: Pod
metadata:
    name: nod-affinity-required
    labels:
        app: nod-affinity-required
spec:
    containers:
    - name: nod-affinity-required
      image: hub.atguigu.com/library/nginx:latest
    affinity:
        nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: NotIn
                    values:
                    - k8s-node02
eof
kubectl apply -f node_hard_policy.yaml
kubectl get pod -o wide
kubectl delete -f node_hard_policy.yaml
kubectl get pod -o wide
kubectl apply -f node_hard_policy.yaml
kubectl get pod -o wide
kubectl delete -f node_hard_policy.yaml
kubectl apply -f node_hard_policy.yaml
kubectl get pod -o wide

kubernetes集群系列资料14--scheduler介绍

 结果显示:硬策略要求必须每次不能调度到node2节点。当修改为IN时,会立即调度到node2;当修改为调度到不存在的node时,则会任务会pending。

kubernetes集群系列资料14--scheduler介绍

kubernetes集群系列资料14--scheduler介绍kubernetes集群系列资料14--scheduler介绍kubernetes集群系列资料14--scheduler介绍

案例2:node亲和性---软策略 

cat >node_soft_policy.yaml<<eof
apiVersion: v1
kind: Pod
metadata:
    name: nod-affinity-preferred
    labels:
        app: nod-affinity-preferred
spec:
    containers:
    - name: nod-affinity-preferred
      image: hub.atguigu.com/library/nginx:latest
    affinity:
        nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              preference:
                  matchExpressions:
                    - key: kubernetes.io/hostname
                      operator: In
                      values:
                      - k8s-node02
eof
kubectl apply -f node_soft_policy.yaml
kubectl get pod -o wide
kubectl delete -f node_soft_policy.yaml
kubectl apply -f node_soft_policy.yaml
kubectl get pod -o wide
kubectl delete -f node_soft_policy.yaml
kubectl apply -f node_soft_policy.yaml
kubectl get pod -o wide 

 kubernetes集群系列资料14--scheduler介绍

 

 

 结果显示:软策略要求优先调度到node2节点。当修改为调度到不存在的node时,则会随机调度。

 kubernetes集群系列资料14--scheduler介绍

 

 kubernetes集群系列资料14--scheduler介绍

 

 

 

 

 

  

 

kubernetes集群系列资料14--scheduler介绍

上一篇:JS实现div的拖拉拽


下一篇:Spring3.2+hibernate4整合报错 NoSuchMethodError:openSession()解决办法