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

Container Service for Kubernetes:Terraform を使用した ACK 専用クラスターの作成

最終更新日:Jun 19, 2026

VPC、vSwitch、およびアドオンが自動的にプロビジョニングされる、Terway ベースの ACK 専用クラスターをデプロイします。

このコードは、OpenAPI Portal のブラウザ上で実行できます。
重要

ACK 専用クラスターの作成には制限があります。アクセスをリクエストするには、チケットを送信 してください。

前提条件

以下を確認してください。

  • Container Service for Kubernetes (ACK) がアクティブ化されていること (Terraform を使用して ACK をアクティブ化)。

  • Terraform を実行する RAM ユーザー用の AccessKey ペアが作成されていること (AccessKey ペアの作成RAM ユーザー)。

    Alibaba Cloud ルートアカウントではなく、RAM ユーザーを使用してください。限定的な権限により、認証情報が侵害された場合のリスクを軽減できます。
  • 以下の最小限の権限ポリシーが RAM ユーザーにアタッチされていること。 Virtual Private Cloud (VPC)、vSwitch、および ACK クラスターの作成、表示、削除に対応します (権限の付与)。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "vpc:CreateVpc",
            "vpc:CreateVSwitch",
            "vpc:DescribeRouteTableList",
            "vpc:DescribeVpcAttribute",
            "vpc:ListEnhancedNatGatewayAvailableZones",
            "vpc:DescribeVSwitchAttributes",
            "vpc:DescribeNatGateways",
            "cs:CreateCluster",
            "cs:DescribeTaskInfo",
            "cs:DescribeClusterDetail",
            "cs:DescribeClusterCerts",
            "cs:CheckControlPlaneLogEnable",
            "vpc:DeleteVpc",
            "vpc:DeleteVSwitch",
            "cs:DeleteCluster"
          ],
          "Resource": "*"
        }
      ]
    }
  • Terraform v0.12.28 以降。 terraform --version で確認してください。

    オプション

    最適な用途

    Terraform Explorer — オンライン、インストール不要

    無料で迅速なテストとデバッグ

    Cloud Shell — プリインストール済み、認証情報が事前設定済み

    ローカルセットアップなしで迅速かつ便利に実行

    Resource Orchestration Service (ROS) — マネージド Terraform

    Alibaba Cloud、AWS、Azure のリソースを定義するテンプレートによるライフサイクル管理

    ローカルインストール

    カスタム開発環境または制限されたネットワークアクセス

Terraform リソース

この構成では、以下のリソースを使用します。料金が発生するため、不要になったらリリースしてください。

リソース

用途

alicloud_instance_types

特定の条件を満たす ECS インスタンスタイプをクエリ

alicloud_vpc

VPC を作成

alicloud_vswitch

VPC 内に vSwitch (サブネット) を作成

alicloud_resource_manager_resource_groups

RAM ユーザーが管理するリソースグループをクエリ

alicloud_cs_kubernetes

ACK 専用クラスターを作成

この構成では、3 つのゾーンすべてで利用可能なインスタンスタイプを選択し、コントロールプレーン ノードがどのゾーンでもスケジュールできるようにします。

コンソールから Terraform パラメータを生成

サンプルが要件に合わない場合は、ACK コンソールからパラメータを生成してください。

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

  2. [クラスター] ページで、[クラスターテンプレート] をクリックします。

  3. クラスタータイプを選択して [作成] をクリックし、[クラスター設定] ページでクラスターを設定します。

  4. [確認] ページで、[Console-to-Code] をクリックします。

  5. サイドバーで、[Terraform] タブをクリックし、生成されたパラメーターをコピーします。

Terway を使用した ACK 専用クラスターの作成

以下の手順では、Terway を使用した ACK 専用クラスターを作成します。この構成では、VPC、3 つのコントロールプレーン vSwitch、3 つの Terway Pod vSwitch、およびクラスター、合計 8 つのリソースがプロビジョニングされます。

ステップ 1: 構成ファイルの作成

作業ディレクトリを作成し、次の内容で main.tf ファイルを作成します。

provider "alicloud" {
  region = var.region_id
}

variable "region_id" {
  type    = string
  default = "cn-hangzhou"
}

variable "zone_ids" {
  type    = list(string)
  default = ["cn-hangzhou-i","cn-hangzhou-j","cn-hangzhou-k"]
}

# リソース名またはラベルを指定します。
variable "name" {
  default = "tf-example"
}

# 既存の VPC の ID を指定します。この変数を空白のままにすると、新しい VPC が作成されます。
variable "vpc_id" {
  description = "Existing vpc id used to create several vswitches and other resources."
  default     = ""
}

# 新しい VPC の CIDR ブロックを指定します。この変数は、vpc_id 変数を空白のままにした場合に有効になります。
variable "vpc_cidr" {
  description = "The cidr block used to launch a new vpc when 'vpc_id' is not specified."
  default     = "10.0.0.0/8"
}

# 既存の vSwitch の ID を指定します。
variable "vswitch_ids" {
  description = "List of existing vswitch id."
  type        = list(string)
  default     = []
}

# vswitch_ids が指定されていない場合は、vSwitch を作成するために 3 つの CIDR ブロックを指定する必要があります。CIDR ブロックは互いに重複させることはできません。
variable "vswitch_cidrs" {
  description = "List of cidr blocks used to create several new vswitches when 'vswitch_ids' is not specified."
  type        = list(string)
  default     = ["10.1.0.0/16", "10.2.0.0/16", "10.3.0.0/16"]
}

# Terway 構成を指定します。
variable "terway_vswitch_ids" {
  description = "List of existing vswitch ids for terway."
  type        = list(string)
  default     = []
}

# terway_vswitch_ids が空の場合に、Terway vSwitch を作成するための CIDR ブロックを指定します。
variable "terway_vswitch_cidrs" {
  description = "List of cidr blocks used to create several new vswitches when 'terway_vswitch_cidrs' is not specified."
  type        = list(string)
  default     = ["10.4.0.0/16", "10.5.0.0/16", "10.6.0.0/16"]
}

# ACK クラスターにインストールするコンポーネントを指定します。インストールする各コンポーネントの名前と構成を指定する必要があります。
variable "cluster_addons" {
  type = list(object({
    name   = string
    config = string
  }))

  default = [
    {
      "name"   = "terway-eniip",
      "config" = "",
    },
    {
      "name"   = "csi-plugin",
      "config" = "",
    },
    {
      "name"   = "csi-provisioner",
      "config" = "",
    },
    {
      "name"   = "logtail-ds",
      "config" = "{\"IngressDashboardEnabled\":\"true\"}",
    },
    {
      "name"   = "nginx-ingress-controller",
      "config" = "{\"IngressSlbNetworkType\":\"internet\"}",
    },
    {
      "name"   = "arms-prometheus",
      "config" = "",
    },
    {
      "name"   = "ack-node-problem-detector",
      "config" = "{\"sls_project_name\":\"\"}",
    }
  ]
}

locals {
  all_zone_ids = [for zones in data.alicloud_enhanced_nat_available_zones.enhanced.zones : zones.zone_id]
  common_zone_ids = setintersection(toset(var.zone_ids),toset(local.all_zone_ids))

  # 各ゾーンで利用可能なインスタンスタイプを取得します。
  instance_types_per_az = { for az, types in data.alicloud_instance_types.default : az => [for t in types.instance_types : t.id] }

  # 指定されたすべてのゾーンのインスタンスタイプのリストを取得します。
  all_instance_types_in_zones = [for zone in local.common_zone_ids : local.instance_types_per_az[zone]]

  # 各リストをコレクションに変換します。
  sets = [for s in local.all_instance_types_in_zones : toset(s)]

  # すべてのゾーンに共通するインスタンスタイプを計算します。
  common_instance_types = [for element in local.sets[0]: element if length([for set in local.sets: set if contains(set, element)]) == length(local.sets)]
}

# 拡張 NAT ゲートウェイをサポートするゾーンをクエリします。
data "alicloud_enhanced_nat_available_zones" "enhanced" {
}

# vpc_id 変数を指定しない場合、この Terraform リソースは VPC を作成します。VPC の CIDR ブロックは vpc_cidr 変数で指定されます。
resource "alicloud_vpc" "vpc" {
  count      = var.vpc_id == "" ?  1 : 0
  cidr_block = var.vpc_cidr
}

# vswitch_ids 変数を指定しない場合、新しい vSwitch が vswitch_cidrs に基づいて作成されます。
resource "alicloud_vswitch" "vswitches" {
  count      = length(var.vswitch_ids) > 0 ?  0 : length(var.vswitch_cidrs)
  vpc_id     = var.vpc_id == "" ?  join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block = element(var.vswitch_cidrs, count.index)
  zone_id    = tolist(local.common_zone_ids)[count.index]
}

# terway_vswitch_ids 変数を指定しない場合、Terway で使用される vSwitch が vswitch_cidrs パラメータに基づいて作成されます。
resource "alicloud_vswitch" "terway_vswitches" {
  count      = length(var.terway_vswitch_ids) > 0 ?  0 : length(var.terway_vswitch_cidrs)
  vpc_id     = var.vpc_id == "" ?  join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block = element(var.terway_vswitch_cidrs, count.index)
  zone_id    = tolist(local.common_zone_ids)[count.index]
}

# RAM ユーザーが管理するリソースグループをクエリします。
data "alicloud_resource_manager_resource_groups" "default" {
  status = "OK"
}

# ECS インスタンスタイプをクエリします。
data "alicloud_instance_types" "default" {
  for_each            = toset(local.common_zone_ids )
  availability_zone   = each.key
  cpu_core_count      = 8
  memory_size         = 16
  kubernetes_node_role = "Master"
  system_disk_category = "cloud_essd"
}

# ACK 専用クラスターを作成し、コントロールプレーン vSwitch、Pod vSwitch、インスタンスタイプ、ディスク、ノードへのログオンに使用するパスワード、および Service CIDR ブロックを構成します。
resource "alicloud_cs_kubernetes" "default" {
  master_vswitch_ids    = length(var.vswitch_ids) > 0 ?  split(",", join(",", var.vswitch_ids)) : length(var.vswitch_cidrs) < 1 ?  [] : split(",", join(",", alicloud_vswitch.vswitches.*.id))
  pod_vswitch_ids       = length(var.terway_vswitch_ids) > 0 ?  split(",", join(",", var.terway_vswitch_ids)) : length(var.terway_vswitch_cidrs) < 1 ?  [] : split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # Terway をネットワークコンポーネントとして使用する場合の Pod vSwitch の CIDR ブロック。
  master_instance_types = [local.common_instance_types[0],local.common_instance_types[0],local.common_instance_types[0]] # コントロールプレーンのインスタンスタイプ。
  master_disk_category  = "cloud_essd"            # コントロールプレーンのシステムディスクタイプ。
  password              = "Yourpassword1234"     # SSH ログオンに使用するパスワード。
  service_cidr          = "172.18.0.0/16"        # Service CIDR ブロック。
  load_balancer_spec    = "slb.s1.small"         # Server Load Balancer (SLB) インスタンスタイプ。
  install_cloud_monitor = "true"                 # CloudMonitor の有効化。
  resource_group_id     = data.alicloud_resource_manager_resource_groups.default.groups.0.id # クラスターが所属するリソースグループの ID。リソースグループはリソースの分離に使用されます。
  deletion_protection   = "false"                # 削除保護により、コンソールまたは API 操作によるクラスターの誤削除を防止できます。
  timezone              = "Asia/Shanghai"        # クラスターのタイムゾーン。
  os_type               = "Linux"                # ノード OS のタイプ。
  platform              = "AliyunLinux3"         # OS ディストリビューション。
  cluster_domain        = "cluster.local"        # クラスタードメイン名。
  proxy_mode            = "ipvs"                 # kube-proxy モード。
  custom_san            = "www.terraform.io"     # クラスターの API サーバー証明書のサブジェクトの別名 (SAN)。
  new_nat_gateway       = "true"                 # NAT ゲートウェイを作成します。
  dynamic "addons" {
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
}

ステップ 2: Terraform の初期化

terraform init

初期化が成功すると、次のように表示されます。

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for 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.

ステップ 3: 実行計画のプレビュー

terraform plan

適用せずに、計画されたリソースの変更をプレビューします。

計画が成功すると、次のように表示されます。

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
...
Plan: 8 to add, 0 to change, 0 to destroy.
...

ステップ 4: クラスターの作成

terraform apply

プロンプトが表示されたら、yes と入力し、Enter キーを押します。

適用が成功すると、次のように表示されます。

...
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
...
alicloud_cs_managed_kubernetes.default: Creation complete after 8m26s [id=************]

Apply complete!  Resources: 8 added, 0 changed, 0 destroyed.

クラスターの検証

terraform apply が完了したら、いずれかの方法でクラスターを検証します:

terraform show コマンドの実行

オプション 1: terraform show を使用

terraform show

Terraform が作成したすべてのリソースとその現在の状態を一覧表示します。

ACK コンソールへのログオン

オプション 2: ACK コンソールで確認

ACK コンソールにログインし、新しいクラスターが[クラスター] リストに表示されることを確認します。

リソースのクリーンアップ

重要

terraform destroy を実行すると、この構成で作成されたすべてのリソースが完全に削除されます。この操作は元に戻すことはできません。

リソースを解放します。 terraform destroy オプションについては、共通コマンドをご参照ください。

terraform destroy

プロンプトが表示されたら、yes と入力して Enter キーを押します。 破棄が成功すると、次のように返されます。

...
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes
...
Destroy complete!  Resources: 8 destroyed.

サンプルコード

このコードは Terraform Explorer で実行できます。
provider "alicloud" {
  region = var.region_id
}

variable "region_id" {
  type    = string
  default = "cn-hangzhou"
}

variable "zone_ids" {
  type    = list(string)
  default = ["cn-hangzhou-i","cn-hangzhou-j","cn-hangzhou-k"]
}

# リソース名またはラベルを指定します。
variable "name" {
  default = "tf-example"
}

# 既存の VPC の ID を指定します。この変数を空白のままにすると、新しい VPC が作成されます。
variable "vpc_id" {
  description = "Existing vpc id used to create several vswitches and other resources."
  default     = ""
}

# 新しい VPC の CIDR ブロックを指定します。この変数は、vpc_id 変数を空白のままにした場合に有効になります。
variable "vpc_cidr" {
  description = "The cidr block used to launch a new vpc when 'vpc_id' is not specified."
  default     = "10.0.0.0/8"
}

# 既存の vSwitch の ID を指定します。
variable "vswitch_ids" {
  description = "List of existing vswitch id."
  type        = list(string)
  default     = []
}

# vswitch_ids が指定されていない場合は、vSwitch を作成するために 3 つの CIDR ブロックを指定する必要があります。CIDR ブロックは互いに重複させることはできません。
variable "vswitch_cidrs" {
  description = "List of cidr blocks used to create several new vswitches when 'vswitch_ids' is not specified."
  type        = list(string)
  default     = ["10.1.0.0/16", "10.2.0.0/16", "10.3.0.0/16"]
}

# Terway 構成を指定します。
variable "terway_vswitch_ids" {
  description = "List of existing vswitch ids for terway."
  type        = list(string)
  default     = []
}

# terway_vswitch_ids が空の場合に、Terway vSwitch を作成するための CIDR ブロックを指定します。
variable "terway_vswitch_cidrs" {
  description = "List of cidr blocks used to create several new vswitches when 'terway_vswitch_cidrs' is not specified."
  type        = list(string)
  default     = ["10.4.0.0/16", "10.5.0.0/16", "10.6.0.0/16"]
}

# ACK クラスターにインストールするコンポーネントを指定します。インストールする各コンポーネントの名前と構成を指定する必要があります。
variable "cluster_addons" {
  type = list(object({
    name   = string
    config = string
  }))

  default = [
    {
      "name"   = "terway-eniip",
      "config" = "",
    },
    {
      "name"   = "csi-plugin",
      "config" = "",
    },
    {
      "name"   = "csi-provisioner",
      "config" = "",
    },
    {
      "name"   = "logtail-ds",
      "config" = "{\"IngressDashboardEnabled\":\"true\"}",
    },
    {
      "name"   = "nginx-ingress-controller",
      "config" = "{\"IngressSlbNetworkType\":\"internet\"}",
    },
    {
      "name"   = "arms-prometheus",
      "config" = "",
    },
    {
      "name"   = "ack-node-problem-detector",
      "config" = "{\"sls_project_name\":\"\"}",
    }
  ]
}

locals {
  all_zone_ids = [for zones in data.alicloud_enhanced_nat_available_zones.enhanced.zones : zones.zone_id]
  common_zone_ids = setintersection(toset(var.zone_ids),toset(local.all_zone_ids))

  # 各ゾーンで利用可能なインスタンスタイプを取得します。
  instance_types_per_az = { for az, types in data.alicloud_instance_types.default : az => [for t in types.instance_types : t.id] }

  # 指定されたすべてのゾーンのインスタンスタイプのリストを取得します。
  all_instance_types_in_zones = [for zone in local.common_zone_ids : local.instance_types_per_az[zone]]

  # 各リストをコレクションに変換します。
  sets = [for s in local.all_instance_types_in_zones : toset(s)]

  # すべてのゾーンに共通するインスタンスタイプを計算します。
  common_instance_types = [for element in local.sets[0]: element if length([for set in local.sets: set if contains(set, element)]) == length(local.sets)]
}

# 拡張 NAT ゲートウェイをサポートするゾーンをクエリします。
data "alicloud_enhanced_nat_available_zones" "enhanced" {
}

# vpc_id 変数を指定しない場合、この Terraform リソースは VPC を作成します。VPC の CIDR ブロックは vpc_cidr 変数で指定されます。
resource "alicloud_vpc" "vpc" {
  count      = var.vpc_id == "" ?  1 : 0
  cidr_block = var.vpc_cidr
}

# vswitch_ids 変数を指定しない場合、新しい vSwitch が vswitch_cidrs に基づいて作成されます。
resource "alicloud_vswitch" "vswitches" {
  count      = length(var.vswitch_ids) > 0 ?  0 : length(var.vswitch_cidrs)
  vpc_id     = var.vpc_id == "" ?  join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block = element(var.vswitch_cidrs, count.index)
  zone_id    = tolist(local.common_zone_ids)[count.index]
}

# terway_vswitch_ids 変数を指定しない場合、Terway で使用される vSwitch が vswitch_cidrs パラメータに基づいて作成されます。
resource "alicloud_vswitch" "terway_vswitches" {
  count      = length(var.terway_vswitch_ids) > 0 ?  0 : length(var.terway_vswitch_cidrs)
  vpc_id     = var.vpc_id == "" ?  join("", alicloud_vpc.vpc.*.id) : var.vpc_id
  cidr_block = element(var.terway_vswitch_cidrs, count.index)
  zone_id    = tolist(local.common_zone_ids)[count.index]
}

# RAM ユーザーが管理するリソースグループをクエリします。
data "alicloud_resource_manager_resource_groups" "default" {
  status = "OK"
}

# ECS インスタンスタイプをクエリします。
data "alicloud_instance_types" "default" {
  for_each            = toset(local.common_zone_ids )
  availability_zone   = each.key
  cpu_core_count      = 8
  memory_size         = 16
  kubernetes_node_role = "Master"
  system_disk_category = "cloud_essd"
}

# ACK 専用クラスターを作成し、コントロールプレーン vSwitch、Pod vSwitch、インスタンスタイプ、ディスク、ノードへのログオンに使用するパスワード、および Service CIDR ブロックを構成します。
resource "alicloud_cs_kubernetes" "default" {
  master_vswitch_ids    = length(var.vswitch_ids) > 0 ?  split(",", join(",", var.vswitch_ids)) : length(var.vswitch_cidrs) < 1 ?  [] : split(",", join(",", alicloud_vswitch.vswitches.*.id))
  pod_vswitch_ids       = length(var.terway_vswitch_ids) > 0 ?  split(",", join(",", var.terway_vswitch_ids)) : length(var.terway_vswitch_cidrs) < 1 ?  [] : split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # Terway をネットワークコンポーネントとして使用する場合の Pod vSwitch の CIDR ブロック。
  master_instance_types = [local.common_instance_types[0],local.common_instance_types[0],local.common_instance_types[0]] # コントロールプレーンのインスタンスタイプ。
  master_disk_category  = "cloud_essd"            # コントロールプレーンのシステムディスクタイプ。
  password              = "Yourpassword1234"     # SSH ログオンに使用するパスワード。
  service_cidr          = "172.18.0.0/16"        # Service CIDR ブロック。
  load_balancer_spec    = "slb.s1.small"         # Server Load Balancer (SLB) インスタンスタイプ。
  install_cloud_monitor = "true"                 # CloudMonitor の有効化。
  resource_group_id     = data.alicloud_resource_manager_resource_groups.default.groups.0.id # クラスターが所属するリソースグループの ID。リソースグループはリソースの分離に使用されます。
  deletion_protection   = "false"                # 削除保護により、コンソールまたは API 操作によるクラスターの誤削除を防止できます。
  timezone              = "Asia/Shanghai"        # クラスターのタイムゾーン。
  os_type               = "Linux"                # ノード OS のタイプ。
  platform              = "AliyunLinux3"         # OS ディストリビューション。
  cluster_domain        = "cluster.local"        # クラスタードメイン名。
  proxy_mode            = "ipvs"                 # kube-proxy モード。
  custom_san            = "www.terraform.io"     # クラスターの API サーバー証明書のサブジェクトの別名 (SAN)。
  new_nat_gateway       = "true"                 # NAT ゲートウェイを作成します。
  dynamic "addons" {
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
}

次のステップ