Container Service for Kubernetes では、ギャングスケジューリングとトポロジー対応の制約を組み合わせることで、条件を満たすトポロジードメインが見つかるまで複数のトポロジードメインにまたがって Pod の配置を再試行できます。また、きめ細かいアフィニティのために Pod を低遅延配置セットに固定することもできます。このトピックでは、トポロジー対応スケジューリングを実装する方法について説明します。
概要
機械学習やビッグデータの Job では、高い Pod 間帯域幅が求められます。デフォルトの Kubernetes スケジューラは Pod をクラスター全体に分散させるため、ネットワークホップとレイテンシーが増加します。ネイティブのアフィニティスケジューリング (NodeAffinity/PodAffinity) では、Pod を同一のゾーンまたはラックにコロケーションできますが、次の制限があります。
-
Pod はトポロジードメインをまたいで再試行できません。ネイティブのアフィニティスケジューリングでは、最初の Pod が配置されたドメインに Job 全体が固定されます。そのドメインに容量がない場合、別のドメインであればすべて収容できる可能性があっても、残りの Pod は Pending のままになります。
-
ノードのラベルはアベイラビリティーゾーンのレベルにしか存在しないため、Pod のアフィニティでは、よりきめ細かいトポロジードメインをターゲットにできません。
複数のトポロジードメインにまたがる再試行スケジューリング
Job にギャングスケジューリング識別子を追加して、同時のリソース割り当てと、複数のトポロジードメインにまたがるスケジューリングの再試行を有効にします。
-
Pod のラベルにギャングスケジューリング識別子を追加します (Work with gang scheduling)。
... labels: pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu # tf-smoke-gpu は PodGroup の名前です。任意の値を指定します。 pod-group.scheduling.sigs.k8s.io/min-available: "3" # この値は Job 内の Pod 数に設定できます。 ... -
Pod のアノテーションにトポロジー対応スケジューリング制約を追加します。
annotations: alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"kubernetes.io/hostname\"}],\"nodeSelectors\":[{\"matchLabels\":{\"test\":\"abc\"}}]}}alibabacloud.com/topology-aware-constraintの値は、有効な JSON 文字列である必要があります:{ "name": xxx, # 任意の名前。 "required": { "topologies": [ { "key": xxx # アフィニティのトポロジードメインを指定するキー。 } ], "nodeSelectors": [ { # この構造は、ネイティブの Kubernetes の nodeAffinity における labelSelector 形式に従います。 "matchLabels": {}, "matchExpressions": {} } ] } }この構成により、スケジューラは
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpuのラベルが付いたすべての Pod を、test=aラベルに一致するノードへ配置します。出力例:kubectl get pod -ojson | jq '.items[] | {"name":.metadata.name,"ann":.metadata.annotations["alibabacloud.com/topology-aware-constraint"], "node": spec.nodeName}' { "name": "nginx-deployment-basic-69f47fc6db-6****", "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}}", "node": "cn-shenzhen.10.0.2.4" } { "name":"nginx-deployment-basic-69f47fc6db-h****", "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}}", "node": "cn-shenzhen.10.0.2.4" }
低遅延配置セットへのスケジュール
一部の Job では、最適なパフォーマンスのために、きめ細かいトポロジードメイン内でのアフィニティが必要です。ECS の低遅延配置セットはノードの配置を制約します。詳細については、「配置セットをノードプールに関連付けるためのベストプラクティス」をご参照ください。
低遅延配置セットを使用してノードプールを作成する際は、他のプールと区別するためにカスタムノードラベルを追加してください。
前述の設定が完了したら、次のアノテーションとラベルを使用して、低遅延配置セット内に Job をスケジュールします。
-
Pod のラベルにギャングスケジューリング識別子を追加します (Work with gang scheduling)。
labels: pod-group.scheduling.sigs.k8s.io/name: xxx # xxx は PodGroup の名前です。任意の値を指定します。 pod-group.scheduling.sigs.k8s.io/min-available: "x" # この値は Job 内の Pod 数に設定できます。 -
Pod のアノテーションにトポロジー対応スケジューリング制約を追加します。
重要matchLabelsを低遅延配置セット用のカスタムノードラベルに置き換え、必要に応じてnameを変更してください。annotations: alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"alibabacloud.com/nodepool-id\"}],\"nodeSelectors\":[{\"matchLabels\":{\"np-type\":\"low-latency\"}}]}}