Scheduler

178 阅读2分钟

简介

① 公平:如何保证每个节点都能被分配资源

② 资源高效利用:集群所有资源最大化被使用

③ 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作

④ 灵活:允许用户根据自己的需求控制调度的逻辑

调度过程

预选

PodFitsResources:节点上剩余的资源是否大于 Pod 请求的资源
PodFitsHost:如果 Pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配
PodFitsHostPorts:节点上已经使用的 port 是否和 Pod 申请的 port 冲突
PodSelectorMatches:过滤掉和 Pod 指定的 label 不匹配的节点
NoDiskConflict:已经 mount 的 volume 和 Pod 指定的 volume 不冲突,除非它们都是只读的
CheckNodeDiskPressure:检查节点磁盘空间是否符合要求
CheckNodeMemoryPressure:检查节点内存是否够用

优选

LeastRequestedPriority:通过计算 CPU 和内存的使用率来决定权重,使用率越低权重越高,当然正常肯定也是资源是使用率越低权重越高,能给别的 Pod 运行的可能性就越大
SelectorSpreadPriority:为了更好的高可用,对同属于一个 Deployment 或者 RC 下面的多个 Pod 副本,尽量调度到多个不同的节点上,当一个 Pod 被调度的时候,会先去查找该 Pod 对应的 controller,然后查看该 controller 下面的已存在的 Pod,运行 Pod 越少的节点权重越高
ImageLocalityPriority:就是如果在某个节点上已经有要使用的镜像节点了,镜像总大小值越大,权重就越高
NodeAffinityPriority:这个就是根据节点的亲和性来计算一个权重值
{    "kind" : "Policy",    
     "apiVersion" : "v1",    
     "predicates" : [        
        {"name" : "PodFitsHostPorts"},        
        {"name" : "PodFitsResources"},        
        {"name" : "NoDiskConflict"},        
        {"name" : "NoVolumeZoneConflict"},        
        {"name" : "MatchNodeSelector"},        
        {"name" : "HostName"}    
     ],    
     "priorities" : [        
         {"name" : "LeastRequestedPriority", "weight" : 1},        
         {"name" : "BalancedResourceAllocation", "weight" : 1},        
         {"name" : "ServiceSpreadingPriority", "weight" : 1},        
         {"name" : "EqualPriority", "weight" : 1}    
      ]
}

节点亲和性

pod.spec.affinity.nodeAffinity.

preferredDuringSchedulingIgnoredDuringExecution(优先执行计划):软策略

requiredDuringSchedulingIgnoredDuringExecution(要求执行计划):硬策略

 nodeSelectorTerms: 
 - matchExpressions:   
   - key: kubernetes.io/hostname     
     operator: NotIn           
     values:     
     - k8s-node02 #node的hostname不存在node02,硬策略

kubectl get node --show-labels kubectl describe nodes k8s-node01

      affinity:        
        nodeAffinity:          
          preferredDuringSchedulingIgnoredDuringExecution:          
          - weight: 60            
            preference:              
              matchExpressions:              
              - key: kubernetes.io/hostname                
                operator: In                
                values:                
                - k8s-node-223-65

键值运算关系

① In:label 的值在某个列表中

② NotIn:label 的值不在某个列表中

③ Gt:label 的值大于某个值

④ Lt:label 的值小于某个值

⑤ Exists:某个 label 存在

⑥ DoesNotExist:某个 label 不存在

pod亲和性

pod.spec.affinity.podAffinity指定pod与pod在同一拓扑域podAntiAffinitypod指定pod与pod不在同一拓扑域

 podAffinity:   
   preferredDuringSchedulingIgnoredDuringExecution:   
   - weight: 1     
     podAffinityTerm:       
       labelSelector:         
         matchExpressions:         
         - key: app           
           operator: In           
           values:           
           - pod-2       
       topologyKey: kubernetes.io/hostname #符合app这个key的值是pod-2时,会调度到与topologyKey指定的key相同的节点上
podAntiAffinity: #反亲和性
  requiredDuringSchedulingIgnoredDuringExecution:  # 硬策略
  - labelSelector:
      matchExpressions:
      - key: app
        operator: In
        values:
        - busybox-pod
    topologyKey: kubernetes.io/hostname

指定调度节点

spec:  
  nodeSelector:    
    type: backEndNode1 #调度到type值为backEndNode1的node节点上