机制定位
nodeSelector 是节点选择最直白的写法:用一组节点标签键值对精确指定目标节点,多个键之间是 AND 关系,必须同时满足。适用平台是 Kubernetes(Pod 的 spec.nodeSelector)。它只影响调度那一刻:Pod 一旦跑起来,节点标签变化不会触发迁移。需要更复杂的表达式或软偏好时,应改用 nodeAffinity。
基本信息
| 适用平台 | Kubernetes,Pod 级字段 spec.nodeSelector |
|---|---|
| 匹配语义 | 多个键值为 AND,必须同时满足 |
| 常用内置标签 | kubernetes.io/hostname、kubernetes.io/os、topology.kubernetes.io/zone、node.kubernetes.io/instance-type |
| 与 affinity 的关系 | 两者同时存在时都要满足 |
典型使用场景
- 固定机型:把 GPU 或高内存任务限制到专用节点池
- 环境隔离:业务与系统组件分布在不同的节点上
- 指定可用区:配合有数据本地性要求的服务落区
- 灰度新机型:新节点先打标签,小范围工作负载先跑
- 排查调度问题:确认 Pod 声明的选择器与节点标签是否还对得上
使用
使用
spec:
nodeSelector:
disktype: ssd
topology.kubernetes.io/zone: cn-hangzhou-b打标签与核对
打标签与核对
kubectl label node node1 disktype=ssd # 打标签
kubectl get nodes -L disktype -L topology.kubernetes.io/zone # 查看现有标签
kubectl get nodes -l disktype=ssd # 命中哪些节点
kubectl describe pod web-x | grep -i 'Node-Selectors' # Pod 声明的选择器
kubectl get events --field-selector reason=FailedScheduling --sort-by=.lastTimestamp | tail -3写法对照
| 写法 | 表达力 | 适用 |
|---|---|---|
| nodeSelector | 等值匹配,多键 AND | 简单固定的节点挑选 |
| nodeAffinity required | In/NotIn/Exists/Gt/Lt 等表达式 | 复杂条件与排除 |
| nodeAffinity preferred | 按权重打分 | 偏好而非强制 |
| tolerations + taint | 配合污点使用 | 专用节点排他 |
常用内置标签:kubernetes.io/hostname、kubernetes.io/os、topology.kubernetes.io/zone、node.kubernetes.io/instance-type,直接用内置标签比自定义更省心。
nodeSelector 只在调度时生效:节点标签后续被改动不会触发 Pod 迁移,需要重建或滚动更新才会重新选择。
落地时的核对点
- 打标签与写选择器要成套进行:节点标签由运维维护,清单里的选择器由研发维护,两边要约定好键名规范
- 扩缩容脚本要包含打标签步骤,新节点加入后未打标签会导致新 Pod 无处可去
- 复杂条件改用 nodeAffinity:需要排除、范围比较或软偏好时,nodeSelector 表达不了
- 专用节点配合污点使用:只有选择器没有 taint 时其他工作负载仍会调度进去