一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Kubernetes 如何配置 NodeSelector 将应用调度到指定节点

时间:2026-08-17 08:24:48 编辑:袖梨 来源:一聚教程网

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

直接用 nodeSelector 就能实现——它不是“建议”,而是强制匹配:Pod 只会落在同时满足所有标签条件的节点上,不满足就卡在 Pending 状态。

给目标节点打上标签

先确认你要调度到哪个节点(比如 node-01),再用 kubectl label 添加自定义标签:

  1. kubectl label nodes node-01 disktype=ssd
  2. kubectl label nodes node-01 env=prod
  3. kubectl label nodes node-01 role=ingress

执行后运行 kubectl get nodes --show-labelskubectl describe node node-01 查看标签是否写入成功。注意:键和值都必须小写,只允许字母、数字、-.,不能有空格或大写字母。

在 Pod 或 Deployment 中声明 nodeSelector

不是加在顶层 spec,而是加在 spec 下(Deployment 则加在 spec.template.spec):

  1. 单标签 Pod 示例:
spec:nodeSelector:disktype: ssdcontainers:- name: nginximage: nginx
  1. 多标签 Deployment 示例(更常用):
spec:template:spec:nodeSelector:disktype: ssdenv: prodcontainers:- name: appimage: myapp:v1

⚠️ 所有键值对必须全部命中,缺一不可。只要有一个节点没同时带 disktype=ssdenv=prod,这个 Deployment 的新 Pod 就不会被创建。

验证是否调度成功

部署后立刻检查:

  1. kubectl get pod -o wide —— 看 NODE 列是不是你预期的节点名
  2. kubectl describe pod <pod-name> | grep Node: —— 显示实际绑定节点
  3. kubectl get pod <pod-name> -o jsonpath='{.spec.nodeName}' —— 直接输出节点名

如果状态一直是 Pending,优先检查:节点是否存在、标签拼写是否一致(大小写敏感)、有没有漏掉某个必需标签。

它和 nodeName 的区别

nodeName 是硬指定某一台机器(如 spec.nodeName: node-01),跳过调度器,连资源是否够都不检查;而 nodeSelector 仍走调度流程,会做资源评估、污点容忍等判断,只是加了一道“标签准入”。所以日常固定调度推荐用 nodeSelector,除非你明确需要绕过所有策略。

热门栏目