4.2. アフィニティールールと非アフィニティールールの使用による他の Pod との相対での Pod の配置
アフィニティーとは、スケジュールするノードを制御する Pod の特性です。非アフィニティーとは、Pod がスケジュールされることを拒否する Pod の特性です。
Red Hat OpenShift Service on AWS では、Pod のアフィニティー と Pod の非アフィニティー によって、他の Pod のキー/値ラベルに基づいて、Pod のスケジュールに適したノードを制限できます。
4.2.1. Pod のアフィニティーについて リンクのコピーリンクがクリップボードにコピーされました!
Pod のアフィニティー と Pod のアンチアフィニティー によって、他の Pod のキー/値ラベルに基づいて、Pod をスケジュールすることに適したノードを制限することができます。
- Pod のアフィニティーはスケジューラーに対し、新規 Pod のラベルセレクターが現在の Pod のラベルに一致する場合に他の Pod と同じノードで新規 Pod を見つけるように指示します。
- Pod のアンチアフィニティーにより、新しい Pod のラベルセレクターが現在の Pod のラベルと一致する場合、スケジューラーが同じラベルを持つ Pod と同じノード上に新しい Pod を配置するのを防ぐことができます。
たとえば、アフィニティールールを使用することで、サービス内で、または他のサービスの Pod との関連で Pod を分散したり、パックしたりすることができます。アンチアフィニティールールを使用すると、特定のサービスの Pod が、そのサービスの Pod のパフォーマンスに干渉することが判明している別のサービスの Pod と同じノードにスケジュールされるのを防止できます。または、関連する障害を減らすために複数のノード、アベイラビリティーゾーン、またはアベイラビリティーセットの間でサービスの Pod を分散することもできます。
ラベルセレクターは、複数の Pod デプロイメントを持つ Pod に一致する可能性があります。アンチアフィニティールールを設定して Pod が一致しないようにする場合は、一意のラベル組み合わせを使用します。
Pod のアフィニティーには、required (必須) および preferred (優先) の 2 つのタイプがあります。
Pod をノードにスケジュールする前に、required (必須) ルールを 満たしている必要があります。preferred (優先) ルールは、ルールを満たす場合に、スケジューラーはルールの実施を試行しますが、その実施が必ずしも保証される訳ではありません。
Pod の優先順位およびプリエンプションの設定により、スケジューラーはアフィニティーの要件に違反しなければ Pod の適切なノードを見つけられない可能性があります。その場合、Pod はスケジュールされない可能性があります。
この状態を防ぐには、優先順位が等しい Pod との Pod のアフィニティーの設定を慎重に行ってください。
Pod のアフィニティー/アンチアフィニティーは Pod 仕様ファイルで設定します。required (必須) ルール、preferred (優先) ルールのいずれか、その両方を指定することができます。両方を指定する場合、ノードは最初に required (必須) ルールを満たす必要があり、その後に preferred (優先) ルールを満たそうとします。
以下の例は、Pod のアフィニティーおよびアンチアフィニティーに設定される Pod 仕様を示しています。
この例では、Pod のアフィニティールールは、ノードにキー security と値 S1 を持つラベルの付いた 1 つ以上の Pod がすでに実行されている場合にのみ Pod をノードにスケジュールできることを示しています。Pod のアンチアフィニティールールは、ノードがキー security と値 S2 を持つラベルが付いた Pod がすでに実行されている場合は Pod をノードにスケジュールしないように設定することを示しています。
Pod のアフィニティーが設定された Pod 設定ファイルのサンプル
Pod のアンチアフィニティーが設定された Pod 設定ファイルのサンプル
ノードのラベルに、Pod のノードのアフィニティールールを満たさなくなるような結果になる変更がランタイム時に生じる場合も、Pod はノードで引き続き実行されます。
4.2.2. Pod アフィニティールールの設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順は、ラベルの付いた Pod と Pod のスケジュールを可能にするアフィニティーを使用する Pod を作成する 2 つの Pod の単純な設定を示しています。
アフィニティーをスケジュールされた Pod に直接追加することはできません。
手順
Pod 仕様の特定のラベルの付いた Pod を作成します。
以下の内容を含む YAML ファイルを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod を作成します。
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
他の Pod の作成時に、以下のパラメーターを設定してアフィニティーを追加します。
以下の内容を含む YAML ファイルを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Pod のアフィニティーを追加します。
- 2
requiredDuringSchedulingIgnoredDuringExecutionパラメーターまたはpreferredDuringSchedulingIgnoredDuringExecutionパラメーターを設定します。- 3
- 満たす必要のある
keyおよびvaluesを指定します。新規 Pod を他の Pod と共にスケジュールする必要がある場合、最初の Pod のラベルと同じkeyおよびvaluesパラメーターを使用します。 - 4
operatorを指定します。演算子はIn、NotIn、Exists、またはDoesNotExistにすることができます。たとえば、演算子Inを使用してラベルをノードで必要になるようにします。- 5
topologyKeyを指定します。これは、システムがトポロジードメインを表すために使用する事前にデータが設定された Kubernetes ラベル です。
Pod を作成します。
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.3. Pod アンチアフィニティールールの設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順は、ラベルの付いた Pod と Pod のスケジュールの禁止を試行するアンチアフィニティーの preferred (優先) ルールを使用する Pod を作成する 2 つの Pod の単純な設定を示しています。
アフィニティーをスケジュールされた Pod に直接追加することはできません。
手順
Pod 仕様の特定のラベルの付いた Pod を作成します。
以下の内容を含む YAML ファイルを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod を作成します。
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
他の Pod の作成時に、以下のパラメーターを設定します。
以下の内容を含む YAML ファイルを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Pod のアンチアフィニティーを追加します。
- 2
requiredDuringSchedulingIgnoredDuringExecutionパラメーターまたはpreferredDuringSchedulingIgnoredDuringExecutionパラメーターを設定します。- 3
- preferred (優先) ルールの場合、ノードの重みを 1 - 100 で指定します。最も高い重みを持つノードが優先されます。
- 4
- 満たす必要のある
keyおよびvaluesを指定します。新規 Pod を他の Pod と共にスケジュールされないようにする必要がある場合、最初の Pod のラベルと同じkeyおよびvaluesパラメーターを使用します。 - 5
operatorを指定します。演算子はIn、NotIn、Exists、またはDoesNotExistにすることができます。たとえば、演算子Inを使用してラベルをノードで必要になるようにします。- 6
topologyKeyを指定します。これは、システムがトポロジードメインを表すために使用する事前にデータが設定された Kubernetes ラベル です。
Pod を作成します。
oc create -f <pod-spec>.yaml
$ oc create -f <pod-spec>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2.4. Pod のアフィニティールールとアンチアフィニティールールの例 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、Pod のアフィニティーおよびアンチアフィニティーを示しています。
4.2.4.1. Pod のアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、一致するラベルとラベルセレクターを持つ Pod に関する Pod のアフィニティーを示しています。
Pod team4 にはラベル
team:4が付けられています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod team4a には、
podAffinityの下にラベルセレクターteam:4が付けられています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - team4a Pod は team4 Pod と同じノードにスケジュールされます。
4.2.4.2. Pod のアンチアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、一致するラベルとラベルセレクターを持つ Pod に関する Pod のアンチアフィニティーを示しています。
Pod pod-s1 にはラベル
security:s1が付けられています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod pod-s2 には、
podAntiAffinityの下にラベルセレクターsecurity:s1が付けられています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Pod pod-s2 は
pod-s1と同じノードにスケジュールできません。
4.2.4.3. 一致するラベルのない Pod のアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、一致するラベルとラベルセレクターのない Pod に関する Pod のアフィニティーを示しています。
Pod pod-s1 にはラベル
security:s1が付けられています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod pod-s2 にはラベルセレクター
security:s2があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod pod-s2 は、
security:s2ラベルの付いた Pod を持つノードがない場合はスケジュールされません。そのラベルの付いた他の Pod がない場合、新規 Pod は保留状態のままになります。出力例
NAME READY STATUS RESTARTS AGE IP NODE pod-s2 0/1 Pending 0 32s <none>
NAME READY STATUS RESTARTS AGE IP NODE pod-s2 0/1 Pending 0 32s <none>Copy to Clipboard Copied! Toggle word wrap Toggle overflow