当前位置: 首页 > news >正文

K8s调度核心:从Pod分配到节点优化

在 Kubernetes(K8s)中,Pod 调度是指 K8s 系统根据特定规则和策略,将 Pod 合理分配到集群中的某个节点(Node)上运行的过程。其核心目标是确保 Pod 在合适的节点上高效、稳定地运行,充分利用集群资源。

一、调度核心组件

  • kube-scheduler:K8s 核心组件之一,负责执行调度决策。它持续监听未调度的 Pod(Pending 状态),通过一系列算法筛选出符合条件的节点,最终选择最优节点绑定 Pod。
  • 节点(Node):集群中的工作节点,提供计算、存储、网络等资源,是 Pod 的运行载体。
  • Pod:待调度的最小部署单元,包含容器及运行需求(如 CPU、内存、特殊硬件等)。

二、调度流程

kube-scheduler 的调度过程分为过滤(Filtering) 和打分(Scoring) 两个阶段:

  1. 过滤阶段(筛选候选节点)
    从集群所有节点中排除不符合 Pod 运行条件的节点,得到 “候选节点列表”。
    常见过滤规则(谓词):

    • 资源满足:节点的剩余 CPU、内存等资源 ≥ Pod 请求的资源(resources.requests)。
    • 节点选择器匹配:节点标签需满足 Pod 的 nodeSelector 规则(如 env=prod)。
    • 污点与容忍匹配:节点的污点(Taint)需被 Pod 的容忍(Toleration)允许(否则 Pod 无法调度到该节点)。
    • 端口冲突检查:避免 Pod 所需端口在节点上已被占用(针对 hostPort 配置)。

    若过滤后无候选节点,Pod 将一直处于 Pending 状态。

  2. 打分阶段(选择最优节点)
    对候选节点按 “优先级规则” 打分(0-10 分),得分最高的节点被选为最终调度目标。
    常见打分规则(优先级):

    • 资源均衡:优先选择资源使用率较低的节点(避免节点负载过高)。
    • 亲和性偏好:根据 Pod 或节点的亲和性规则(如 nodeAffinitypodAffinity)加分。
    • 镜像 locality:优先选择已缓存 Pod 所需镜像的节点(减少镜像拉取时间)。

三、常用调度策略与示例

1. 节点选择器(nodeSelector)

通过节点标签(Label)和 Pod 的 nodeSelector 直接绑定,简单直观

步骤

  • 给节点打标签:kubectl label nodes node-1 env=prod
  • 在 Pod 中指定选择器:

    yaml

    apiVersion: v1
    kind: Pod
    metadata:name: pod-with-nodeselector
    spec:containers:- name: appimage: nginxnodeSelector:env: prod  # 仅调度到标签为 env=prod 的节点
    

2. 亲和性与反亲和性(Affinity/Anti-Affinity)

比 nodeSelector 更灵活,支持复杂规则(如 “偏好” 或 “必须” 满足、跨 Pod 关联等)。

  • 节点亲和性(nodeAffinity):控制 Pod 调度到哪些节点(基于节点标签)。
    示例:优先调度到 disk=ssd 的节点,若不存在则允许调度到其他节点:

    yaml

    spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:  # 偏好规则(非必须)- weight: 100  # 权重(0-100)preference:matchExpressions:- key: diskoperator: Invalues: [ssd]
    
  • Pod 亲和性(podAffinity):让 Pod 调度到与特定 Pod 相同的节点(基于其他 Pod 的标签),适合服务间通信频繁的场景(如前端与后端)。

  • Pod 反亲和性(podAntiAffinity):让 Pod 避免调度到与特定 Pod 相同的节点,适合分散部署(如分布式数据库节点避免集中在同一节点)。

3. 污点(Taint)与容忍(Toleration)

  • 污点(Taint):节点上的 “排斥性标签”,用于阻止 Pod 调度到该节点(除非 Pod 明确 “容忍” 该污点)。
    示例:给节点添加污点(不允许普通 Pod 调度):

    bash

    kubectl taint nodes node-1 key=value:NoSchedule  # NoSchedule 表示拒绝未容忍的 Pod
    
  • 容忍(Toleration):Pod 上的配置,声明可以 “容忍” 节点的某些污点,从而允许被调度到该节点。
    示例:Pod 容忍上述污点:

    yaml

    spec:tolerations:- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"
    

    常见污点效果:

    • NoSchedule:仅影响新 Pod 调度,不影响已运行的 Pod。
    • NoExecute:不仅拒绝新 Pod,还会驱逐已运行的未容忍 Pod。

4. 节点亲和性与污点的区别

  • 亲和性:Pod 主动 “吸引” 到某些节点(Pod 配置规则)。
  • 污点 / 容忍:节点主动 “排斥” Pod,Pod 需主动 “允许” 被调度(节点配置污点,Pod 配置容忍)。
http://www.dtcms.com/a/360464.html

相关文章:

  • MATLAB R2010b系统环境(四)MATLAB帮助系统
  • LeetCode 每日一题 2025/8/25-2025/8/31
  • 模拟在线测试六线测试相关知识
  • 如何快速学习新技能
  • io进程线程;标准IO;0831
  • Java全栈开发面试实录:从基础到微服务架构的深度解析
  • Augment 宣布 Auggie CLI正式向所有用户开放
  • 利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序
  • Ring Buffer解析
  • Thread、ThreadLocal、ThreadLocalMap
  • 用户态 kill 与 pthread_kill 的区别?
  • 动态链表:结构体模拟单链表的终极指南
  • ts 定义类型
  • Linux学习:简单模拟实现C++中的线程类
  • C++算法学习专题:前缀和
  • 【Linux网络编程】应用层协议-----HTTP协议
  • PostgreSQL表膨胀的危害与解决方案
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)
  • centos 7 安装docker、docker-compose教程
  • AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​
  • 国产数据库之TiDB:博采众长
  • Ruoyi-vue-plus-5.x第二篇MyBatis-Plus数据持久层技术:2.2 分页与性能优化
  • [嵌入式embed]Keil5项目提示Missing: Compiler Version 5
  • 工业互联项目总结:UART
  • Backroom:信息代币化 AI 时代数据冗杂的解决方案
  • 漏洞基础与文件包含漏洞原理级分析
  • 使用 Python mlxtend库进行购物篮分析、关联规则
  • 软考中级习题与解答——第一章_数据结构与算法基础(3)
  • 进程状态 —— Linux内核(Kernel)
  • Linux 文件夹权限也会导致基本命令权限缺失问题