NodeSelector 是 Kubernetes 中通过精确匹配节点标签实现强制调度的简单方式,需先为节点打标(如 disktype=ssd),再在 Pod spec 中配置 nodeSelector 键值对,不满足所有条件则 Pod 处于 Pending 状态。

在 Kubernetes 中,NodeSelector 是最简单直接的节点亲和调度方式,它通过匹配节点的 label(标签),强制将 Pod 调度到带有指定标签的节点上。要成功使用它,关键在于:先给目标节点打标,再在 Pod 的 spec 中声明要匹配的 label。
1. 给目标节点添加 label
只有打了标、且 label 值与 Pod 中声明一致的节点,才可能被选中。可以用 kubectl label 命令为节点添加自定义标签:
kubectl label nodes <node-name> disktype=ssdkubectl label nodes node-01 env=prod region=beijing
执行后可通过 kubectl get nodes --show-labels 或 kubectl describe node <node-name> 确认标签是否生效。
2. 在 Pod YAML 中配置 nodeSelector
在 Pod 的 spec 字段下添加 nodeSelector,其值是一个键值对映射,Kubernetes 会严格匹配所有键和值:
apiVersion: v1
kind: Pod
metadata:
name: nginx-on-ssd
spec:
nodeSelector:
disktype: ssd
env: prod
containers:
- name: nginx
image: nginx⚠️ 注意:如果节点没有同时满足 disktype=ssd 和 env=prod 这两个 label,该 Pod 将处于 Pending 状态,无法被调度。
3. 验证调度结果
创建 Pod 后,用以下命令检查是否调度成功:
-
kubectl get pod nginx-on-ssd -o wide—— 查看运行在哪个节点 -
kubectl describe pod nginx-on-ssd | grep Node:—— 显示绑定的节点名 -
kubectl get pod nginx-on-ssd -o jsonpath='{.spec.nodeName}'—— 直接输出节点名
4. 注意事项与常见问题
NodeSelector 是硬性约束,不具备容错或备选逻辑:
- 不支持表达式(如
!=、In、Exists),仅支持精确匹配 - 若目标节点宕机或标签被误删,已有 Pod 不受影响,但新副本或重启后的 Pod 可能无法调度
- 它已被更灵活的
nodeAffinity所取代(尤其在需要软策略、权重、多规则时),但对简单固定场景仍推荐优先使用 nodeSelector
不复杂但容易忽略:label 键值区分大小写,且不能包含大写字母或特殊字符(建议只用小写字母、数字、- 和 .)。

















