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

Container Service for Kubernetes:デプロイメントセットをノードプールに関連付けるためのベストプラクティス

最終更新日:Oct 28, 2024

デプロイメントセットには、異なる物理サーバーに分散されたECS (Elastic Compute Service) インスタンスが含まれています。 デプロイメントセットを使用して、アプリケーションの可用性を向上させ、ディザスタリカバリを実装できます。 デプロイメントセットに関連付けられたノードプールには、複数の物理サーバーに分散されたECSノードが含まれます。 ポッドアフィニティを設定して、アプリケーションポッドを異なるECSノードにデプロイできます。 これにより、ディザスタリカバリが実装され、アプリケーションの可用性が向上します。

前提条件

  • デプロイメントセットが作成されます。 詳細については、「デプロイメントセットの作成」をご参照ください。

  • デプロイメントセットのECSクォータは十分であり、指定されたインスタンスタイプの十分なECSインスタンスが利用可能です。 デフォルトでは、各デプロイメントセットは各ゾーンに最大20個のECSインスタンスを含めることができます。 詳細については、「リソースクォータの表示と増加」をご参照ください。

背景情報

ゾーン内のアプリケーションの高可用性を確保するには、複数のホストにアプリケーションを配置する必要があります。 ただし、物理サーバーがダウンすると、すべてのアプリケーションポッドが影響を受けます。 この問題を解決するには、ECSが提供するデプロイメントセットを使用します。 デプロイメントセットに含まれるECSインスタンスは、複数の物理サーバーに分散され、互いに分離されます。 これにより、単一障害点によって引き起こされるサービスの中断を防ぐことができます。 デプロイメントセットの詳細については、「デプロイメントセット」をご参照ください。

制限事項

クラスター機能の使用ガイドライン

  • デプロイメントセットは、ACK専用クラスターACKマネージドクラスターでサポートされています。

  • ノードプールを作成する場合にのみ、デプロイメントセットをノードプールに関連付けることができます。 既存のノードプールでは、デプロイメントセットを有効にすることはできません。 各ノードプールに関連付けることができるデプロイメントセットは1つだけで、ノードプールに関連付けられているデプロイメントセットを変更することはできません。

  • ECSインスタンスを手動でデプロイメントセットに追加したり、ECSインスタンスを削除したりすることはできません。 デプロイメントセット内のECSインスタンスの数を変更する場合は、デプロイメントセットが関連付けられているノードプールをスケーリングできます。 詳細については、「ノードプールの作成」をご参照ください。

  • デプロイメントセットをノードプールに関連付けた後、ノードプールはプリエンプティブルインスタンスをサポートしません。

デプロイメントセットのクォータと仕様の制限

  • デフォルトでは、ノードプール配置セットは高可用性戦略に基づいて実装されます。 高可用性戦略を採用したデプロイメントセットでは、ゾーンごとに最大20個のECSインスタンスを作成できます。 次の式を使用して、Alibaba Cloudリージョン内のデプロイメントセットに作成できるECSインスタンスの最大数を計算できます。20 × リージョン内のゾーン数。 詳細については、「デプロイメントセット」をご参照ください。

    デプロイメントセット内のECSインスタンスの数を増やすことはできません。 ただし、Alibaba Cloudアカウントが持つことができるデプロイメントセットの最大数を増やす場合は、quota Centerコンソールでクォータの増加をリクエストしてください。 デプロイメントセットの制限とクォータの詳細については、「デプロイメントセットの制限」をご参照ください。

  • インスタンスファミリーの制限

    使用できるデプロイ戦略は、インスタンスファミリーによって異なります。 次の表に、さまざまなインスタンスファミリーでサポートされているデプロイメント戦略を示します。

    説明

    特定のデプロイメント戦略をサポートするインスタンスファミリーを照会するには、DescribeDeploymentSetSupportedInstanceTypeFamily操作を呼び出します。

    展開戦略

    デプロイメント戦略をサポートするインスタンスファミリー

    高可用性戦略または高可用性グループ戦略

    • g8a, g8i, g8y, g7se, g7a, g7, g7h, g7t, g7ne, g7nex, g6, g6e, g6a, g5、g5ne、sn2ne、sn2、およびsn1

    • c8a、c8i、c8y、c7se、c7、c7t、c7nex、c7a、c6、c6a、c6e、c5、およびsn1ne

    • r8a、r8i、r8y、r7、r7se、r7t、r7a、r6、r6e、r6a、re6、re6p、r5、re4、se1ne、およびse1

    • hfc8i、hfg8i、hfr8i、hfc7、hfg7、hfc7、hfc6、hfg6、hfr6、hfc5、およびhfg5

    • d3c、d2s、d2c、d1、d1ne、d1-c14d3、およびd1-c8d3

    • i3g、i3、i2、i2g、i2ne、i2gne、およびi1

    • ebmg5、ebmc7、ebmg7、ebmr7、sccgn6、scch5、scch5s、sccg5、およびsccg5s

    • e, t6、xn4、mn4、n4、e4、n2、およびn1

    • gn6i

    低レイテンシ戦略

    • g8a、g8i、g8ae、およびg8y

    • c8a、c8i、c8ae、およびc8y

    • ebmc8i、ebmg8i、およびebmr8i

    • r8a、r8i、r8ae、およびr8y

    • ebmc7、ebmg7、およびebmr7

  • リージョン内のインスタンスリソースが不足していると、ECSインスタンスの作成に失敗したり、デプロイメントセットでエコノミーモードで停止した従量課金インスタンスの起動に失敗する可能性があります。 しばらく待ってから、インスタンスを再度作成または起動してください。

ACKコンソールでデプロイメントセットをノードプールに関連付ける

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. [ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。 [ノードプールの作成] ダイアログボックスで、パラメーターを設定し、デプロイメントセットを選択して、[注文の確認] をクリックします。

    パラメーターの詳細については、「手順」をご参照ください。部署集.png

ユースケース

アプリケーションは同じノードプールにデプロイされ、ポッドアンチアフィニティは同じアプリケーションに属するポッドに対して構成されます。 各ノードは1つのポッドのみをホストできます。

このユースケースでは、デプロイ内の3つのレプリケートされたポッドを3つの異なるノードにスケジュールする方法を示します。

  1. 3つのノードを含むノードプールを作成し、ノードプールに関連付けるデプロイメントセットのIDを指定します。 詳細については、「ACKコンソールでデプロイメントセットをノードプールに関連付ける」をご参照ください。

    ノードプールを作成したら、[ノードプール] ページでノードプールの名前をクリックします。 [ノード] タブには、ノードプールに含まれるノードが表示されます。

    ECS コンソールにログインします。 左側のナビゲーションウィンドウで、[デプロイと伸縮性] > [デプロイメントセット] を選択します。 [デプロイメントセット] ページには、3つのノードが指定されたデプロイメントセットに属していることが表示されます。

  2. 次の内容に基づいてYAMLファイルを作成します。

    3つのポッドをデプロイし、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:  # Configure the scheduling policy. 
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - nginx
                topologyKey: kubernetes.io/hostname
          nodeSelector:
              alibabacloud.com/nodepool-id: <nodepool-id>  # Specify the ID of the node pool. 
          containers:
          - name: nginx
            image: nginx
            resources:
              limits:
                cpu: 1
              requests:
                cpu: 1

    結果

    [デプロイメント] ページで、管理するデプロイメントをクリックします。 [ポッド] タブは、ポッドが3つの異なるノードにスケジュールされていることを示します。

アプリケーションが同じノードプールにデプロイされます。 同じアプリケーションに属するポッドは、複数のゾーンにまたがる異なるノードにスケジュールできます。

  1. 4つのノードを含むノードプールを作成し、ノードプールに関連付けるデプロイメントセットのIDを指定して、複数のゾーンにデプロイされているvSwitchを選択します。 詳細については、「ACKコンソールでデプロイメントセットをノードプールに関連付ける」をご参照ください。

  2. ノードプールを作成すると、[ノード] ページに4つのノードと4つのゾーンが表示されます。 ECSインスタンスは4つの異なるゾーンにデプロイされ、Auto Scalingの分散分散ポリシーに基づいて同じデプロイメントセットに追加されます。

    ECS コンソールにログインします。 左側のナビゲーションウィンドウで、[デプロイと伸縮性] > [デプロイメントセット] を選択します。 [デプロイメントセット] ページには、ノードプール内の4つのノードが指定されたデプロイメントセットに属していることが表示されます。

  3. 次の内容に基づいてYAMLファイルを作成します。

  4. ポッドトポロジ拡散制約を使用して、同じアプリケーションに属するポッドを複数のゾーンにまたがる異なるノードにスケジュールすることができます。 詳細については、「ポッドトポロジスプレッドの制約」をご参照ください。

  5. 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>  #Specify the ID of the node pool. 
          containers:
          - name: nginx
            image: nginx
            resources:
              limits:
                cpu: 1
              requests:
                cpu: 1
  6. 結果

  7. [デプロイメント] ページで、管理するデプロイメントをクリックします。 [ポッド] タブは、同じアプリケーションに属するポッドが複数のゾーンにまたがる異なるノードにスケジュールされていることを示しています。

関連ドキュメント