×

节点选择器指定键值对的映射。规则是使用节点上的自定义标签和 Pod 中指定的选择器定义的。

为了使 Pod 能够在节点上运行,Pod 必须在节点上具有指示的键值对作为标签。

如果您在同一个 Pod 配置中使用节点亲和性和节点选择器,请参阅下面的重要注意事项。

使用节点选择器控制 Pod 部署位置

您可以对 Pod 使用节点选择器,对节点使用标签来控制 Pod 的调度位置。使用节点选择器,OpenShift Container Platform 会将 Pod 调度到包含匹配标签的节点上。

您可以将标签添加到节点、计算机器集或机器配置。将标签添加到计算机器集可确保如果节点或机器出现故障,新节点将具有该标签。如果节点或机器出现故障,添加到节点或机器配置的标签将不会持久存在。

要将节点选择器添加到现有 Pod,请将节点选择器添加到该 Pod 的控制对象,例如ReplicaSet对象、DaemonSet对象、StatefulSet对象、Deployment对象或DeploymentConfig对象。该控制对象下的任何现有 Pod 都将在具有匹配标签的节点上重新创建。如果您正在创建新的 Pod,可以直接将节点选择器添加到 Pod 规范中。如果 Pod 没有控制对象,则必须删除 Pod,编辑 Pod 规范,然后重新创建 Pod。

您不能直接将节点选择器添加到现有的已调度 Pod。

先决条件

要将节点选择器添加到现有 Pod,请确定该 Pod 的控制对象。例如,router-default-66d5cf9464-m2g75 Pod 由router-default-66d5cf9464副本集控制

$ oc describe pod router-default-66d5cf9464-7pwkc
示例输出
kind: Pod
apiVersion: v1
metadata:
# ...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...

Web 控制台在 Pod YAML 中的ownerReferences下列出控制对象

apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...
步骤
  1. 使用计算机器集或直接编辑节点来向节点添加标签

    • 使用MachineSet对象在创建节点时向计算机器集管理的节点添加标签

      1. 运行以下命令以向MachineSet对象添加标签

        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api

        例如

        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api

        或者,您可以应用以下 YAML 来向计算机器集添加标签

        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          name: xf2bd-infra-us-east-2a
          namespace: openshift-machine-api
        spec:
          template:
            spec:
              metadata:
                labels:
                  region: "east"
                  type: "user-node"
        # ...
      2. 使用oc edit命令验证标签是否已添加到MachineSet对象

        例如

        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api
        示例MachineSet对象
        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        
        # ...
        
        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...
    • 直接向节点添加标签

      1. 编辑节点的Node对象

        $ oc label nodes <name> <key>=<value>

        例如,要为节点添加标签

        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east

        或者,您可以应用以下 YAML 来向节点添加标签

        kind: Node
        apiVersion: v1
        metadata:
          name: hello-node-6fbccf8d9
          labels:
            type: "user-node"
            region: "east"
        # ...
      2. 验证标签是否已添加到节点

        $ oc get nodes -l type=user-node,region=east
        示例输出
        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.30.3
  2. 向 Pod 添加匹配的节点选择器

    • 要向现有和未来的 Pod 添加节点选择器,请向 Pod 的控制对象添加节点选择器

      带有标签的示例ReplicaSet对象
      kind: ReplicaSet
      apiVersion: apps/v1
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
      # ...
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node (1)
      # ...
      1 添加节点选择器。
    • 要向特定的新 Pod 添加节点选择器,请直接将选择器添加到Pod对象

      带有节点选择器的示例Pod对象
      apiVersion: v1
      kind: Pod
      metadata:
        name: hello-node-6fbccf8d9
      # ...
      spec:
        nodeSelector:
          region: east
          type: user-node
      # ...

      您不能直接将节点选择器添加到现有的已调度 Pod。