1. Kubernetes 调度系统架构解析
在分布式系统中,资源调度一直是个复杂的问题。Kubernetes 作为容器编排的事实标准,其调度系统设计尤其精妙。我曾在多个生产集群中实践调度策略,深刻体会到:调度不是简单的资源分配,而是集群稳定性的第一道防线。
Kubernetes 调度器(kube-scheduler)的工作流程可以类比为机场的登机系统:
- 值机柜台(Filtering阶段):检查旅客(Pod)的机票(资源需求)是否符合航班(Node)的基本要求
- VIP候机室(Scoring阶段):为符合条件的航班进行优先级排序
- 登机口(Binding阶段):最终确认座位分配
这个过程中有三个核心机制协同工作:
1.1 节点选择器(nodeSelector)
这是最简单的调度约束方式,相当于硬性准入条件。比如我们有个GPU计算集群:
yaml复制apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: cuda-container
image: nvidia/cuda
nodeSelector:
accelerator: nvidia-tesla-v100
关键细节:nodeSelector 是精确匹配,键值必须完全一致。我在生产环境中曾踩过坑:某节点标签是"gpu: true",而Pod要求"gpu: True",导致调度失败。
1.2 污点与容忍度(Taint/Toleration)
这相当于节点的"免疫系统",控制哪些Pod可以"忍受"节点的特殊条件。常见场景包括:
- 专用节点(如GPU节点只运行AI任务)
- 故障节点隔离
- 特殊硬件节点(如带FPGA的服务器)
yaml复制# 给节点打污点
kubectl taint nodes node1 special=true:NoSchedule
# Pod中声明容忍度
tolerations:
- key: "special"
operator: "Equal"
value: "true"
effect: "NoSchedule"
经验之谈:NoEx
