在 Kubernetes(K8s)中,Pod 调度是指 K8s 系统根据特定规则和策略,将 Pod 合理分配到集群中的某个节点(Node)上运行的过程。其核心目标是确保 Pod 在合适的节点上高效、稳定地运行,充分利用集群资源。
一、调度核心组件
- kube-scheduler :K8s 核心组件之一,负责执行调度决策。它持续监听未调度的 Pod(
Pending
状态),通过一系列算法筛选出符合条件的节点,最终选择最优节点绑定 Pod。 - 节点(Node):集群中的工作节点,提供计算、存储、网络等资源,是 Pod 的运行载体。
- Pod:待调度的最小部署单元,包含容器及运行需求(如 CPU、内存、特殊硬件等)。
二、调度流程
kube-scheduler 的调度过程分为过滤(Filtering) 和打分(Scoring) 两个阶段:
-
过滤阶段(筛选候选节点)
从集群所有节点中排除不符合 Pod 运行条件的节点,得到 "候选节点列表"。
常见过滤规则(谓词):
- 资源满足 :节点的剩余 CPU、内存等资源 ≥ Pod 请求的资源(
resources.requests
)。 - 节点选择器匹配 :节点标签需满足 Pod 的
nodeSelector
规则(如env=prod
)。 - 污点与容忍匹配:节点的污点(Taint)需被 Pod 的容忍(Toleration)允许(否则 Pod 无法调度到该节点)。
- 端口冲突检查 :避免 Pod 所需端口在节点上已被占用(针对
hostPort
配置)。
若过滤后无候选节点,Pod 将一直处于
Pending
状态。 - 资源满足 :节点的剩余 CPU、内存等资源 ≥ Pod 请求的资源(
-
打分阶段(选择最优节点)
对候选节点按 "优先级规则" 打分(0-10 分),得分最高的节点被选为最终调度目标。
常见打分规则(优先级):
- 资源均衡:优先选择资源使用率较低的节点(避免节点负载过高)。
- 亲和性偏好 :根据 Pod 或节点的亲和性规则(如
nodeAffinity
、podAffinity
)加分。 - 镜像 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: app image: nginx nodeSelector: 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: disk operator: In values: [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 配置容忍)。