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 查看标签是否写入成功。注意:键和值都必须小写,只允许字母、数字、- 和 .,不能有空格或大写字母。
不是加在顶层 spec,而是加在 spec 下(Deployment 则加在 spec.template.spec):
spec:nodeSelector:disktype: ssdcontainers:- name: nginximage: nginx
spec:template:spec:nodeSelector:disktype: ssdenv: prodcontainers:- name: appimage: myapp:v1
⚠️ 所有键值对必须全部命中,缺一不可。只要有一个节点没同时带 disktype=ssd 和 env=prod,这个 Deployment 的新 Pod 就不会被创建。
部署后立刻检查:
kubectl get pod -o wide —— 看 NODE 列是不是你预期的节点名kubectl describe pod <pod-name> | grep Node: —— 显示实际绑定节点kubectl get pod <pod-name> -o jsonpath='{.spec.nodeName}' —— 直接输出节点名如果状态一直是 Pending,优先检查:节点是否存在、标签拼写是否一致(大小写敏感)、有没有漏掉某个必需标签。
nodeName 是硬指定某一台机器(如 spec.nodeName: node-01),跳过调度器,连资源是否够都不检查;而 nodeSelector 仍走调度流程,会做资源评估、污点容忍等判断,只是加了一道“标签准入”。所以日常固定调度推荐用 nodeSelector,除非你明确需要绕过所有策略。