ノードプールにデプロイメントセットを割り当てて、Elastic Compute Service (ECS) インスタンスを物理サーバー間に分散させます。アフィニティー設定により、アプリケーションは基盤となるノードトポロジを認識し、ワークロードをノード間に均等に分散させ、ディザスタリカバリと高可用性を向上させることができます。
前提条件
デプロイメントセットが作成済みであること。
背景情報
単一ゾーンでは、高可用性を実現するために通常、サービスを複数のホストにデプロイします。物理サーバーに障害が発生すると、その上のすべてのレプリカが影響を受けます。ECS のデプロイメントセットは、リージョン内の異なる物理サーバーにインスタンスを分散させることで、相互の分離を保証し、サービスの利用不能リスクを低減します。
制限事項
クラスターにおける機能の使用に関する注意事項
-
デプロイメントセットは、ACK マネージドクラスターおよびACK 専用クラスターのみをサポートします。
-
デプロイメントセットは、ノードプールの作成時にのみ指定できます。既存のノードプールに対してデプロイメントセットを有効にすることはできません。各ノードプールは 1 つのデプロイメントセットをサポートします。
-
デプロイメントセットに手動でノードを追加または削除することはできません。ノード数を調整するには、ノードプールをスケーリングします。詳細については、「ノードプールの作成と管理」をご参照ください。
-
デプロイメントセットを持つノードプールは、スポットインスタンス をサポートしません。
デプロイメントセットのクォータとインスタンスタイプの制限
-
デプロイメントセットのクォータ制限:
-
ノードプールデプロイメントセットは、デフォルトで高可用性ポリシーを使用します。デプロイメントセット内では、ゾーンごとに最大 20 個の ECS インスタンスを作成できます。Alibaba Cloud リージョンあたりの ECS インスタンスの総数は
20 × ゾーンの数です。必要なインスタンスタイプに対して、十分な ECS インスタンスクォータとインベントリを確保してください。詳細については、 デプロイメントセット をご参照ください。デプロイメントセットあたりの最大インスタンス数を増やすことはできません。アカウントのデプロイメントセットの最大数を増やすには、Quota Center から申請してください。詳細については、「デプロイメントセットの制限」をご参照ください。
-
デプロイメントセットでの ECS インスタンスの作成、または従量課金インスタンス (エコノミーモード) の再起動が失敗した場合、原因は在庫不足の可能性があります。しばらく待ってから再試行してください。
-
インスタンスファミリーの制限:第 6 世代以降のほとんどのインスタンスファミリーは、高可用性戦略、高可用性グループ戦略、および低遅延戦略を使用するデプロイメントセットをサポートしています。
コンソールを使用したデプロイメントセットの割り当て
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
-
ノードプール ページで、ノードプールの作成 をクリックします。ノードプールの作成 ダイアログボックスでパラメーターを設定し、デプロイメントセットを選択して、注文の確認 をクリックします。
ノードプールのパラメーターについては、「ノードプールの作成と管理」をご参照ください。デプロイメントセットを選択すると、ノードプール内の最大ノード数が制限されます。デフォルトの制限は 20 × ゾーン数です。ノードのスケールアウトが失敗しないように、デプロイメントセットのクォータが十分であることを確認してください。

ユースケース
Pod アンチアフィニティー を使用し、同一ワークロードの Pod を各ノードに1つずつスケジュールする
Deployment の 3 つの Pod レプリカを 3 つの異なるノードにスケジュールします。
-
3 つのノードを持つノードプールを作成し、デプロイメントセットを割り当てます。
ノードプール ページでノードプールをクリックします。ノード タブで、3 つのノードが作成されたことを確認します。

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

-
次の YAML を使用してアプリケーションを設定します。
Pod アンチアフィニティー を設定して、3 つのアプリケーション Pod を異なるノードにスケジュールします。
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 つの Pod が異なるノードにスケジュールされていることがわかります。

単一のノードプール内で、同じワークロードの Pod をゾーンとノードに均等に分散させる
-
4 つのノードを持つノードプールを作成し、デプロイメントセットを割り当て、複数のゾーンの vSwitch を選択します。
作成後、ノードプール ページでノードプールをクリックします。ノード タブで、4 つのゾーンにまたがって 4 つのノードが存在することを確認します。Elastic Scaling Service (ESS) の均等分散ポリシーに従い、ECS インスタンスは 4 つのゾーンに分散され、デプロイメントセットに属します。

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

-
次の YAML を使用してアプリケーションを設定します。
Pod トポロジースプレッド制約 を使用して、同じアプリケーションの Pod をゾーンとノードに均等に分散させます。
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 をクリックします。ポッド タブで、Pod がゾーンとノードに均等に分散されていることがわかります。

関連ドキュメント
-
「高可用性クラスターアーキテクチャの推奨構成」をご参照ください。