デプロイメントセットは、ECS インスタンスのディストリビューションを制御するポリシーです。このポリシーにより、ECS インスタンスが異なる物理サーバに分散配置され、アプリケーションの高可用性と基盤となるディザスタリカバリ機能が向上します。ノードプールにデプロイメントセットを割り当てることで、そのノードプールによって作成された ECS インスタンスが同一の物理サーバ上に存在しないことが保証されます。アフィニティ構成と組み合わせることで、アプリケーションが基盤となるノードトポロジーを認識し、ワークロードをノード間で均等に分散できるため、ディザスタリカバリおよび高可用性がさらに強化されます。
前提条件
デプロイメントセットを作成しました。詳細については、「デプロイメントセットの作成」をご参照ください。
背景情報
シングルゾーンでは、通常、サービスを複数のホストにデプロイして高可用性を確保します。ただし、1 台の物理サーバが障害を起こした場合、そのサーバ上のアプリケーションのすべてのレプリカが影響を受けます。この問題に対処するために、ECS ではデプロイメントセットが提供されています。デプロイメントセット内のすべての ECS インスタンスは、指定されたリージョン内の異なる物理サーバに厳密に分散配置されます。これにより、サービス間の相互隔離を必要とするアプリケーションアーキテクチャの要件を満たし、サービスの停止リスクを大幅に低減できます。デプロイメントセットの詳細については、「デプロイメントセット」をご参照ください。
使用制限
クラスターにおける機能使用上の注意点
-
デプロイメントセットは ACK マネージドクラスター および ACK 専用クラスター のみをサポートします。
-
デプロイメントセットは、新しいノードプールを作成する際にのみ指定できます。既存のノードプールに対して有効化することはできません。また、各ノードプールは 1 つのデプロイメントセットのみにバインドできます。
-
デプロイメントセットへのノードの手動追加または削除はできません。ノードプールのスケーリングによって、デプロイメントセット内のノード数を調整してください。詳細については、「ノードプールの作成と管理」をご参照ください。
-
デプロイメントセットを有効化した後は、スポットインスタンスを作成できません。
デプロイメントセットのクォータおよびインスタンスタイプの制限
-
デプロイメントセットのクォータ制限:
-
デフォルトでは、ノードプールのデプロイメントセットは高可用性ポリシーを使用します。このポリシーでは、1 つのデプロイメントセット内に 1 ゾーンあたり最大 20 個の ECS インスタンスを作成できます。Alibaba Cloud リージョン内で作成可能な ECS インスタンスの総数は
20 × ゾーン数となります。デプロイメントセット内で必要なインスタンスタイプの十分な ECS インスタンスクォータおよび在庫があることを確認してください。詳細については、「デプロイメントセット」をご参照ください。単一のデプロイメントセット内で許可されるインスタンスの最大数は増やすことができません。ただし、アカウントで許可されるデプロイメントセットの最大数を引き上げるには、クォータセンターから申請してください。デプロイメントセットの制限およびクォータの詳細については、「デプロイメントセットの制限事項」をご参照ください。
-
デプロイメントセット内で ECS インスタンスの作成に失敗した場合、または従量課金 ECS インスタンス(節約モード)の再起動に失敗した場合は、リージョン内の在庫不足が原因である可能性があります。しばらく待ってから、インスタンスの作成または再起動をリトライしてください。
-
-
インスタンスファミリーの制限: 第 6 世代以降のほとんどのインスタンスファミリーは、高可用性戦略、高可用性グループ戦略、低遅延戦略のデプロイメントセットをサポートしています。
さまざまなデプロイメント戦略は、特定のインスタンスファミリーのみをサポートします。
サポートされているインスタンスファミリーの正確なリストについては、DescribeDeploymentSetSupportedInstanceTypeFamily 操作の出力を参照してください。
デプロイメント戦略
サポート対象のインスタンスファミリー
高可用性戦略および高可用性グループ戦略
-
g9a, g9ae, g9i, g8a, g8i, g8ine, g8ise, g8y, g7, g7a, g7h, g7ne, g7nex, g7se, g7t, g6, g6a, g6e, g6h, g5, g5ne
-
c9a, c9ae, c9i, c8a, c8i, c8ine, c8y, c7, c7a, c7nex, c7se, c7t, c6, c6a, c6e, c5
-
r9a, r9ae, r9i, r8a, r8i, r8y, r7, r7a, r7se, r7t, r6, r6a, r6e, r5
-
hfc9i, hfg9i, hfr9i, hfc8i, hfg8i, hfr8i, hfc7, hfg7, hfr7, hfc6, hfg6, hfr6, hfc5, hfg5
-
ebmc9i, ebmg9a, ebmg9i, ebmr9i, ebmc8a, ebmc8i, ebmc8y, ebmg8a, ebmg8i, ebmg8y, ebmr8a, ebmr8y, ebmc7, ebmc7a, ebmg7, ebmg7a, ebmg7se, ebmhfc7, ebmhfg7, ebmhfr7, ebmr7, ebmr7a, ebmg5
-
i5, i5g, i5ge, ic5, i4, i4g, i4r, i3, i3g, i2, i2g, i2gne, i2ne
-
gn6i
-
d3c, d3s, d2c, d2s, d1ne
-
re6, re6p, s6, t6, e4, mn4, n4, re4, xn4, sn2ne, u2a, u2i, se1, se1ne, sn1ne, u1, e
低遅延戦略
-
g9a, g9ae, g9i, g8a, g8ae, g8i, g8ise, g8y, g7, g5ne
-
c9a, c9ae, c9i, c8a, c8ae, c8i, c8ine, c8y, c7, c7nex
-
r9a, r9ae, r9i, r8a, r8ae, r8i, r8y, r7
-
hfc9i, hfg9i, hfr9i, hfc8i, hfg8i, hfr8i
-
ebmc9i, ebmg9a, ebmg9i, ebmr9i, ebmc8a, ebmc8i, ebmc8y, ebmg8a, ebmg8i, ebmg8y, ebmgn8v, ebmr8a, ebmr8y, ebmc7, ebmc7a, ebmg7, ebmg7a, ebmg7se, ebmgn7ex, ebmhfc7, ebmhfg7, ebmhfr7, ebmr7, ebmr7a
-
i5, i5g, i5ge, i4
-
gn8v
-
hpc8ae, hpc8i, hpc7ip, hpc6id, u2a, u2i
-
コンソールでノードプールにデプロイメントセットを割り当てる
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
ノードプール ページで、ノードプールの作成 をクリックします。ノードプールの作成 ダイアログボックスでパラメーターを設定し、デプロイメントセットを選択して、注文の確認 をクリックします。
ノードプールの設定項目の詳細については、「ノードプールの作成と管理」をご参照ください。

ユースケース
ポッドアンチアフィニティを使用して、単一ノードプール内の同一ワークロードのポッドを 1 ノードにつき 1 つだけ実行するようにスケジューリングする
この例では、Deployment の 3 つのポッドレプリカを 3 つの異なるノードにスケジューリングする方法を示します。以下の手順に従ってください。
-
3 つのノードを持つノードプールを作成し、ノードプールにデプロイメントセット ID を割り当てます。詳細については、「コンソールでノードプールにデプロイメントセットを割り当てる」をご参照ください。
ノードプールの作成後、ノードプール ページに移動し、対象のノードプールをクリックします。次に、ノード タブで、3 つのノードが正常に作成されたことを確認します。

ECS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。デプロイメントセット ページで、ノードプール内の 3 つのノードすべてが選択したデプロイメントセットに属していることを確認します。

-
以下の YAML を使用してアプリケーションを構成します。
ポッドアンチアフィニティを構成して、3 つのアプリケーションポッドをノードプール内の異なるノードにスケジューリングします。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: # スケジューリングポリシーを設定します。 - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: kubernetes.io/hostname nodeSelector: alibabacloud.com/nodepool-id: <nodepool-id> # ノードプール ID を指定します。 containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: 1 requests: cpu: 1実行結果
デプロイメント ページで、対象の Deployment をクリックします。ポッド タブで、3 つのポッドがノードプール内の異なるノードにスケジューリングされていることを確認できます。

単一ノードプール内で、同一ワークロードのポッドをゾーンおよびノード間で均等に分散する
-
4 つのノードを持つノードプールを作成し、ノードプールにデプロイメントセット ID を割り当て、複数ゾーンの vSwitch を選択します。詳細については、「コンソールでノードプールにデプロイメントセットを割り当てる」をご参照ください。
作成後、ノードプール ページに移動し、対象のノードプールをクリックします。次に、ノード タブで、4 つのゾーンにわたって 4 つのノードが存在することを確認します。ESS の均等分散ポリシーに基づき、作成された ECS インスタンスは 4 つの異なるゾーンに分散され、すべてデプロイメントセットに属します。

ECS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。デプロイメントセット ページで、ノードプール内の 4 つのノードすべてが選択したデプロイメントセットに属していることを確認します。

-
以下の YAML を使用してアプリケーションを構成します。
ポッドトポロジースプレッド制約を使用して、同一アプリケーションのポッドをゾーンおよびノード間で均等に分散します。詳細については、「ポッドトポロジースプレッド制約」をご参照ください。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 4 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: nginx - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: nginx nodeSelector: alibabacloud.com/nodepool-id: <nodepool-id> # ノードプール ID を指定します。 containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: 1 requests: cpu: 1実行結果
デプロイメント ページで、対象の Deployment をクリックします。ポッド タブで、同一アプリケーションのポッドがゾーンおよびノード間で均等に分散されていることを確認できます。

参照
-
高可用性クラスタアーキテクチャの推奨構成については、「高可用性クラスタアーキテクチャの推奨構成」をご参照ください。