3.9. Pod トポロジー分散制約を使用した Pod 配置の制御
Pod トポロジー分散制約を使用して、ノード、ゾーン、リージョンその他のユーザー定義のトポロジードメイン間で Pod の配置を制御できます。
3.9.1. Pod トポロジー分散制約について
Pod トポロジー分散制約 を使用することで、障害ドメイン全体にまたがる Pod の分散に対する詳細な制御を実現し、高可用性とより効率的なリソースの使用を実現できます。
OpenShift Container Platform 管理者はノードにラベルを付け、リージョン、ゾーン、ノード、他のユーザー定義ドメインなどのトポロジー情報を提供できます。これらのラベルをノードに設定した後に、ユーザーは Pod トポロジーの分散制約を定義し、これらのトポロジードメイン全体での Pod の配置を制御できます。
グループ化する Pod を指定し、それらの Pod が分散されるトポロジードメインと、許可できるスキューを指定します。制約により、分散される際に同じ namespace 内の Pod のみが一致し、グループ化されます。
3.9.2. Pod トポロジー分散制約の設定
以下の手順は、Pod トポロジー分散制約を、ゾーンに基づいて指定されたラベルに一致する Pod を分散するように設定する方法を示しています。
複数の Pod トポロジー分散制約を指定できますが、それらが互いに競合しないようにする必要があります。Pod を配置するには、すべての Pod トポロジー分散制約を満たしている必要があります。
前提条件
- クラスター管理者は、必要なラベルをノードに追加している。
手順
Pod
仕様を作成し、Pod トポロジーの分散制約を指定します。pod-spec.yaml
ファイルの例apiVersion: v1 kind: Pod metadata: name: my-pod labels: foo: bar spec: topologySpreadConstraints: - maxSkew: 1 1 topologyKey: topology.kubernetes.io/zone 2 whenUnsatisfiable: DoNotSchedule 3 labelSelector: 4 matchLabels: foo: bar 5 containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod
- 1
- 任意の 2 つのトポロジードメイン間の Pod 数の最大差。デフォルトは
1
で、0
の値を指定することはできません。 - 2
- ノードラベルのキー。このキーと同じ値を持つノードは同じトポロジーにあると見なされます。
- 3
- 分散制約を満たさない場合に Pod を処理する方法です。デフォルトは
DoNotSchedule
であり、これはスケジューラーに Pod をスケジュールしないように指示します。ScheduleAnyway
に設定して Pod を依然としてスケジュールできますが、スケジューラーはクラスターがさらに不均衡な状態になるのを防ぐためにスキューの適用を優先します。 - 4
- 制約を満たすために、分散される際に、このラベルセレクターに一致する Pod はグループとしてカウントされ、認識されます。ラベルセレクターを指定してください。指定しないと、Pod が一致しません。
- 5
- 今後適切にカウントされるようにするには、この
Pod
仕様がこのラベルセレクターに一致するようにラベルを設定していることも確認してください。
Pod を作成します。
$ oc create -f pod-spec.yaml
3.9.3. Pod トポロジー分散制約の例
以下の例は、Pod トポロジー設定分散制約の設定を示しています。
3.9.3.1. 単一 Pod トポロジー分散制約の例
このサンプル Pod
仕様は単一の Pod トポロジー分散制約を定義します。これは foo:bar
というラベルが付いた Pod で一致し、ゾーン間で分散され、スキューの 1
を指定し、これらの要件を満たさない場合に Pod をスケジュールしません。
kind: Pod apiVersion: v1 metadata: name: my-pod labels: foo: bar spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: foo: bar containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod
3.9.3.2. 複数の Pod トポロジー分散制約の例
このサンプル Pod
仕様は 2 つの Pod トポロジー分散制約を定義します。どちらの場合も foo:bar
というラベルが付けられた Pod で一致し、スキューの 1
を指定し、これらの要件を満たしていない Pod をスケジュールしません。
最初の制約は、ユーザー定義ラベルの node
に基づいて Pod を分散し、2 つ目の制約はユーザー定義ラベルの rack
に基づいて Pod を分散します。Pod がスケジュールされるには、両方の制約を満たす必要があります。
kind: Pod apiVersion: v1 metadata: name: my-pod-2 labels: foo: bar spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: node whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: foo: bar - maxSkew: 1 topologyKey: rack whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: foo: bar containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod