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.2'
        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 に追加するには、ノードセレクターを 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: {}
      policy:
    spec:
      defaultNodeSelector: type=user-node,region=east 1
    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. プロジェクトスコープのノードセレクターの作成

namespace で作成されたすべての Pod をラベルが付けられたノードに制限するために、プロジェクトのノードセレクターをノード上のラベルと共に使用できます。

プロジェクトノードセレクターを使用する場合、namespace で 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. namespace を作成するか、またはプロジェクトに関連付けられた既存の namespace を編集し、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 を namespace に作成する際に、OpenShift Container Platform は適切な <key>:<value> を追加し、Pod をラベルが付けられたノードでスケジュールします。

例:

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