デプロイメントセットには、異なる物理サーバーに分散されている Elastic Compute Service (ECS) インスタンスが含まれています。 デプロイメントセットを使用すると、アプリケーションの可用性を向上させ、ディザスタリカバリを実装できます。 デプロイメントセットに関連付けられているノードプールには、複数の物理サーバーに分散されている ECS ノードが含まれています。 ポッドアフィニティを構成して、アプリケーションポッドを異なる ECS ノードにデプロイできます。 これにより、ディザスタリカバリが実装され、アプリケーションの可用性が向上します。 このトピックでは、Terraform を使用してデプロイメントセットをノードプールに関連付ける方法について説明します。
このトピックのサンプルコードは、数回クリックするだけで実行できます。ここ をクリックして、サンプルコードを実行します。
前提条件
Terraform のランタイム環境は、次のいずれかの方法を使用して準備します。
Terraform Explorer で Terraform を使用する: Alibaba Cloud は、Terraform のオンラインランタイム環境を提供しています。 環境にログインして、Terraform をインストールせずに使用できます。 低コスト、効率的、かつ便利な方法で Terraform を使用およびデバッグする必要があるシナリオに適しています。
Cloud Shell で Terraform を使用する: Cloud Shell には Terraform がプリインストールされており、ID 資格情報が構成されています。 Cloud Shell で Terraform コマンドを実行できます。 低コスト、効率的、かつ便利な方法で Terraform を使用およびアクセスする必要があるシナリオに適しています。
ROS で Terraform を使用する: Resource Orchestration Service (ROS) は、Terraform テンプレートの統合をサポートしています。 ROS で Terraform を使用することにより、Alibaba Cloud、Amazon Web Services (AWS)、または Microsoft Azure のリソースを定義および管理し、リソースパラメーターを指定し、リソースの依存関係を構成できます。
オンプレミスマシンに Terraform をインストールして構成する: ネットワーク接続が不安定な場合、またはカスタム開発環境が必要な場合に適しています。
説明Terraform 0.12.28 以降がインストールされています。 terraform --version コマンドを実行して、Terraform のバージョンをクエリできます。
デプロイメントセットに十分な ECS クォータがあり、指定された ECS インスタンスタイプの在庫が十分にあることを確認します。 デフォルトでは、各デプロイメントセットには、ゾーンごとに最大 20 個の ECS インスタンスを含めることができます。 詳細については、「ECS クォータを管理する」をご参照ください。
AccessKey ペアは、ログインに使用する Resource Access Management (RAM) ユーザーに対して作成されます。
説明デフォルトでは、Alibaba Cloud アカウントは、このアカウントに属するすべてのリソースに対するフルアクセス許可を持っています。 RAM アカウントを使用することをお勧めします。これは、リソースのアクセス許可が制限されているため、資格情報が侵害された場合の潜在的なセキュリティリスクを最小限に抑えることができるためです。
Terraform でコマンドを実行するために使用する RAM ユーザーには、次のポリシーがアタッチされています。 このポリシーには、Terraform でコマンドを実行するために必要な最小限のアクセス許可が含まれています。 詳細については、「RAM ユーザーにアクセス許可を付与する」をご参照ください。
このポリシーにより、Resource Access Management (RAM) ユーザーは、仮想プライベートクラウド (VPC)、vSwitch、デプロイメントセット、および ACK クラスタを作成、表示、および削除できます。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "vpc:CreateVpc", "vpc:CreateVSwitch", "cs:CreateCluster", "vpc:DescribeVpcAttribute", "vpc:DescribeVSwitchAttributes", "vpc:DescribeRouteTableList", "vpc:DescribeNatGateways", "cs:DescribeTaskInfo", "cs:DescribeClusterDetail", "cs:GetClusterCerts", "cs:CheckControlPlaneLogEnable", "cs:CreateClusterNodePool", "cs:DescribeClusterNodePoolDetail", "cs:ModifyClusterNodePool", "vpc:DeleteVpc", "vpc:DeleteVSwitch", "cs:DeleteCluster", "cs:DeleteClusterNodepool", "ecs:CreateDeploymentSet", "ecs:DescribeDeploymentSets", "ecs:ModifyDeploymentSetAttribute", "ecs:DeleteDeploymentSet" ], "Resource": "*" } ] }
背景情報
ゾーン内のアプリケーションの高可用性を確保するには、アプリケーションを複数のホストにデプロイする必要があります。 ただし、物理サーバーがダウンすると、すべてのアプリケーションポッドが影響を受けます。 この問題を解決するには、ECS によって提供されるデプロイメントセットを使用できます。 デプロイメントセットに含まれる ECS インスタンスは、複数の物理サーバーに分散され、互いに分離されています。 これにより、単一障害点によって引き起こされるサービスの中断を防ぐのに役立ちます。 デプロイメントセットの詳細については、「デプロイメントセット」をご参照ください。
制限事項
クラスタ機能の使用ガイドライン
デプロイメントセットは、ACK 専用クラスター および ACK マネージドクラスター でサポートされています。
ノードプールにデプロイメントセットを関連付けることができるのは、ノードプールを作成するときだけです。 既存のノードプールでは、デプロイメントセットを有効にすることはできません。 各ノードプールに関連付けることができるデプロイメントセットは 1 つだけです。
デプロイメントセットに ECS インスタンスを手動で追加したり、デプロイメントセットから ECS インスタンスを手動で削除したりすることはできません。 デプロイメントセット内の ECS インスタンスの数を変更する場合は、デプロイメントセットが関連付けられているノードプールをスケーリングできます。 詳細については、「ノードプールを作成および管理する」をご参照ください。
デプロイメントセットをノードプールに関連付けると、ノードプールはプリエンプティブルインスタンスをサポートしなくなります。
デプロイメントセットのクォータと仕様の制限
デプロイメントセットのクォータ制限
デフォルトでは、ノードプール デプロイメントセットは、高可用性戦略に基づいて実装されます。高可用性戦略を採用するデプロイメントセットでは、ゾーンごとに最大 20 個の ECS インスタンスを作成できます。Alibaba Cloud リージョン内に作成できるデプロイメントセット内の ECS インスタンスの最大数は、次の数式を使用して計算できます。
20 × Number of zones within the region。デプロイメントセット内に十分な数の ECS インスタンスと、必要なインスタンスタイプの十分な在庫があることを確認してください。詳細については、「デプロイメントセット」をご参照ください。デプロイメントセット内の ECS インスタンスの数を増やすことはできません。 ただし、Alibaba Cloud アカウントが持つことができるデプロイメントセットの最大数を増やす場合は、クォータセンターコンソール でクォータの増加をリクエストしてください。 デプロイメントセットの制限とクォータの詳細については、「デプロイメントセット」をご参照ください。
リージョン内にインスタンスリソースが不足していると、デプロイメントセットで停止された従量課金インスタンスを作成または開始できない場合があります。 しばらく待ってから、インスタンスの作成または開始を再試行してください。
インスタンスファミリの制限
使用できるデプロイメントストラテジーは、インスタンスファミリによって異なる場合があります。 次の表に、さまざまなインスタンスファミリでサポートされているデプロイメントストラテジーを示します。
説明特定のデプロイメントストラテジーをサポートするインスタンスファミリをクエリするには、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、ic5、および sn1ne
r8a、r8i、r8y、r7、r7se、r7t、r7a、r6、r6e、r6a、re6、re6p、r5、re4、se1ne、および se1
hfc8i、hfg8i、hfr8i、hfc7、hfg7、hfr7、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
必要なリソース
この例で使用される特定のリソースに対して料金が発生します。 不要になったリソースは解放またはサブスクライブ解除してください。
alicloud_vpc: VPC を作成します。
alicloud_vswitch: VPC に vSwitch を作成して、VPC のサブネットを作成します。
alicloud_ecs_deployment_set: デプロイメントセットを作成します。
alicloud_cs_managed_kubernetes: ACK マネージドクラスターを作成します。
alicloud_cs_kubernetes_node_pool: ACK マネージドクラスターのノードプールを作成します。
Terraform を使用してノードプールを作成し、デプロイメントセットをノードプールに関連付ける
次のテンプレートを使用して、ノードプールを作成し、デプロイメントセットをノードプールに関連付けます。
provider "alicloud" { region = var.region_id } variable "region_id" { type = string default = "cn-shenzhen" } variable "name" { default = "tf-example" } variable "strategy" { default = "Availability" description = "The deployment strategy. Valid values: Availability, AvailabilityGroup, LowLatency." // デプロイメントストラテジー。 有効な値: Availability、AvailabilityGroup、LowLatency。 } variable "cluster_spec" { type = string description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters." // Kubernetes クラスタのクラスタ仕様。空にすることもできます。 有効な値: ack.standard: 標準マネージドクラスター。 ack.pro.small: プロフェッショナルマネージドクラスター。 default = "ack.pro.small" } // vSwitch のゾーンを指定します。 variable "availability_zone" { description = "The availability zones of vswitches." default = ["cn-shenzhen-c", "cn-shenzhen-e", "cn-shenzhen-f"] } // vSwitch の作成に使用される CIDR ブロック。 variable "node_vswitch_cidrs" { type = list(string) default = ["172.16.0.0/23", "172.16.2.0/23", "172.16.4.0/23"] } // Terway vSwitch の作成に使用される CIDR ブロック。 variable "terway_vswitch_cidrs" { type = list(string) default = ["172.16.208.0/20", "172.16.224.0/20", "172.16.240.0/20"] } // ワーカーノードの ECS インスタンスタイプを指定します。 variable "worker_instance_types" { description = "The ecs instance types used to launch worker nodes." default = ["ecs.g6.2xlarge", "ecs.g6.xlarge"] } // ワーカーノードのパスワードを指定します。 variable "password" { description = "The password of ECS instance." default = "Test123456" } // ACK マネージドクラスターにインストールするコンポーネントを指定します。 コンポーネントには、Terway (ネットワークプラグイン)、csi-plugin (ボリュームプラグイン)、csi-provisioner (ボリュームプラグイン)、logtail-ds (ロギングプラグイン)、NGINX Ingress コントローラー、ack-arms-prometheus (モニタリングプラグイン)、および ack-node-problem-detector (ノード診断プラグイン) が含まれます。 variable "cluster_addons" { type = list(object({ name = string config = string })) default = [ { "name" = "terway-eniip", "config" = "", }, { "name" = "logtail-ds", "config" = "{\"IngressDashboardEnabled\":\"true\"}", // "{\"IngressDashboardEnabled\":\"true\"}" }, { "name" = "nginx-ingress-controller", "config" = "{\"IngressSlbNetworkType\":\"internet\"}", // "{\"IngressSlbNetworkType\":\"internet\"}" }, { "name" = "arms-prometheus", "config" = "", }, { "name" = "ack-node-problem-detector", "config" = "{\"sls_project_name\":\"\"}", }, { "name" = "csi-plugin", "config" = "", }, { "name" = "csi-provisioner", "config" = "", } ] } // ACK マネージドクラスターの名前のプレフィックスを指定します。 variable "k8s_name_prefix" { description = "The name prefix used to create managed kubernetes cluster." default = "tf-ack" } variable "vpc_name" { default = "tf-vpc" } variable "nodepool_name" { default = "default-nodepool" } // デフォルトのリソース名。 locals { k8s_name_terway = substr(join("-", [var.k8s_name_prefix, "terway"]), 0, 63) } // VPC。 resource "alicloud_vpc" "default" { vpc_name = var.vpc_name cidr_block = "172.16.0.0/12" } // ノード vSwitch。 resource "alicloud_vswitch" "vswitches" { count = length(var.node_vswitch_cidrs) vpc_id = alicloud_vpc.default.id cidr_block = element(var.node_vswitch_cidrs, count.index) zone_id = element(var.availability_zone, count.index) } // ポッド vSwitch。 resource "alicloud_vswitch" "terway_vswitches" { count = length(var.terway_vswitch_cidrs) vpc_id = alicloud_vpc.default.id cidr_block = element(var.terway_vswitch_cidrs, count.index) zone_id = element(var.availability_zone, count.index) } // デプロイメントセットを作成します。 resource "alicloud_ecs_deployment_set" "default" { strategy = var.strategy domain = "Default" granularity = "Host" deployment_set_name = var.name description = "example_value" } // ACK マネージドクラスター。 resource "alicloud_cs_managed_kubernetes" "default" { name = local.k8s_name_terway // ACK クラスタ名。 cluster_spec = var.cluster_spec // ACK Pro クラスタを作成します。 worker_vswitch_ids = split(",", join(",", alicloud_vswitch.vswitches.*.id)) // ノードプールが使用する vSwitch。 1 つ以上の vSwitch ID を指定します。 vSwitch は、availability_zone で指定されたゾーンに存在する必要があります。 pod_vswitch_ids = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) // ポッドが使用する vSwitch。 new_nat_gateway = true // ACK クラスタの作成時に NAT ゲートウェイを作成するかどうかを指定します。 デフォルト値: true。 service_cidr = "10.11.0.0/16" // ポッド CIDR ブロック。 cluster_network_type パラメーターを flannel に設定した場合、このパラメーターは必須です。 ポッド CIDR ブロックは、VPC CIDR ブロックまたは VPC 内の他の ACK クラスタの CIDR ブロックと同じにすることはできません。 クラスタの作成後、ポッド CIDR ブロックを変更することはできません。 クラスタ内のホストの最大数: 256。 slb_internet_enabled = true // クラスタの API サーバーのインターネット向け SLB インスタンスを作成するかどうかを指定します。 デフォルト値: false。 enable_rrsa = true control_plane_log_components = ["apiserver", "kcm", "scheduler", "ccm"] // コントロールプレーンログ。 dynamic "addons" { // コンポーネント管理。 for_each = var.cluster_addons content { name = lookup(addons.value, "name", var.cluster_addons) config = lookup(addons.value, "config", var.cluster_addons) } } } // 通常のノードプール。 resource "alicloud_cs_kubernetes_node_pool" "default" { cluster_id = alicloud_cs_managed_kubernetes.default.id // ACK クラスタ名。 node_pool_name = var.nodepool_name // ノードプール名。 vswitch_ids = split(",", join(",", alicloud_vswitch.vswitches.*.id)) // ノードプールが使用する vSwitch。 1 つ以上の vSwitch ID を指定します。 vSwitch は、availability_zone で指定されたゾーンに存在する必要があります。 instance_types = var.worker_instance_types instance_charge_type = "PostPaid" runtime_name = "containerd" desired_size = 2 // ノードプール内のノードの予想数。 password = var.password // SSH を使用してクラスタにログインするために使用されるパスワード。 install_cloud_monitor = true // クラスタ内のノードに CloudMonitor エージェントをインストールするかどうかを指定します。 system_disk_category = "cloud_essd" system_disk_size = 100 image_type = "AliyunLinux" deployment_set_id = alicloud_ecs_deployment_set.default.id data_disks { // ノードのデータディスク構成。 category = "cloud_essd" // ディスクカテゴリ。 size = 120 // ディスクサイズ。 } }次のコマンドを実行して、Terraform ランタイム環境を初期化します。
terraform init次の情報が返された場合、Terraform は初期化されています。
Terraform has been successfully initialized! // Terraform は正常に初期化されました。 You may now begin working with Terraform. Try running "terraform plan" to see // Terraform での作業を開始できます。 "terraform plan" を実行して、 any changes that are required for your infrastructure. All Terraform commands // インフラストラクチャに必要な変更を確認してください。 すべての Terraform コマンド should now work. // が機能するはずです。 If you ever set or change modules or backend configuration for Terraform, // Terraform のモジュールまたはバックエンド構成を設定または変更した場合は、 rerun this command to reinitialize your working directory. If you forget, other // このコマンドを再実行して作業ディレクトリを再初期化します。 忘れた場合、他の commands will detect it and remind you to do so if necessary. // コマンドがそれを検出し、必要に応じてそうするように通知します。次のコマンドを実行して、ノードプールを作成します。
terraform apply次の情報が返された場合、ノードプールはデプロイメントセットに関連付けられています。
Do you want to perform these actions? // これらのアクションを実行しますか? Terraform will perform the actions described above. // Terraform は上記のアクションを実行します。 Only 'yes' will be accepted to approve. // 承認するには、「yes」のみが受け入れられます。 Enter a value: yes // 値を入力してください: yes ... Apply complete! Resources: 10 added, 0 changed, 0 destroyed. // 適用完了! リソース: 10 個追加、0 個変更、0 個破棄。結果を確認する
terraform show コマンドを実行する
次のコマンドを実行して、Terraform によって作成されたリソースをクエリします。
terraform show
ACK コンソールにログインする
ノードプールACK コンソール の [ノードプール] ページで、作成したノードプールを見つけることができます。 列の [編集]アクション をクリックして、関連付けられているデプロイメントセットを表示できます。

リソースをクリアする
Terraform によって作成または管理された前述のリソースが不要になった場合は、terraform destroy コマンドを実行してリソースを解放します。 terraform destroy コマンドの詳細については、「共通コマンド」をご参照ください。
terraform destroy例
このトピックのサンプルコードは、数回クリックするだけで実行できます。 ここをクリックして、サンプルコードを実行します。
サンプルコード
より完全な例を表示する場合は、その他の例 にアクセスして、対応するクラウドサービスのディレクトリを選択してください。
参考文献
ノードプール内の ECS インスタンスの分散を制御する方法の詳細については、「デプロイメントセットをノードプールに関連付けるためのベストプラクティス」をご参照ください。
Terraform は、ROS でマネージドサービスとして利用できます。 ROS コンソール で Terraform テンプレートをデプロイできます。 詳細については、「Terraform スタックを作成する」をご参照ください。