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
手順
必要なラベルをノードに追加します。
$ 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 ....
または、ラベルを 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 ....
必要なノードセレクターを 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 設定でノードセレクターとノードのアフィニティーを使用している場合は、以下に注意してください。
-
nodeSelector
とnodeAffinity
の両方を設定する場合、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 を作成しているプロジェクトにプロジェクトノードセレクターがある場合、そのセレクターはクラスターノードセレクターよりも優先されます。
手順
デフォルトのクラスターノードセレクターを追加するには、以下を実行します。
スケジューラー 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 の再起動まで有効になりません。ノードまたは 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
クラスタースコープのデフォルトノードセレクターがない場合、プロジェクトノードセレクターが優先されます。
手順
デフォルトのプロジェクトノードセレクターを追加するには、以下を実行します。
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` を追加します。
ノードまたは 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