4.3. ノードのアフィニティールールを使用してノードへの Pod の配置を制御する
ノードアフィニティーを使用すると、ノードラベルに基づいて、Pod をスケジュールできるノードを制御できます。ノードアフィニティーを使用すると、アプリケーションが特定の機能や設定を備えたノード上で確実に実行されるようにすることができます。
OpenShift Dedicated では、ノードのアフィニティーとはスケジューラーが Pod を配置する場所を決定するために使用する一連のルールのことです。このルールは、ノードのカスタムラベルと Pod で指定されたラベルセレクターを使用して定義されます。
4.3.1. ノードのアフィニティーについて リンクのコピーリンクがクリップボードにコピーされました!
Pod を配置できるノードのグループを優先的に指定するには、Pod 仕様でノードアフィニティーを使用できます。たとえば、特定の CPU を搭載したノード、あるいは特定のアベイラビリティーゾーンでのみ Pod を実行するように設定できます。ノード自体は配置に対して制御を行いません。
ノードのアフィニティールールには、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 設定ファイルのサンプル
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: e2e-az-NorthSouth
operator: In
values:
- e2e-az-North
- e2e-az-South
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
ここでは、以下のようになります。
spec.affinity.nodeAffinity- ノードアフィニティーを設定するスタンザを指定します。
spec.affinity.nodeAffinity.requiredDuringScheduledIgnoredDuringExecution必須 ルールを指定します。
nodeSelectorTerms.matchExpressions の以下のパラメーターを設定してください。key- ルールを適用するために一致させる必要があるキー/値ペア (ラベル) のキーを指定します。
operator-
ノード上のラベルと、
Pod仕様のmatchExpressionパラメーター内の値のセットとの間の関係を指定します。この値は、In、NotIn、Exists、またはDoesNotExist、Lt、またはGtにすることができます。 values- ルールを適用するために一致させる必要があるキー/値ペア (ラベル) の値を指定します。
以下の例は、キーが e2e-az-EastWest で、その値が e2e-az-East または e2e-az-West のラベルが付いたノードに Pod を配置すること優先する preferred (優先) ルールが設定されたノード仕様です。
ノードのアフィニティーの preferred (優先) ルールが設定された Pod 設定ファイルのサンプル
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: e2e-az-EastWest
operator: In
values:
- e2e-az-East
- e2e-az-West
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
ここでは、以下のようになります。
spec.affinity.nodeAffinity- ノードアフィニティーを設定するスタンザを指定します。
spec.affinity.nodeAffinity.preferredDuringScheduledIgnoredDuringExecution優先 ルールを指定します。重みと以下の
preference.matchExpressionパラメーターを設定します。weight- preferred (優先) ルールの重みを指定します。最も高い重みを持つノードが優先されます。
key- ルールを適用するために一致させる必要があるキー/値ペア (ラベル) のキーを指定します。
operator-
ノード上のラベルと、
Pod仕様のmatchExpressionパラメーター内の値のセットとの間の関係を指定します。この値は、In、NotIn、Exists、またはDoesNotExist、Lt、またはGtにすることができます。ノードのアンチアフィニティー に関する明示的な概念はありませんが、NotInまたはDoesNotExist演算子を使用すると、動作が複製されます。 values- ルールを適用するために一致させる必要があるキー/値ペア (ラベル) の値を指定します。
同じ Pod 設定でノードのアフィニティーとノードのセレクターを使用している場合は、以下に注意してください。
-
nodeSelectorとnodeAffinityの両方を設定する場合、Pod が候補ノードでスケジュールされるにはどちらの条件も満たしている必要があります。 -
nodeAffinityタイプに関連付けられた複数のnodeSelectorTermsを指定する場合、nodeSelectorTermsのいずれかが満たされている場合に Pod をノードにスケジュールすることができます。 -
nodeSelectorTermsに関連付けられた複数のmatchExpressionsを指定する場合、すべてのmatchExpressionsが満たされている場合にのみ Pod をノードにスケジュールすることができます。