一、 Pod 调度策略深度解析Kubernetes 的默认调度器default-scheduler通过三个核心步骤将 Pod 分配到节点上预选Predicates排除不满足基本条件的节点如内存不足、端口冲突。优选Priorities在剩余节点中根据权重进行打分如选择资源利用率低的节点。绑定将 Pod 绑定到得分最高的节点。除了默认的调度逻辑我们可以通过以下策略控制 Pod 的去向1. 节点标签与调度指定节点名称调度硬指定特点绕过调度器强制 Pod 运行在特定节点。场景测试环境或特殊硬件需求的节点。配置在spec.nodeName中指定节点名。指定节点标签调度软指定特点通过节点标签Labels进行匹配需经过调度器。逻辑步骤给节点打标签kubectl label nodes node-name keyvalue编辑 Pod YAML使用nodeSelector指定标签。2. 亲和性策略Affinity亲和性用于表达“偏好”或“强制要求”分为节点亲和性Node Affinity和Pod 亲和性Pod Affinity。节点亲和性 (nodeAffinity)作用让 Pod 倾向于运行在带有特定标签的节点上。策略类型requiredDuringSchedulingIgnoredDuringExecution硬策略必须满足否则 Pod 处于 Pending 状态。preferredDuringSchedulingIgnoredDuringExecution软策略尽量满足不满足也能运行。匹配逻辑操作符In,NotIn包含/不包含最常用。Exists,DoesNotExist存在/不存在只需判断键无需值。Gt,Lt大于/小于针对整数值。Pod 亲和性 (podAffinity)作用让 Pod 倾向于与其他 Pod 运行在同一拓扑域如同一节点、同一可用区。场景微服务间的低延迟通信如前端与后端同节点。反亲和性 (podAntiAffinity)让 Pod 尽量不与其他 Pod 运行在同一拓扑域。核心配置labelSelector选择哪些 Pod 的标签作为参照。topologyKey定义“拓扑域”的键通常使用kubernetes.io/hostname表示节点级别或使用云平台标签表示可用区级别。3. 实战示例示例 1节点亲和性软策略yamlyamlaffinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: env operator: In values: [ production ]解释尽量将 Pod 调度到envproduction的节点如果没有也可以运行在其他节点。示例 2Pod 反亲和性硬策略yamlyamlaffinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [ myapp ] topologyKey: kubernetes.io/hostname解释强制要求同一个节点上不能运行两个appmyapp的 Pod实现高可用避免单点故障。二、 污点与容忍度Taints Tolerations污点是节点的属性用于排斥​ Pod容忍度是 Pod 的属性用于允许被调度到有污点的节点。1. 污点的作用NoSchedule不将 Pod 调度到带有该污点的节点除非 Pod 有容忍度。PreferNoSchedule尽量避免调度但不是强制。NoExecute不调度新 Pod并驱逐节点上已有的 Pod除非 Pod 有容忍度。2. 设置污点bashbashkubectl taint node node-name keyvalue:effect示例bashbashkubectl taint node k8s-node01 key1value1:NoSchedule3. 容忍度Tolerations在 Pod 的 YAML 中添加tolerations字段允许 Pod 被调度到有特定污点的节点。配置示例yamlyamltolerations: - key: key1 operator: Equal value: value1 effect: NoSchedule解释该 Pod 可以容忍key1value1:NoSchedule的污点因此可以被调度到k8s-node01。4. 典型应用场景专用节点给 GPU 节点打上dedicatedgpu:NoSchedule污点只有带有容忍度的 Pod如 AI 训练任务才能运行。维护模式给节点打上maintenancetrue:NoExecute污点驱逐所有非必要 Pod进行维护。弹性伸缩在云平台上通过污点标记节点即将被销毁让 Pod 自动迁移。三、 综合实战场景场景我们有一个 Redis 集群希望Redis Pod 尽量运行在可用区 A杭州。Redis Pod 之间不能运行在同一节点避免单点故障。只有带有redis-rolemaster标签的节点才能运行 Redis Pod。YAML 配置yamlyamlapiVersion: v1 kind: Pod metadata: name: redis-pod labels: app: redis spec: containers: - name: redis image: redis:latest affinity: # 1. 节点亲和性尽量运行在可用区A假设可用区A的标签是 zonehangzhou nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: zone operator: In values: [ hangzhou ] # 2. Pod反亲和性不能运行在同一节点 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [ redis ] topologyKey: kubernetes.io/hostname # 3. 节点亲和性硬策略必须运行在带有 redis-rolemaster 标签的节点 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: - matchExpressions: - key: redis-role operator: In values: [ master ]四、 总结概念作用方向示例节点亲和性​Pod 倾向于运行在特定标签的节点Pod → NodeenvproductionPod 亲和性​Pod 倾向于与其他 Pod 同拓扑域Pod → Pod同节点、同可用区Pod 反亲和性​Pod 倾向于不与其他 Pod 同拓扑域Pod → Pod不同节点、不同可用区污点 (Taint)​节点排斥 PodNode → Poddedicatedgpu:NoSchedule容忍度 (Toleration)​Pod 允许被调度到有污点的节点Pod → Node容忍dedicatedgpu:NoSchedule通过合理组合亲和性和污点可以实现复杂的调度策略满足生产环境的高可用、资源隔离、成本优化等需求。