すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:トポロジー対応スケジューリングの実装

最終更新日:Oct 22, 2026

Container Service for Kubernetes では、ギャングスケジューリングとトポロジー対応の制約を組み合わせることで、条件を満たすトポロジードメインが見つかるまで複数のトポロジードメインにまたがって Pod の配置を再試行できます。また、きめ細かいアフィニティのために Pod を低遅延配置セットに固定することもできます。このトピックでは、トポロジー対応スケジューリングを実装する方法について説明します。

概要

機械学習やビッグデータの Job では、高い Pod 間帯域幅が求められます。デフォルトの Kubernetes スケジューラは Pod をクラスター全体に分散させるため、ネットワークホップとレイテンシーが増加します。ネイティブのアフィニティスケジューリング (NodeAffinity/PodAffinity) では、Pod を同一のゾーンまたはラックにコロケーションできますが、次の制限があります。

  • Pod はトポロジードメインをまたいで再試行できません。ネイティブのアフィニティスケジューリングでは、最初の Pod が配置されたドメインに Job 全体が固定されます。そのドメインに容量がない場合、別のドメインであればすべて収容できる可能性があっても、残りの Pod は Pending のままになります。

  • ノードのラベルはアベイラビリティーゾーンのレベルにしか存在しないため、Pod のアフィニティでは、よりきめ細かいトポロジードメインをターゲットにできません。

複数のトポロジードメインにまたがる再試行スケジューリング

Job にギャングスケジューリング識別子を追加して、同時のリソース割り当てと、複数のトポロジードメインにまたがるスケジューリングの再試行を有効にします。

  1. 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 数に設定できます。
    ...
  2. 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 をスケジュールします。

  1. 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 数に設定できます。
  2. Pod のアノテーションにトポロジー対応スケジューリング制約を追加します。

    重要

    matchLabels を低遅延配置セット用のカスタムノードラベルに置き換え、必要に応じて name を変更してください。

    annotations:
      alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"alibabacloud.com/nodepool-id\"}],\"nodeSelectors\":[{\"matchLabels\":{\"np-type\":\"low-latency\"}}]}}