1. 引言
Kubernetes 作为云原生领域的核心编排系统,其调度器(Scheduler)负责将 Pod 分配到最优的 Node 上运行。调度器的设计直接影响集群的资源利用率、应用性能和高可用性。本文将深入剖析 Kubernetes 调度器的核心机制、调度流程、策略扩展及优化实践。
2. Kubernetes 调度器概述
2.1 调度器的角色
Kubernetes 调度器是一个独立的控制平面组件,默认监听 API Server 的 Pod 资源变更。当 Pod 的 spec.nodeName 为空时,调度器会依据预选(Filtering)和优选(Scoring)策略为其选择最佳 Node。
2.2 调度流程概览
- 监听未调度 Pod:通过 Watch API Server 获取
Pending状态的 Pod。 - 预选(Filter):排除不满足条件的 Node(如资源不足、标签不匹配)。
- 优选(Score):对剩余 Node 打分(如资源均衡、亲和性优先级)。
- 绑定(Bind):将 Pod 与 Node 绑定,更新
spec.nodeName。
3. 调度核心机制详解
3.1 预选(Filtering)阶段
预选阶段通过一组 Predicate 策略 过滤不符合条件的 Node。常见的策略包括:
- NodeResourcesFit:检查 CPU/Memory 是否满足 Pod 请求。
- NodeAffinity:匹配 Node 的标签亲和性(
requiredDuringSchedulingIgnoredDuringExecution)。 - PodTopologySpread:确保 Pod 在拓扑域(如 Zone/Region)间均匀分布。
示例:
以下 Pod 要求运行在带有 gpu=true 标签的 Node 上:
yaml
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu
operator: In
values: ["true"]
containers:
- name: nginx
image: nginx
3.2 优选(Scoring)阶段
优选阶段通过 Priority 函数 对 Node 打分(0-100 分),最终选择最高分 Node。常用函数包括:
- LeastRequestedPriority:优先选择资源空闲率高的 Node。
- BalancedResourceAllocation:平衡 CPU 和 Memory 使用率。
- InterPodAffinityPriority:实现 Pod 间亲和性/反亲和性。
示例:
以下配置优先调度到 zone: east 的 Node:
yaml
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80
preference:
matchExpressions:
- key: zone
operator: In
values: ["east"]
3.3 调度器扩展机制
3.3.1 调度器框架(Scheduler Framework)
Kubernetes 1.15+ 引入的插件化框架,允许开发者扩展调度逻辑。关键扩展点包括:
QueueSort:定义 Pod 调度队列的排序规则。Filter:自定义预选逻辑。Score:自定义打分逻辑。
示例:自定义插件过滤低优先级 Node:
go
func (pl *CustomPlugin) Filter(ctx context.Context, pod *v1.Pod, node *v1.Node) *framework.Status {
if node.Labels["priority"] < "high" {
return framework.NewStatus(framework.Unschedulable, "low-priority-node")
}
return nil
}
3.3.2 调度器配置(Scheduler Profile)
通过 KubeSchedulerConfiguration 定义多个调度器配置,支持不同场景:
yaml
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
filter:
enabled:
- name: NodeResourcesFit
score:
enabled:
- name: BalancedResourceAllocation
4. 高级调度场景与优化
4.1 Pod 拓扑分布约束
通过 topologySpreadConstraints 控制 Pod 在拓扑域的分布,避免单点故障:
yaml
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: nginx
4.2 动态资源调度(Dynamic Resource Allocation)
Kubernetes 1.26+ 支持 GPU、FPGA 等设备的动态分配:
yaml
resources:
claims:
- name: gpu-resource
source:
resourceClaimTemplateName: gpu-claim-template
4.3 调度性能优化
- 批量调度:通过
PercentageOfNodesToScore参数限制打分 Node 数量(默认 50%)。 - 缓存优化:启用
CacheAwareScheduling减少 API Server 负载。
5. 调度器问题排查
5.1 常见问题
- Pending Pod:检查资源不足、亲和性冲突或污点(Taint)限制。
- 调度延迟:监控调度器队列深度(
scheduler_pending_pods指标)。
5.2 调试工具
kubectl describe pod <pod-name>:查看调度失败原因。kubectl get events --field-selector involvedObject.name=<pod-name>:获取调度事件。
6. 总结
Kubernetes 调度器通过多阶段策略实现高效的资源分配,其核心在于预选与优选机制的协同。开发者可通过调度器框架扩展自定义逻辑,并结合拓扑分布、动态资源等特性满足复杂场景需求。未来,调度器将更注重异构资源(如 AI 加速卡)的支持与实时性优化。
附录:扩展阅读
501

被折叠的 条评论
为什么被折叠?



