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

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

最終更新日:Dec 13, 2024

Container Service for Kubernetes (ACK) を使用すると、ギャングスケジューリングとトポロジ認識スケジューリングを使用して、ジョブによって作成されたすべてのポッドの要件を満たすトポロジドメインが見つかるまで、スケジューラがトポロジドメインのリストをループできるようになります。 さらに、Container Service for KubernetesのノードプールをElastic Compute Service (ECS) デプロイメントセットに関連付けて、トポロジドメインなどの低次元でアフィニティスケジューリングを実行できます。 ポッド間のネットワーク遅延を減らすために、同じデプロイメントセット内のECSインスタンスにポッドをスケジュールできます。 このトピックでは、トポロジ対応のスケジューリングを設定する方法について説明します。

Introduction to topology-aware scheduling

機械学習またはビッグデータ分析ジョブによって作成されたポッドは、通常、頻繁に通信する必要があります。 デフォルトでは、KubernetesスケジューラはACKクラスター内のノード間でポッドを均等に分散します。 その結果、ポッドは高い待ち時間で通信することができ、ジョブを完了するのに必要な時間量が増加する。

前のジョブの効率を向上させるために、同じゾーンまたは同じラックにポッドを配置できます。 これにより、ポッド間のホップ数を減らすことができるため、ポッドはより低いレイテンシで通信できます。 Kubernetesでは、ノードアフィニティとポッドアフィニティに基づいてポッドをスケジュールできます。 ただし、Kubernetesのノードアフィニティとポッドアフィニティには、次の欠点があります。

  • ポッドスケジューリング中にすべてのトポロジドメインをループするようにスケジューラを設定することはできません。 Kubernetesアフィニティスケジューリングでは、ジョブは、ジョブの最初のポッドがスケジュールされるノードにポッドをスケジュールします。 ノードが他のポッドの要件を満たすことができない場合、一部のポッドは保留になる可能性があります。 ジョブは、別のトポロジドメインがポッドの要件を満たしていても、ポッドのゾーンを変更することはできません。

  • これは、ノードにはゾーン固有のラベルしかないためです。 すべてのポッドは、アフィニティスケジューリングによって同じゾーンにスケジュールされます。 スケジューラは、トポロジドメインなどの低次元のポッドをスケジュールできません。

ACKでは、ギャングスケジューリングとトポロジスケジューリングを使用して、ジョブによって作成されたすべてのポッドの要件を満たすトポロジドメインが見つかるまで、スケジューラがトポロジドメインのリストをループできるようにします。 さらに、ACKのノードプールをECSデプロイメントセットに関連付けて、トポロジドメインなどの低次元でアフィニティスケジューリングを実行できます。 ポッド間のネットワーク遅延を減らすために、同じデプロイメントセット内のECSインスタンスにポッドをスケジュールできます。

ポッドスケジューリング中にトポロジドメインをループする

kube-schedulerという名前のACKスケジューラは、ジョブによって作成されたすべてのポッドのリソース要求が同時に実行されるように、ジョブにギャングスケジューリングラベルを追加し、スケジューリング結果を保存します。 これにより、kube-schedulerは、ポッドスケジューリング中に複数のトポロジドメインをループできます。 この機能を使用するには、ポッドに次のラベルを追加する必要があります。

  1. 次のギャングスケジューリングラベルをポッドに追加します。 ギャングスケジューリングの詳細については、「ギャングスケジューリングの操作」をご参照ください。

    labels:
      pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu # Specify the name of the PodGroup, such as tf-smoke-gpu. 
      pod-group.scheduling.sigs.k8s.io/min-available: "3" # Set the value to the number of pods created by the job.

  2. ラベルセクションのポッドに、次のトポロジ対応のスケジューリング制約を追加します。

    annotations:
      alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"kubernetes.io/hostname\"}],\"nodeSelectors\":[{\"matchLabels\":{\"test\":\"abc\"}}]}}

    alibabacloud.com/topology-aware-constraintの値は有効なJSON文字列である必要があります。 そうでない場合、トポロジ認識スケジューリング制約は解析できません。 JSON文字列は次の形式である必要があります。

    {
      "name": xxx # Specify a name. 
      "required": {
        "topologies": [
          {
            "key": xxx # The key of the topology domain for affinity scheduling. 
          }
        ],
        "nodeSelectors": [
          {
            # You can refer to the format of the LabelSelector in Kubernetes node affinity. 
            "matchLabels": {},
            "matchExpressions": {} 
          }
        ]
      }
    }

    設定が完了すると、スケジューラは、test=abcラベルを持つノードの中から、pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpuラベルを持つすべてのポッドのリソース要求を満たすノードを検索します。 次の出力は、スケジューリング結果を示します。

    > capacity k get po -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"
    }
    {
    	"name":"nginx-deployment-basic-69f47fc6db-j****"
        "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} "
        "node": "cn-shenzhen.10.0.2.4"
    }
    {
    	"name":"nainx-deployment-basic-69f47fc6db-I****"
        "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} "
        "node": "cn-shenzhen.10.0.2.4"
    }
    {
    	"name" :"nainx-deplovment-basic-69f47fc6db-x****"
        "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} "
        "node": "cn-shenzhen.10.0.2.4"
    }

同じデプロイメントセットにポッドをスケジュールして、ネットワークの待ち時間を減らす

すべてのポッドを同じゾーンにスケジューリングすると、シナリオによってはビジネス要件を満たさない場合があります。 トポロジドメインなどの低次元でアフィニティスケジューリングを実行する必要がある場合があります。 ECSでは、デプロイメントセットを作成して、デプロイメントセット内のECSインスタンス間のネットワーク遅延を減らすことができます。 ACKでデプロイメントセットを使用する方法の詳細については、「デプロイメントセットをノードプールに関連付けるためのベストプラクティス」をご参照ください。

次の図に示すように、デプロイメントセットに関連付けられているノードプールを作成する場合は、カスタムノードラベルを追加して、ノードプールを他のノードプールと区別する必要があります。

image.png

設定が完了したら、次の注釈とラベルを追加して、配置セットにジョブをスケジュールします。

  1. 次のギャングスケジューリングラベルをポッドに追加します。 ギャングスケジューリングの詳細については、「ギャングスケジューリングの操作」をご参照ください。

    labels:
      pod-group.scheduling.sigs.k8s.io/name: xxx # Specify the name of the PodGroup. 
      pod-group.scheduling.sigs.k8s.io/min-available: "x" # Set the value to the number of pods created by the job.

  2. ラベルセクションのポッドに、次のトポロジ対応のスケジューリング制約を追加します。

    重要

    この例では、matchLabelsをデプロイメントセットに関連付けられているノードプールのカスタムノードラベルに置き換え、nameを実際の値に置き換えます。

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