Kubernetes Pod 调度策略详解:从 NodeSelector 到 Topology Spread
Alex Chen | 2026-08-26T22:59:58 | DevOps, Cloud
全面介绍 K8s 中 NodeSelector、Affinity、Taints/Tolerations、TopologySpreadConstraints 四种调度策略及最佳实践。
# Kubernetes Pod 调度策略详解 ## 一、NodeSelector:最简单的调度 ```yaml apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: nodeSelector: accelerator: nvidia-a100 containers: - name: cuda-app image: nvidia/cuda:12.0-runtime ``` 适用于简单的标签匹配场景,但无法表达"优先"或"反亲和"。 ## 二、Node Affinity:更灵活的表达 ```yaml affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: ["us-east-1a", "us-east-1b"] preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 preference: matchExpressions: - key: instance-type operator: In values: ["m5.xlarge"] ``` `required` 是硬约束,`preferred` 是软约束(尽量满足)。 ## 三、Pod Anti-Affinity:高可用部署 确保同一服务的副本分散在不同节点: ```yaml affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: web-server topologyKey: kubernetes.io/hostname ``` ## 四、TopologySpreadConstraints(推荐) K8s 1.19+ 推荐使用 TopologySpreadConstraints 实现更均匀的分布: ```yaml topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: web-server ``` `maxSkew: 1` 表示各区域副本数差值不超过 1。 ## 最佳实践 1. 生产环境务必设置 Pod Anti-Affinity 保证高可用 2. 多可用区部署使用 TopologySpreadConstraints 3. GPU 等特殊资源用 Taints + Tolerations 保护节点