kubernetes 核心组件运行机制-Scheduler原理解析

106 阅读5分钟

概述

Scheduler在整个系统中起到“承上启下”作用,“承上”指的是它负责接收Controller Manager创建新的Pod,为其安排一个落脚的地方,也就是目标Node;“启下”是指安置工作完成后,目标Node上的kubelet服务进程接管后续的工作,负责Pod生命周期中的“下半生”。

具体来说,Scheduler的作用是将待调度的Pod按照特定的调度算法和调度策略绑定到集群中的某个合适的Node上,并将绑定的信息写到ETCD中。在整个调度的过程中涉及三个对象:

  • 待调度的Pod列表
  • 可用的Node列表
  • 调度算法和策略

随后,目标节点上的kubelet通过API Server监听到Scheduler产生的Pod绑定事件,然后获取对应的Pod清单,下载镜像并启动容器。

f09867fa4d7274344973411f0e478d92.jpeg

Scheduler默认执行流程分为两步:

  • 预选调度:遍历所有目标Node,筛选出符合要求的候选节点。
  • 选优调度:在第一步基础上,采用优选策略计算出每个候选节点的积分,积分最高的胜出。

Scheduler中可用的预选策略包含:NoDiskConflict/PodFitsResources/PodSelectorMatches/PodFitsHost/CheckNodeLabelPresence/CheckServiceAffinityPodFitsPorts策略等。

策略

预选策略详情说明

  1. NoDiskConflict 判断备选Pod的gccPersistentDisk或者AWSElasticBlockStore和备选的节点中已经存在的Pod是否冲突。

    • 首先读取备选Pod的所有Volume的信息(即pod.spec.volumes),对每个Volume执行以下步骤进行冲突检测。
    • 如果该VolumegccPersistentDisk,则将Volume的备选节点上的所有Pod的每个Volume都进行比较,如果发现相同的gccPersistentDisk,则返回false,表明存在冲突,检测结束,反馈给调度器该备选节点不合适。如果该VolumeAWSElasticBlockStore,则将Volume的备选节点上的所有Pod的每个Volume都进行比较,如果发现相同的AWSElasticBlockStore,则返回false,表明存在冲突,检测结束,反馈给调度器该备选节点不合适。
    • 如果检查完备选Pod的所有Volume均未发现冲突,则返回true,表面不存在磁盘冲突,反馈给调度器太备选节点适合备选Pod
  2. PodFitsResources 判断备选节点的资源是否满足备选Pod的需求,检测过程如下:

    • 计算备选Pod和节点中已经存在Pod的所有容器的需求资源的总和
    • 获取备选节点的信息,其中包括节点的资源信息
    • 如果计算的总和超过备选节点拥有的资源,则返回false,表明备选节点和合适,否则返回true,表明备选节点适合。
  3. PodSelectorMatches 判断备选节点是否包含备选Pod的标签

    • 如果Pod没有指定spec.nodeSelector标签选择器,则返回true
    • 否则获得备选节点的标签信息,判断是否包含备选Pod的标签,如果包含,返回true;否则,返回false
  4. PodFitsHost 判断备选Pod的spec.nodeName域所指定的节点名称和备选节点的名称是否一致,如果一致返回true,否则返回false

  5. CheckNodeLabelPresence 如果用户在配置文件中指定了该策略,则Scheduler会通过RegisterCustomFitPredicate方法注册该策略。该策略用于判断策略列出的标签在备选节点中存在时,是否选择该备选节点。

    • 读取备选节点的标签列表信息
    • 如果策略配置的标签列表存在于备选节点的标签列表中,且策略配置的presence值为false,则返回false,否则返回为true;如果策略配置的标签列表不存在于备选节点的标签列表中,且策略配置的presence值为true,则返回false,否则返回为true
  6. CheckServiceAffinity 该策略用于判断备选节点是否包含策略指定的标签,或者包含和备选Pod在相同ServiceNamespace下的Pod所在节点标签列表。如果存在,返回true,否则返回false。

  7. PodFitsPorts 判断备选Pod的所用的端口列表中的端口是否在备选节点中已经被占用,如果被占用,则返回false,否则返回true。

优选策略详情说明

Scheduler中的优选策略包含:LeastRequestedPriority/CalculateNodeLabelPriority/BalancedResourceAllocation等。用积分制作为优选结果。

  1. LeastRequestedPriority该策略用于从备选节点列表中选出资源消耗最小的节点
    • 计算出所有备选节点上运行的Pod和备选Pod的CPU占用量
    • 计算出所有备选节点上运行的Pod和备选Pod的内存占用量
    • 按照自己的计算规则计算得分
  2. CalculateNodeLabelPriority 判断策略列出点标签在备选节点中存在时,是否选择该节点。如果备选节点的标签在优选策略的标签列表中,且优选策略presence的值为true,或者备选节点的标签不在优选策略的标签列表中,且优选策略的presence的值为false,则备选节点score=0,否则score=0。
  3. BalancedResourceAllocation 用于从备选节点列表中选出各项资源使用率最均衡的节点。
    • 计算出所有备选节点上运行的Pod和备选Pod的CPU占用量
    • 计算出所有备选节点上运行的Pod和备选Pod的内存占用量
    • 按照自己的计算规则计算得分

结语

总之,K8s的调度机制不仅是其实现自动化部署和管理容器化应用的基石,也是其能够应对复杂多变业务场景、保障服务高可用性和资源优化的基础。随着云原生生态的不断演进,K8s调度技术将持续创新,为企业数字化转型和云基础设施的智能化管理提供更加强大的支撑