4.3. ノードのアフィニティールールを使用してノードへの Pod の配置を制御する
アフィニティーとは、スケジュールするノードを制御する Pod の特性です。
Red Hat OpenShift Service on AWS クラシックアーキテクチャーでは、ノードのアフィニティーとはスケジューラーが Pod を配置する場所を決定するために使用する一連のルールのことです。このルールは、ノードのカスタムラベルと Pod で指定されたラベルセレクターを使用して定義されます。
4.3.1. ノードのアフィニティーについて リンクのコピーリンクがクリップボードにコピーされました!
ノードのアフィニティーにより、Pod がその配置に使用できるノードのグループに対してアフィニティーを指定できます。ノード自体は配置に対して制御を行いません。
たとえば、Pod を特定の CPU を搭載したノードまたは特定のアベイラビリティーゾーンにあるノードでのみ実行されるよう設定することができます。
ノードのアフィニティールールには、required (必須) および preferred (優先) の 2 つのタイプがあります。
Pod をノードにスケジュールする前に、required (必須) ルールを 満たしている必要があります。preferred (優先) ルールは、ルールを満たす場合に、スケジューラーはルールの実施を試行しますが、その実施が必ずしも保証される訳ではありません。
ランタイム時にノードのラベルに変更が生じ、その変更により Pod でのノードのアフィニティールールを満たさなくなる状態が生じるでも、Pod はノードで引き続き実行されます。
ノードのアフィニティーは Pod
仕様ファイルで設定します。required (必須) ルール、preferred (優先) ルールのいずれか、その両方を指定することができます。両方を指定する場合、ノードは最初に required (必須) ルールを満たす必要があり、その後に preferred (優先) ルールを満たそうとします。
以下の例は、Pod をキーが e2e-az-NorthSouth
で、その値が e2e-az-North
または e2e-az-South
のいずれかであるラベルの付いたノードに Pod を配置することを求めるルールが設定された Pod
仕様です。
ノードのアフィニティーの required (必須) ルールが設定された Pod 設定ファイルのサンプル
以下の例は、キーが e2e-az-EastWest
で、その値が e2e-az-East
または e2e-az-West
のラベルが付いたノードに Pod を配置すること優先する preferred (優先) ルールが設定されたノード仕様です。
ノードのアフィニティーの preferred (優先) ルールが設定された Pod 設定ファイルのサンプル
ノードのアンチアフィニティー に関する明示的な概念はありませんが、NotIn
または DoesNotExist
演算子を使用すると、動作が複製されます。
同じ Pod 設定でノードのアフィニティーとノードのセレクターを使用している場合は、以下に注意してください。
-
nodeSelector
とnodeAffinity
の両方を設定する場合、Pod が候補ノードでスケジュールされるにはどちらの条件も満たしている必要があります。 -
nodeAffinity
タイプに関連付けられた複数のnodeSelectorTerms
を指定する場合、nodeSelectorTerms
のいずれかが満たされている場合に Pod をノードにスケジュールすることができます。 -
nodeSelectorTerms
に関連付けられた複数のmatchExpressions
を指定する場合、すべてのmatchExpressions
が満たされている場合にのみ Pod をノードにスケジュールすることができます。
4.3.2. ノードアフィニティーの required (必須) ルールの設定 リンクのコピーリンクがクリップボードにコピーされました!
Pod をノードにスケジュールする前に、required (必須) ルールを 満たしている必要があります。
手順
以下の手順は、ノードとスケジューラーがノードに配置する必要のある Pod を作成する単純な設定を示しています。
Pod 仕様の特定のラベルの付いた Pod を作成します。
以下の内容を含む YAML ファイルを作成します。
注記アフィニティーをスケジュールされた Pod に直接追加することはできません。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod を作成します。
oc create -f <file-name>.yaml
$ oc create -f <file-name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3.3. ノードアフィニティーの preferred (優先) ルールの設定 リンクのコピーリンクがクリップボードにコピーされました!
preferred (優先) ルールは、ルールを満たす場合に、スケジューラーはルールの実施を試行しますが、その実施が必ずしも保証される訳ではありません。
手順
以下の手順は、ノードとスケジューラーがノードに配置しようとする Pod を作成する単純な設定を示しています。
特定のラベルの付いた Pod を作成します。
以下の内容を含む YAML ファイルを作成します。
注記アフィニティーをスケジュールされた Pod に直接追加することはできません。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Pod のアフィニティーを追加します。
- 2
preferredDuringSchedulingIgnoredDuringExecution
パラメーターを設定します。- 3
- ノードの重みを数字の 1-100 で指定します。最も高い重みを持つノードが優先されます。
- 4
- 満たす必要のある
key
およびvalues
を指定します。新規 Pod を編集したノードにスケジュールする必要がある場合、ノードのラベルと同じkey
およびvalues
パラメーターを使用します。 - 5
operator
を指定します。演算子はIn
、NotIn
、Exists
、またはDoesNotExist
にすることができます。たとえば、演算子In
を使用してラベルをノードで必要になるようにします。
Pod を作成します。
oc create -f <file-name>.yaml
$ oc create -f <file-name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3.4. ノードのアフィニティールールの例 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、ノードのアフィニティーを示しています。
4.3.4.1. 一致するラベルを持つノードのアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、一致するラベルを持つノードと Pod のノードのアフィニティーを示しています。
Node1 ノードにはラベル
zone:us
があります。oc label node node1 zone=us
$ oc label node node1 zone=us
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ヒントあるいは、以下の YAML を適用してラベルを追加できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow pod-s1 pod にはノードアフィニティーの required (必須) ルールの下に
zone
とus
のキー/値のペアがあります。cat pod-s1.yaml
$ cat pod-s1.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow pod-s1 pod は Node1 でスケジュールできます。
oc get pod -o wide
$ oc get pod -o wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE IP NODE pod-s1 1/1 Running 0 4m IP1 node1
NAME READY STATUS RESTARTS AGE IP NODE pod-s1 1/1 Running 0 4m IP1 node1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3.4.2. 一致するラベルのないノードのアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、一致するラベルを持たないノードと Pod のノードのアフィニティーを示しています。
Node1 ノードにはラベル
zone:emea
があります。oc label node node1 zone=emea
$ oc label node node1 zone=emea
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ヒントあるいは、以下の YAML を適用してラベルを追加できます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow pod-s1 pod にはノードアフィニティーの required (必須) ルールの下に
zone
とus
のキー/値のペアがあります。cat pod-s1.yaml
$ cat pod-s1.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow pod-s1 pod は Node1 でスケジュールすることができません。
oc describe pod pod-s1
$ oc describe pod pod-s1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow