nodeselector 是强制匹配的调度方式,pod 只能调度到同时满足所有标签条件的节点,否则处于 pending 状态;需先用 kubectl label 给节点打小写标签(仅含字母、数字、-、.),再在 pod 或 deployment 的 spec.template.spec 中声明 nodeselector,所有键值对必须全部命中。

直接用 nodeSelector 就能实现——它不是“建议”,而是强制匹配:Pod 只会落在同时满足所有标签条件的节点上,不满足就卡在 Pending 状态。
给目标节点打上标签
先确认你要调度到哪个节点(比如 node-01),再用 kubectl label 添加自定义标签:
kubectl label nodes node-01 disktype=ssdkubectl label nodes node-01 env=prodkubectl label nodes node-01 role=ingress
执行后运行 kubectl get nodes --show-labels 或 kubectl describe node node-01 查看标签是否写入成功。注意:键和值都**必须小写**,只允许字母、数字、- 和 .,不能有空格或大写字母。
在 Pod 或 Deployment 中声明 nodeSelector
不是加在顶层 spec,而是加在 spec 下(Deployment 则加在 spec.template.spec):
- 单标签 Pod 示例:
spec:
nodeSelector:
disktype: ssd
containers:
- name: nginx
image: nginx- 多标签 Deployment 示例(更常用):
spec:
template:
spec:
nodeSelector:
disktype: ssd
env: prod
containers:
- name: app
image: myapp:v1⚠️ 所有键值对必须全部命中,缺一不可。只要有一个节点没同时带 disktype=ssd 和 env=prod,这个 Deployment 的新 Pod 就不会被创建。
验证是否调度成功
部署后立刻检查:
-
kubectl get pod -o wide—— 看NODE列是不是你预期的节点名 -
kubectl describe pod <pod-name> | grep Node:</pod-name>—— 显示实际绑定节点 -
kubectl get pod <pod-name> -o jsonpath='{.spec.nodeName}'</pod-name>—— 直接输出节点名
如果状态一直是 Pending,优先检查:节点是否存在、标签拼写是否一致(大小写敏感)、有没有漏掉某个必需标签。
它和 nodeName 的区别
nodeName 是硬指定某一台机器(如 spec.nodeName: node-01),跳过调度器,连资源是否够都不检查;而 nodeSelector 仍走调度流程,会做资源评估、污点容忍等判断,只是加了一道“标签准入”。所以日常固定调度推荐用 nodeSelector,除非你明确需要绕过所有策略。











