温馨提示×

centos k8s部署中容器如何调度

小樊
45
2025-09-18 02:41:30
栏目: 智能运维

一、Kubernetes调度器核心角色

在CentOS K8S部署中,kube-scheduler是负责容器(Pod)调度的核心组件。它接收Controller Manager创建的新Pod或需补足副本的Pod,根据节点资源、标签、亲和性等策略,将Pod绑定(Binding)到合适的Worker节点,随后节点上的kubelet启动容器。调度流程遵循“预选(Filtering)→ 优选(Scoring)→ 绑定(Binding)”的三阶段逻辑。

二、容器调度核心策略

1. 基于资源需求的调度

容器通过resources.requests(资源请求)和resources.limits(资源限制)声明CPU、内存等需求。调度器会筛选出剩余资源满足请求的节点(如Pod请求1核CPU,节点剩余CPU≥1核),避免资源过载。同时,K8S会根据Pod的QoS级别(Guaranteed/Burstable/BestEffort)优化调度,优先保障关键业务的资源预留。

2. 亲和性与反亲和性调度

  • 亲和性(Affinity):通过nodeAffinity(节点亲和性)将相关Pod调度到同一节点或相近节点(如前端与后端容器),减少网络延迟(如requiredDuringSchedulingIgnoredDuringExecution表示必须满足);
  • 反亲和性(Anti-Affinity):通过podAntiAffinity将Pod分散到不同节点(如同一服务的多个副本),避免单点故障(如topologyKey: kubernetes.io/hostname表示分散到不同主机)。

3. 污点(Taints)与容忍度(Tolerations)调度

  • 污点:通过kubectl taint nodes <节点名> key=value:effect(如disktype=ssd:NoSchedule)标记节点的特殊属性(如硬件维护、专用节点),阻止普通Pod调度;
  • 容忍度:Pod通过tolerations字段声明可容忍的污点(如key: disktype, operator: Equal, value: ssd, effect: NoSchedule),允许调度到带对应污点的节点,实现节点的精细化管理。

4. 拓扑分布约束(Topology Spread Constraints)

通过topologySpreadConstraints字段实现Pod的跨拓扑域(如可用区、机架、节点)均匀分布,避免资源热点。例如,设置maxSkew: 1(最大偏差为1)、topologyKey: topology.kubernetes.io/zone(按可用区分布),确保Pod在不同可用区的数量差不超过1。

5. 节点选择器(NodeSelector)与定向调度

  • NodeSelector:通过nodeSelector字段(如disktype: ssd)强制Pod调度到带有指定标签的节点,适用于有特殊硬件需求的容器(如GPU节点);
  • nodeName:通过nodeName字段直接指定Pod调度的节点名称(如nodeName: node-01),适用于测试或固定节点的场景。

三、调度流程详解

  1. 预选阶段(Filtering)
    调度器首先排除不满足硬性条件的节点,包括:

    • 资源不足(节点剩余CPU/内存小于Pod请求);
    • 污点不匹配(Pod未设置容忍度,但节点有污点);
    • 标签不匹配(Pod的nodeSelector与节点标签不符);
    • Pod亲和性/反亲和性不满足(如要求与某Pod同节点,但该Pod不存在)。
  2. 优选阶段(Scoring)
    对通过预选的节点进行评分(满分10分),评分规则包括:

    • 资源均衡NodeResourcesBalancedAllocation):倾向于资源使用率更均衡的节点(如CPU剩余20%、内存剩余30%的节点比CPU剩余5%、内存剩余80%的节点得分高);
    • 最少请求LeastRequestedPriority):优先选择资源剩余多的节点(如剩余CPU最多的节点);
    • 镜像本地化ImageLocalityPriority):优先选择已缓存Pod镜像的节点(减少镜像下载时间)。
  3. 绑定阶段(Binding)
    调度器选择得分最高的节点,将Pod的nodeName字段更新为目标节点,并将绑定信息写入etcd。目标节点上的kubelet通过监听API Server,获取Pod清单并启动容器。

四、优化与扩展建议

  • 调整资源请求/限制:合理设置resources.requestsresources.limits,避免资源浪费或不足(如CPU请求设置为Pod平均使用率的1.2倍);
  • 启用资源拓扑感知:通过CPU Manager功能,根据节点NUMA拓扑结构分配CPU,提升容器性能(如NUMA-aware调度);
  • 使用调度器插件:扩展调度器功能,如podTopologySpread插件实现更灵活的拓扑分布,priority插件支持Pod优先级调度(高优先级Pod优先调度);
  • 优化kube-scheduler配置:调整--kube-api-qps(API Server请求频率)、--leader-elect(高可用)等参数,提升调度性能。

0