2.7. 使用节点选择器将 pod 放置到特定节点

节点选择器指定一个键值对映射。使用节点中的自定义标签和 pod 中指定的选择器来定义规则。您可以使用节点选择器将特定的 pod 放置到特定的节点上,或将一个项目中的所有 pod 放置到特定的节点上,或者创建一个默认节点选择器,来调度没有定义节点选择器或项目选择器的 pod。

若要使 pod 有资格在某一节点上运行,pod 必须具有指定为该节点上标签的键值对。

如果您在同一 pod 配置中同时使用节点关联性和节点选择器,请查看下方的重要注意事项。

2.7.1. 使用节点选择器控制 pod 放置

您可以使用 pod 上的节点选择器标签来控制 pod 的调度位置。

使用节点选择器时,OpenShift Container Platform 会将 pod 调度到包含匹配标签的节点。

您可以向节点或 MachineConfig 添加标签,但标签不会在节点或机器停机后保留。将标签添加到 MachineSet 可确保新的节点或机器具有该标签。

要向现有的 pod 添加节点选择器,请将节点选择器添加到该节点的控制对象,如 ReplicaSet、Daemonset 或 StatefulSet。任何属于该控制对象的现有 pod 都会在具有匹配标签的节点上重新创建。如果要创建新 pod,可以将节点选择器直接添加到 pod 规格中。

注意

您不能将节点选择器添加到现有的已调度 pod 中。

先决条件

如果要向现有 pod 添加节点选择器,请确定该 pod 的控制对象。例如,router-default-66d5cf9464-m2g75 pod 由 router-default-66d5cf9464 ReplicaSet 控制:

$ oc describe pod router-default-66d5cf9464-7pwkc

Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress

....

Controlled By:      ReplicaSet/router-default-66d5cf9464

Web 控制台在 pod YAML 的 ownerReferences 下列出控制对象:

  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true

流程

  1. 向节点添加所需的标签:

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

    例如,若要为以下节点添加标签:

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

    该标签应用到这个节点:

    kind: Node
    apiVersion: v1
    metadata:
      name: ip-10-0-131-14.ec2.internal
      selfLink: /api/v1/nodes/ip-10-0-131-14.ec2.internal
      uid: 7bc2580a-8b8e-11e9-8e01-021ab4174c74
      resourceVersion: '478704'
      creationTimestamp: '2019-06-10T14:46:08Z'
      labels:
        beta.kubernetes.io/os: linux
        failure-domain.beta.kubernetes.io/zone: us-east-1a
        node.openshift.io/os_version: '4.3'
        node-role.kubernetes.io/worker: ''
        failure-domain.beta.kubernetes.io/region: us-east-1
        node.openshift.io/os_id: rhcos
        beta.kubernetes.io/instance-type: m4.large
        kubernetes.io/hostname: ip-10-0-131-14
        region: east 1
        beta.kubernetes.io/arch: amd64
        type: user-node 2
    ....
    1 2
    指定您要添加到节点的标签。

    另外,也可以将标签添加到 MachineSet:

    $ oc edit MachineSet abc612-msrtw-worker-us-east-1c
    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    
    ....
    
    spec:
      replicas: 2
      selector:
        matchLabels:
          machine.openshift.io/cluster-api-cluster: ci-ln-89dz2y2-d5d6b-4995x
          machine.openshift.io/cluster-api-machine-role: worker
          machine.openshift.io/cluster-api-machine-type: worker
          machine.openshift.io/cluster-api-machineset: ci-ln-89dz2y2-d5d6b-4995x-worker-us-east-1a
      template:
        metadata:
          creationTimestamp: null
          labels:
            machine.openshift.io/cluster-api-cluster: ci-ln-89dz2y2-d5d6b-4995x
            machine.openshift.io/cluster-api-machine-role: worker
            machine.openshift.io/cluster-api-machine-type: worker
            machine.openshift.io/cluster-api-machineset: ci-ln-89dz2y2-d5d6b-4995x-worker-us-east-1a
        spec:
          metadata:
            creationTimestamp: null
            labels:
              region: east 1
              type: user-node 2
    ....
    1 2
    指定您要添加到节点的标签。
  2. 将所需节点选择器添加到 pod:

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

      例如:

      kind: ReplicaSet
      
      ....
      
      spec:
      
      ....
      
        template:
          metadata:
            creationTimestamp: null
            labels:
              ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
              pod-template-hash: 66d5cf9464
          spec:
            nodeSelector:
              beta.kubernetes.io/os: linux
              node-role.kubernetes.io/worker: ''
              type: user-node 1
      1
      添加所需的节点选择器。
    • 对于新 pod,您可以直接将选择器添加到 pod 规格中:

      apiVersion: v1
      kind: Pod
      
      ...
      
      spec:
        nodeSelector:
          <key>: <value>
      
      ...

      例如:

      apiVersion: v1
      kind: Pod
      
      ....
      
      spec:
        nodeSelector:
          region: east
          type: user-node
注意

如果您在同一 pod 配置中同时使用节点选择器和节点关联性,请注意:

  • 如果同时配置了 nodeSelectornodeAffinity,则必须满足这两个条件时 pod 才能调度到候选节点。
  • 如果您指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,那么其中一个 nodeSelectorTerms 满足时 pod 就能调度到节点上。
  • 如果您指定了多个与 nodeSelectorTerms 关联的 matchExpressions,那么只有所有 matchExpressions 都满足时 pod 才能调度到节点上。

2.7.2. 创建默认的集群范围节点选择器

您可以组合使用 pod 上的默认节点选择器和节点上的标签,将一个集群中创建的所有 pod 限制到特定的节点。

使用集群节点选择器时,如果您在集群中创建 pod,OpenShift Container Platform 会添加适当的 <key>:<value> 并将该 pod 调度到具有匹配标签的节点。

注意

您可以为 pod 添加额外的 <key>:<value> 对。但是,您无法为默认的 <key> 添加不同的 <value>

例如,如果集群节点选择器是 region: east,则以下 pod 规格会添加一个新的对,而且是允许的:

spec:
  nodeSelector:
    region: east
    type: user-node

以下 pod 规格将不同的值用于 region,而这是不允许的:

spec:
  nodeSelector:
    region: west

如果您在其中创建 pod 的项目有项目节点选择器,则该选择器的优先级要高于集群节点选择器。

流程

添加默认集群节点选择器:

  1. 编辑调度程序 Operator 自定义资源以添加集群节点选择器:

    $ oc edit scheduler cluster
    apiVersion: config.openshift.io/v1
    kind: Scheduler
    metadata:
      name: cluster
    ...
    
    spec:
      defaultNodeSelector: type=user-node,region=east 1
      mastersSchedulable: false
      policy:
        name: ""
    1
    使用适当的 <key>:<value> 对添加节点选择器。

    完成此更改后,请等待重新部署 openshift-kube-apiserver 项目中的 pod。这可能需要几分钟。只有 pod 重新部署后,默认集群节点选择器才会生效。

  2. 编辑节点或 MachineSet 来添加标签:

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

    例如,若要为以下节点添加标签:

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

    标记 MachineSet:

    $ oc label MachineSet abc612-msrtw-worker-us-east-1c type=user-node region=east

当您创建 pod 时,OpenShift Container Platform 会添加适当的 <key>:<value> 并将该 pod 调度到标记的节点。

例如:

spec:
  nodeSelector:
    region: east
    type: user-node

2.7.3. 创建项目范围节点选择器

您可以组合使用项目上的节点选择器和节点上的标签,将一个命名空间中创建的所有 pod 限制到标记的节点。

使用项目节点选择器时,如果您在命名空间中创建 pod,OpenShift Container Platform 会添加适当的 <key>:<value> 并将该 pod 调度到具有匹配标签的节点。

您可以向节点或 MachineConfig 添加标签,但标签不会在节点或机器停机后保留。将标签添加到 MachineSet 可确保新的节点或机器具有该标签。

注意

您可以为 pod 添加额外的 <key>:<value> 对。但是,您无法为默认的 <key> 添加不同的 <value>

例如,如果项目节点选择器是 region: east,则以下 pod 规格会添加一个新的对,而且是允许的:

spec:
  nodeSelector:
    region: east
    type: user-node

以下 pod 规格将不同的值用于 region,而这是不允许的:

spec:
  nodeSelector:
    region: west

如果存在集群范围默认节点选择器,则以项目节点选择器为准。

流程

添加默认项目节点选择器:

  1. 创建一个命名空间或编辑与项目关联的现有命名空间,以添加 openshift.io/node-selector 参数:

    $ oc edit namespace <name>
    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        openshift.io/node-selector: "type=user-node,region=east" 1
        openshift.io/sa.scc.mcs: s0:c17,c14
        openshift.io/sa.scc.supplemental-groups: 1000300000/10000
        openshift.io/sa.scc.uid-range: 1000300000/10000
      creationTimestamp: 2019-06-10T14:39:45Z
      labels:
        openshift.io/run-level: "0"
      name: demo
      resourceVersion: "401885"
      selfLink: /api/v1/namespaces/openshift-kube-apiserver
      uid: 96ecc54b-8b8d-11e9-9f54-0a9ae641edd0
    spec:
      finalizers:
      - kubernetes
    status:
      phase: Active
    1
    使用适当的 <key>:<value> 对添加openshift.io/node-selector`。
  2. 编辑节点或 MachineSet 来添加标签:

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

    例如,若要为以下节点添加标签:

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

    标记 MachineSet:

    $ oc label MachineSet abc612-msrtw-worker-us-east-1c type=user-node region=east

当您在命名空间中创建 pod 时,OpenShift Container Platform 会添加适当的 <key>:<value> 并将该 pod 调度到标记的节点。

例如:

spec:
  nodeSelector:
    region: east
    type: user-node

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。