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

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

最終更新日:Dec 30, 2025

このトピックでは、Terraform を使用して ACK 専用クラスターを作成する方法について説明します。

説明

このチュートリアルのサンプルコードは、ワンクリックで実行できます。ワンクリックで実行

重要

新しい ACK 専用クラスターの作成は制限されています。この機能を有効にするには、してください

前提条件

  • Container Service for Kubernetes (ACK) を有効化します。Terraform を使用して ACK を有効化する方法の詳細については、「Terraform を使用した ACK の有効化とロールへの権限付与」をご参照ください。

  • Alibaba Cloud アカウントは、アカウント内のすべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの認証情報が漏洩すると、リソースが重大なセキュリティリスクにさらされます。Resource Access Management (RAM) ユーザーを使用し、そのユーザーの AccessKey を作成することを推奨します。詳細については、「RAM ユーザーの作成」および「AccessKey の作成」をご参照ください。

  • Terraform でコマンドを実行するために使用する RAM ユーザーに、次のポリシーをアタッチします。このポリシーには、Terraform でコマンドを実行するために必要な最小限の権限が含まれています。詳細については、「RAM ユーザーへの権限付与」をご参照ください。

    このアクセスポリシーにより、RAM ユーザーは 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 のランタイム環境を準備します。次のいずれかの方法で Terraform を実行できます。

    • Terraform Explorer で Terraform を使用する:Alibaba Cloud は、インストール不要で使用できる Terraform のオンラインランタイム環境を提供しています。この方法は、無料で Terraform を迅速かつ便利にテストおよびデバッグしたい場合に適しています。

    • Cloud Shell:Cloud Shell には Terraform がプリインストールされており、認証情報も設定済みです。Cloud Shell で直接 Terraform コマンドを実行できます。この方法は、迅速、便利、かつ低コストで Terraform を使用する方法です。

    • Resource Orchestration Service (ROS) で Terraform を使用する:ROS は Terraform のマネージド機能を提供します。Terraform テンプレートを作成し、Alibaba Cloud、AWS、または Azure のリソースを定義し、リソースのパラメーターと依存関係を設定できます。

    • お使いのコンピューターに Terraform をインストールして設定する:この方法は、ネットワーク接続が悪い場合や、カスタム開発環境が必要な場合に適しています。

    重要

    Terraform のバージョンが 0.12.28 以降であることを確認してください。バージョンを確認するには、terraform --version コマンドを実行します。

使用されるリソース

説明

このトピックで使用される一部のリソースは従量課金制です。不要になったリソースは、予期しない課金を避けるために必ずリリースしてください。

コンソールからの Terraform リクエストパラメーターの生成

サンプルに必要な構成が含まれていない場合や、パラメーターの組み合わせが正しくない場合は、コンソールから必要なパラメーターを生成できます。そのためには、次の手順を実行します。

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

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

  3. 表示されるダイアログボックスで、作成するクラスターのタイプを選択し、[作成] をクリックしてから、[クラスター設定] ページでクラスターを設定します。

  4. 設定が完了したら、[確認] ページの右上隅にある [Console-to-Code] をクリックします。

  5. サイドバーで、[Terraform] タブをクリックします。クラスターの作成に必要なパラメーターが表示されます。これらのパラメーターをコピーして使用できます。

Terraform (Terway) を使用して ACK 専用クラスター を作成する

このセクションでは、Terway ネットワークコンポーネントを使用する ACK 専用クラスターを作成する方法について説明します。

  1. 作業ディレクトリを作成します。作業ディレクトリに、main.tf という名前の構成ファイルを作成します。次に、次のコードを 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_id が指定されていない場合、新しい VPC の CIDR ブロックを定義します。
    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 ブロックを指定する必要があります。
    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 用の既存の vSwitch ID を指定します。
    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 変数が指定されていない場合、このリソースは vpc_cidr 変数で指定された CIDR ブロックで新しい VPC を作成します。
    resource "alicloud_vpc" "vpc" {  
      count      = var.vpc_id == "" ? 1 : 0
      cidr_block = var.vpc_cidr
    }
    
    # vswitch_ids 変数が指定されていない場合、デフォルトで指定された vswitch_cidrs に基づいて新しい vSwitch が作成されます。
    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 変数が指定されていない場合、デフォルトで指定された vswitch_cidrs に基づいて Terway 用の vSwitch が作成されます。
    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]
    }
    
    # 現在の Alibaba Cloud ユーザーのリソースグループをクエリします。
    data "alicloud_resource_manager_resource_groups" "default" { 
      status = "OK"
    }
    
    # Alibaba Cloud 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、インスタンスタイプ、ディスク、パスワード、およびサービス 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)) # コントロールプレーンの vSwitch 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"        # サービス CIDR ブロック。
      load_balancer_spec    = "slb.s1.small"         # Server Load Balancer の仕様。
      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"                # オペレーティングシステムのプラットフォームタイプ。
      platform              = "AliyunLinux3"         # オペレーティングシステムのディストリビューション。
      cluster_domain        = "cluster.local"        # クラスターのローカルドメイン名。
      proxy_mode            = "ipvs"                 # kube-proxy のプロキシモード。
      custom_san            = "www.terraform.io"     # カスタム証明書 SAN。
      new_nat_gateway       = "true"                 # 新しい NAT Gateway を作成します。
      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 が初期化されたことを示します。

    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. 次のコマンドを実行して、ACK 専用クラスターを作成します。

    terraform apply

    プロンプトが表示されたら、yes と入力して [Enter] キーを押します。コマンドが完了するまで待ちます。次の出力は、ACK 専用クラスターが作成されたことを示します。

    ...
    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.
  5. 検証結果

    terraform show コマンドの実行

    次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。

    terraform show

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

    Container Service for Kubernetes コンソールにログインして、作成されたクラスターを表示します。

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

Terraform によって作成または管理されているリソースが不要になった場合は、次のコマンドを実行してそれらをリリースします。terraform destroy の詳細については、「一般的なコマンド」をご参照ください。

重要

`terraform destroy` コマンドは、作成されたすべてのリソースを破棄します。注意して実行してください。

terraform destroy

リソースのクリーンアッププロセス中に、プロンプトで yes と入力し、[Enter] キーを押します。コマンドが完了するまで待ちます。次の出力は、ACK 専用クラスターが削除されたことを示します。

...
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: 7 destroyed.

完全な例

説明

現在のサンプルコードは、ワンクリックで実行できます。ワンクリックで実行

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_id が指定されていない場合、新しい VPC の CIDR ブロックを定義します。
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 ブロックを指定する必要があります。
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 用の既存の vSwitch ID を指定します。
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 変数が指定されていない場合、このリソースは vpc_cidr 変数で指定された CIDR ブロックで新しい VPC を作成します。
resource "alicloud_vpc" "vpc" {  
  count      = var.vpc_id == "" ? 1 : 0
  cidr_block = var.vpc_cidr
}

# vswitch_ids 変数が指定されていない場合、デフォルトで指定された vswitch_cidrs に基づいて新しい vSwitch が作成されます。
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 変数が指定されていない場合、デフォルトで指定された vswitch_cidrs に基づいて Terway 用の vSwitch が作成されます。
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]
}

# 現在の Alibaba Cloud ユーザーのリソースグループをクエリします。
data "alicloud_resource_manager_resource_groups" "default" { 
  status = "OK"
}

# Alibaba Cloud 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、インスタンスタイプ、ディスク、パスワード、およびサービス 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)) # コントロールプレーンの vSwitch 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"        # サービス CIDR ブロック。
  load_balancer_spec    = "slb.s1.small"         # Server Load Balancer の仕様。
  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"                # オペレーティングシステムのプラットフォームタイプ。
  platform              = "AliyunLinux3"         # オペレーティングシステムのディストリビューション。
  cluster_domain        = "cluster.local"        # クラスターのローカルドメイン名。
  proxy_mode            = "ipvs"                 # kube-proxy のプロキシモード。
  custom_san            = "www.terraform.io"     # カスタム証明書 SAN。
  new_nat_gateway       = "true"                 # 新しい NAT Gateway を作成します。
  dynamic "addons" {
    for_each = var.cluster_addons
    content {
      name   = lookup(addons.value, "name", var.cluster_addons)
      config = lookup(addons.value, "config", var.cluster_addons)
    }
  }
}

関連ドキュメント