在CentOS K8S部署中,kube-scheduler是负责容器(Pod)调度的核心组件。它接收Controller Manager创建的新Pod或需补足副本的Pod,根据节点资源、标签、亲和性等策略,将Pod绑定(Binding)到合适的Worker节点,随后节点上的kubelet启动容器。调度流程遵循“预选(Filtering)→ 优选(Scoring)→ 绑定(Binding)”的三阶段逻辑。
容器通过resources.requests(资源请求)和resources.limits(资源限制)声明CPU、内存等需求。调度器会筛选出剩余资源满足请求的节点(如Pod请求1核CPU,节点剩余CPU≥1核),避免资源过载。同时,K8S会根据Pod的QoS级别(Guaranteed/Burstable/BestEffort)优化调度,优先保障关键业务的资源预留。
nodeAffinity(节点亲和性)将相关Pod调度到同一节点或相近节点(如前端与后端容器),减少网络延迟(如requiredDuringSchedulingIgnoredDuringExecution表示必须满足);podAntiAffinity将Pod分散到不同节点(如同一服务的多个副本),避免单点故障(如topologyKey: kubernetes.io/hostname表示分散到不同主机)。kubectl taint nodes <节点名> key=value:effect(如disktype=ssd:NoSchedule)标记节点的特殊属性(如硬件维护、专用节点),阻止普通Pod调度;tolerations字段声明可容忍的污点(如key: disktype, operator: Equal, value: ssd, effect: NoSchedule),允许调度到带对应污点的节点,实现节点的精细化管理。通过topologySpreadConstraints字段实现Pod的跨拓扑域(如可用区、机架、节点)均匀分布,避免资源热点。例如,设置maxSkew: 1(最大偏差为1)、topologyKey: topology.kubernetes.io/zone(按可用区分布),确保Pod在不同可用区的数量差不超过1。
nodeSelector字段(如disktype: ssd)强制Pod调度到带有指定标签的节点,适用于有特殊硬件需求的容器(如GPU节点);nodeName字段直接指定Pod调度的节点名称(如nodeName: node-01),适用于测试或固定节点的场景。预选阶段(Filtering):
调度器首先排除不满足硬性条件的节点,包括:
nodeSelector与节点标签不符);优选阶段(Scoring):
对通过预选的节点进行评分(满分10分),评分规则包括:
NodeResourcesBalancedAllocation):倾向于资源使用率更均衡的节点(如CPU剩余20%、内存剩余30%的节点比CPU剩余5%、内存剩余80%的节点得分高);LeastRequestedPriority):优先选择资源剩余多的节点(如剩余CPU最多的节点);ImageLocalityPriority):优先选择已缓存Pod镜像的节点(减少镜像下载时间)。绑定阶段(Binding):
调度器选择得分最高的节点,将Pod的nodeName字段更新为目标节点,并将绑定信息写入etcd。目标节点上的kubelet通过监听API Server,获取Pod清单并启动容器。
resources.requests和resources.limits,避免资源浪费或不足(如CPU请求设置为Pod平均使用率的1.2倍);CPU Manager功能,根据节点NUMA拓扑结构分配CPU,提升容器性能(如NUMA-aware调度);podTopologySpread插件实现更灵活的拓扑分布,priority插件支持Pod优先级调度(高优先级Pod优先调度);--kube-api-qps(API Server请求频率)、--leader-elect(高可用)等参数,提升调度性能。