跳转至

node 节点选择器

Note

  • 我们在创建 pod 资源的时候,pod 会根据 schduler 进行调度,那么默认会调度到随机的一个工作节点,如果我们想要 pod 调度到指定节点或者调度到一些具有相同特点的 node 节点,怎么办呢?

  • 可以使用 pod 中的 nodeName 或者 nodeSelector 字段指定要调度到的 node 节点

给节点添加标签

  1. 列出你的集群中的节点, 包括这些节点上的标签:

    kubectl get nodes --show-labels

  2. 从你的节点中选择一个,为它添加标签:

    kubectl label nodes <your-node-name> disktype=ssd

    注意

    '<your-node-name>' 是你选择的节点的名称。

  3. 验证你选择的节点确实带有 disktype=ssd 标签:

    kubectl get nodes --show-labels | grep disktype=ssd

    image-20240110182508041

    注意

    在前面的输出中,你可以看到 linuxnbg-1 节点有 disktype=ssd 标签。

创建一个将被调度到你选择的节点的 nodeSelector

此 Pod 配置文件描述了一个拥有节点选择器 disktype: ssd 的 Pod。这表明该 Pod 将被调度到有 disktype=ssd 标签的节点。

nodeSelector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd
  1. 使用该配置文件创建一个 Pod,该 Pod 将被调度到你选择的节点上:

    kubectl apply -f nodeSelector.yaml

  2. 验证 Pod 确实运行在你选择的节点上:

    kubectl get pod nginx --output=wide

    image-20240110185357725

创建一个会被调度到特定节点上的 nodeName

  • 可以通过设置 nodeName 将某个 Pod 调度到特定的节点。

  • nodeName 是比亲和性或者 nodeSelector 更为直接的形式。nodeName 是 Pod 规约中的一个字段。如果 nodeName 字段不为空,调度器会忽略该 Pod, 而指定节点上的 kubelet 会尝试将 Pod 放到该节点上。 使用 nodeName 规则的优先级会高于使用 nodeSelector 或亲和性与非亲和性的规则。

nodeName.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  nodeName: linuxnbg-1 # 调度 Pod 到特定的节点
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  1. 使用此配置文件来创建一个 Pod,该 Pod 将只能被调度到定义的 linuxnbg-1 节点

    kubectl apply -f nodeName.yaml

  2. 验证 Pod 确实运行在你选择的节点上:

    kubectl get pod nginx --output=wide

    image-20240110190714997