引言
Kubernetes 作为容器编排引擎,调度器(Scheduler)是其核心组件之一。它负责将新创建的、尚未分配节点的 Pod 调度到合适的集群节点上。本文将深入剖析 Kubernetes 调度框架、调度策略以及 Pod 的完整生命周期管理。
1. Kubernetes 调度器架构
kube-scheduler 是 Kubernetes 的控制平面组件,其核心工作流程分为三个阶段:过滤(Filtering)、评分(Scoring)和绑定(Binding)。从 Kubernetes 1.15 开始,调度框架(Scheduling Framework)以插件化的方式重构,大幅提升了扩展性。
1.1 调度队列
调度器维护三个队列:activeQ 存放待调度 Pod,unschedulableQ 存放暂时无法调度的 Pod(等待重试),podBackoffQ 存放调度失败进入退避期的 Pod。调度器从 activeQ 取出 Pod 进行调度。
1.2 调度周期
单个调度周期包含以下几个扩展点(Extension Points):
- QueueSort:决定 Pod 在待调度队列中的排序顺序
- PreFilter:预检 Pod 或集群状态,验证是否满足调度前置条件
- Filter:过滤不满足条件的节点(相当于传统的 Predicates)
- PreScore:为评分阶段做预处理
- Score:对通过过滤的节点打分排名
- Reserve:在绑定前预留资源
- Permit:批准/拒绝/等待 Pod 调度
- PreBind/Bind/PostBind:绑定阶段的前/中/后处理
2. 核心调度算法
2.1 节点过滤策略 (Predicates)
过滤阶段确保 Pod 不会被调度到不兼容的节点上,常见的内置策略包括:
- PodFitsResources:检查节点可用资源是否满足 Pod 请求
- PodFitsHost:检查节点名称是否匹配 nodeSelector
- PodFitsHostPorts:检查端口冲突
- PodMatchNodeSelector:检查 nodeSelector 和 nodeAffinity
- NoDiskConflict:检查存储卷冲突
- TaintToleration:检查污点容忍
2.2 节点评分策略 (Priorities/Scores)
评分阶段通过多项指标对候选节点综合打分:
- LeastRequestedPriority:优先选择资源空闲率高的节点
- BalancedResourceAllocation:优先选择 CPU/内存使用率均衡的节点
- ImageLocalityPriority:优先选择已缓存容器镜像的节点
- NodeAffinityPriority:根据 NodeAffinity 偏好打分
- TaintTolerationPriority:根据污点容忍程度打分
- InterPodAffinityPriority:根据 Pod 亲和性规则打分
3. 亲和性与反亲和性
3.1 Node Affinity (节点亲和性)
Node Affinity 提供两种模式:requiredDuringSchedulingIgnoredDuringExecution(硬性)和 preferredDuringSchedulingIgnoredDuringExecution(软性)。硬性模式要求必须匹配才能调度,软性模式尽量匹配但非必须。
3.2 Pod Affinity/Anti-Affinity (Pod 亲和/反亲和)
Pod 亲和性让 Pod 倾向于调度到具有特定标签的 Pod 所在的节点上,适用于需要将关联服务调度到同一机架/可用区。反亲和性则避免 Pod 调度到同一节点,提升高可用性。
4. 污点 (Taint) 与容忍 (Toleration)
污点是节点的属性,使节点排斥一类 Pod。Toleration 是 Pod 的属性,允许(非强制)Pod 调度到匹配污点的节点上。常见污点效应包括:NoSchedule(禁止新 Pod 调度)、PreferNoSchedule(尽量不调度)、NoExecute(驱逐不匹配的现有 Pod)。
5. Pod 完整生命周期
5.1 生命周期状态
Pod 的状态(PodStatus.phase)包括:Pending(已接受未创建)、Running(所有容器已创建且至少一个运行)、Succeeded(所有容器成功终止)、Failed(至少一个容器失败)、Unknown(无法获取状态)。
5.2 容器状态
每个容器有三种状态:Waiting(等待中,如拉取镜像)、Running(运行中)、Terminated(已终止)。容器状态通过 containerStatuses 字段暴露。
5.3 重启策略
Pod 的重启策略(RestartPolicy)有三种:Always(总是重启,适用 Deployment)、OnFailure(失败时重启,适用 Job)、Never(从不重启,适用 Batch 任务)。kubelet 负责执行容器重启,重启间隔采用指数退避(10s, 20s, 40s...最大 5min)。
5.4 容器探针
Kubernetes 提供三种健康检查机制:
- Liveness Probe (存活探针):判断容器是否需要重启。失败则 kubelet 终止并依据重启策略处理。
- Readiness Probe (就绪探针):判断容器是否准备好接受流量。失败则从 Service Endpoints 中移除。
- Startup Probe (启动探针):判断容器应用是否已经完成启动。在成功之前,Liveness 和 Readiness 探针不会启用,适用于慢启动应用。
5.5 优雅终止
Pod 删除时经历优雅终止流程:kubectl 删除请求 → API Server 设置 deletionTimestamp → kubelet 收到变更 → 发送 SIGTERM 信号 → 等待 terminationGracePeriodSeconds(默认 30s) → 强制 SIGKILL → API Server 从 etcd 删除 Pod 记录。
6. 调度器性能优化
对于大规模集群,可以调整 PercentageOfNodesToScore 参数来减少评分节点数量。默认配置下,100 节点以上集群按 50%-10% 逐步递减。也可以通过实现自定义调度器或使用 Scheduler Extender 来满足特殊场景需求。
结语
Kubernetes 调度器是一个高度可配置的组件,通过理解其内部机制和配置选项,我们可以更好地优化集群资源利用率、保障应用可用性。调度框架的插件化架构也为用户提供了充分的扩展空间。

发表评论 取消回复