デプロイメントセットには、異なる物理サーバーに分散された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つのポッドのみをホストできます。
このユースケースでは、デプロイ内の3つのレプリケートされたポッドを3つの異なるノードにスケジュールする方法を示します。
3つのノードを含むノードプールを作成し、ノードプールに関連付けるデプロイメントセットのIDを指定します。 詳細については、「ACKコンソールでデプロイメントセットをノードプールに関連付ける」をご参照ください。
ノードプールを作成したら、[ノードプール] ページでノードプールの名前をクリックします。 [ノード] タブには、ノードプールに含まれるノードが表示されます。
ECS コンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 [デプロイメントセット] ページには、3つのノードが指定されたデプロイメントセットに属していることが表示されます。
次の内容に基づいて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つの異なるノードにスケジュールされていることを示します。
アプリケーションが同じノードプールにデプロイされます。 同じアプリケーションに属するポッドは、複数のゾーンにまたがる異なるノードにスケジュールできます。
4つのノードを含むノードプールを作成し、ノードプールに関連付けるデプロイメントセットのIDを指定して、複数のゾーンにデプロイされているvSwitchを選択します。 詳細については、「ACKコンソールでデプロイメントセットをノードプールに関連付ける」をご参照ください。
次の内容に基づいてYAMLファイルを作成します。
ポッドトポロジ拡散制約を使用して、同じアプリケーションに属するポッドを複数のゾーンにまたがる異なるノードにスケジュールすることができます。 詳細については、「ポッドトポロジスプレッドの制約」をご参照ください。
結果
ノードプールを作成すると、[ノード] ページに4つのノードと4つのゾーンが表示されます。 ECSインスタンスは4つの異なるゾーンにデプロイされ、Auto Scalingの分散分散ポリシーに基づいて同じデプロイメントセットに追加されます。
ECS コンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 [デプロイメントセット] ページには、ノードプール内の4つのノードが指定されたデプロイメントセットに属していることが表示されます。
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
[デプロイメント] ページで、管理するデプロイメントをクリックします。 [ポッド] タブは、同じアプリケーションに属するポッドが複数のゾーンにまたがる異なるノードにスケジュールされていることを示しています。
関連ドキュメント
Use Terraform to associate a deployment set with a node poolこともできます。
高可用性クラスターアーキテクチャで推奨される設定の詳細については、「HAクラスター作成の推奨設定」をご参照ください。