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

Container Service for Kubernetes:Terraform を使用して ACK マネージドクラスターを作成する

最終更新日:Nov 12, 2025

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

説明

このトピックのサンプルコードはワンクリックで実行できます。今すぐ実行

前提条件

  • Container Service for Kubernetes (ACK) が有効化されていること。Terraform を使用して ACK を有効化する方法の詳細については、「Terraform を使用して ACK を有効化し、ACK にサービスロールを割り当てる」をご参照ください。

  • ログインしている Resource Access Management (RAM) ユーザー用に AccessKey ペアが作成されていること。

    説明

    デフォルトでは、Alibaba Cloud アカウントは、このアカウントに属するすべてのリソースに対する完全な権限を持っています。RAM アカウントを使用することをお勧めします。RAM アカウントはリソース権限が制限されているため、認証情報が漏洩した場合の潜在的なセキュリティリスクを最小限に抑えることができます。

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

    このアクセスポリシーにより、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"
          ],
          "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 v0.12.28 以降を使用していることを確認してください。現在のバージョンを確認するには、terraform --version コマンドを実行します。

使用されるリソース

説明

この例の一部のリソースには料金が発生します。不要になったらリリースして、課金を避けてください。

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

サンプルに必要な設定が含まれていない場合、またはパラメーターの組み合わせが正しくない場合は、コンソールから必要なパラメーターを生成できます。これを行うには、次のステップを実行します:

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

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

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

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

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

Terraform を使用して ACK マネージドクラスター (Terway) を作成する

この例では、通常のノードプール、マネージドノードプール、および自動スケーリングノードプールを含む ACK マネージドクラスターを作成します。デフォルトでは、Terway (ネットワークコンポーネント)、csi-plugin (ストレージコンポーネント)、csi-provisioner (ストレージコンポーネント)、ログ収集コンポーネント、Nginx Ingress Controller、ack-arms-prometheus (モニタリングコンポーネント)、ack-node-problem-detector (ノード診断コンポーネント) など、一連ののコンポーネントがクラスターにインストールされます。

  1. 作業ディレクトリを作成します。作業ディレクトリに、main.tf という名前の設定ファイルを作成します。次のコードを main.tf ファイルにコピーします。

    provider "alicloud" {
      region = var.region_id
    }
    
    variable "region_id" {
      type    = string
      default = "cn-shenzhen"
    }
    
    variable "cluster_spec" {
      type        = string
      description = "Kubernetes クラスターのクラスター仕様。空にすることができます。有効な値: ack.standard : 標準マネージドクラスター; ack.pro.small : プロフェッショナルマネージドクラスター。"
      default     = "ack.pro.small"
    }
    
    # vSwitch のゾーン。
    variable "availability_zone" {
      description = "vSwitch のアベイラビリティゾーン。"
      default     = ["cn-shenzhen-c", "cn-shenzhen-e", "cn-shenzhen-f"]
    }
    
    # vSwitch ID のリスト。
    variable "node_vswitch_ids" {
      description = "Terway の既存のノード vSwitch ID のリスト。"
      type        = list(string)
      default     = []
    }
    
    # 新しい vSwitch を作成するための CIDR ブロックのリスト。
    variable "node_vswitch_cidrs" {
      description = "'node_vswitch_ids' が指定されていない場合に、いくつかの新しい vSwitch を作成するために使用される CIDR ブロックのリスト。"
      type        = list(string)
      default     = ["172.16.0.0/23", "172.16.2.0/23", "172.16.4.0/23"]
    }
    
    # Terway ネットワークコンポーネントの設定。これが空の場合、デフォルトで terway_vswitch_cidrs に基づいて新しい Terway vSwitch が作成されます。
    variable "terway_vswitch_ids" {
      description = "Terway の既存の Pod vSwitch ID のリスト。"
      type        = list(string)
      default     = []
    }
    
    # terway_vswitch_ids が指定されていない場合に Terway 用の vSwitch を作成するための CIDR ブロック。
    variable "terway_vswitch_cidrs" {
      description = "'terway_vswitch_ids' が指定されていない場合に、いくつかの新しい vSwitch を作成するために使用される CIDR ブロックのリスト。"
      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 = "ワーカーノードの起動に使用される ECS インスタンスタイプ。"
      default     = ["ecs.g6.2xlarge", "ecs.g6.xlarge"]
    }
    
    # ACK クラスターにインストールするコンポーネント。これらには、Terway (ネットワークコンポーネント)、csi-plugin (ストレージコンポーネント)、csi-provisioner (ストレージコンポーネント)、loongcollector (ログコンポーネント)、Nginx Ingress Controller、ack-arms-prometheus (モニタリングコンポーネント)、および ack-node-problem-detector (ノード診断コンポーネント) が含まれます。
    variable "cluster_addons" {
      type = list(object({
        name   = string
        config = string
      }))
      default = [
        {
          "name"   = "terway-eniip",
          "config" = "",
        },
        {
          "name"   = "loongcollector",
          "config" = "{\"IngressDashboardEnabled\":\"true\"}",
        },
        {
          "name"   = "nginx-ingress-controller",
          "config" = "{\"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 = "マネージド Kubernetes クラスターの作成に使用される名前のプレフィックス。"
      default     = "tf-ack-shenzhen"
    }
    
    # デフォルトのリソース名。
    locals {
      k8s_name_terway         = substr(join("-", [var.k8s_name_prefix, "terway"]), 0, 63)
      k8s_name_flannel        = substr(join("-", [var.k8s_name_prefix, "flannel"]), 0, 63)
      k8s_name_ask            = substr(join("-", [var.k8s_name_prefix, "ask"]), 0, 63)
      new_vpc_name            = "tf-vpc-172-16"
      new_vsw_name_azD        = "tf-vswitch-azD-172-16-0"
      new_vsw_name_azE        = "tf-vswitch-azE-172-16-2"
      new_vsw_name_azF        = "tf-vswitch-azF-172-16-4"
      nodepool_name           = "default-nodepool"
      managed_nodepool_name   = "managed-node-pool"
      autoscale_nodepool_name = "autoscale-node-pool"
      log_project_name        = "log-for-${local.k8s_name_terway}"
    }
    
    # ノードの ECS インスタンス設定。CPU とメモリの要件を満たす ECS インスタンスタイプを照会します。
    data "alicloud_instance_types" "default" {
      cpu_core_count       = 8
      memory_size          = 32
      availability_zone    = var.availability_zone[0]
      kubernetes_node_role = "Worker"
    }
    
    # VPC。
    resource "alicloud_vpc" "default" {
      vpc_name   = local.new_vpc_name
      cidr_block = "172.16.0.0/12"
    }
    
    # ノード vSwitch。
    resource "alicloud_vswitch" "vswitches" {
      count      = length(var.node_vswitch_ids) > 0 ? 0 : 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)
    }
    
    # Pod vSwitch。
    resource "alicloud_vswitch" "terway_vswitches" {
      count      = length(var.terway_vswitch_ids) > 0 ? 0 : 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)
    }
    
    # ACK マネージドクラスター。
    resource "alicloud_cs_managed_kubernetes" "default" {
      name                         = local.k8s_name_terway                                         # Kubernetes クラスターの名前。
      cluster_spec                 = var.cluster_spec                                              # Pro 版クラスターを作成します。
      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)) # Pod vSwitch。
      new_nat_gateway              = true                                                          # Kubernetes クラスターの作成時に新しい NAT Gateway を作成するかどうかを指定します。デフォルト値: true。
      service_cidr                 = "10.11.0.0/16"                                                # サービス CIDR ブロック。このパラメーターは、cluster_network_type が flannel に設定されている場合に必須です。サービス CIDR ブロックは、VPC CIDR ブロックまたは VPC 内の他の Kubernetes クラスターの CIDR ブロックと同じにすることはできません。クラスターの作成後にサービス CIDR ブロックを変更することはできません。クラスター内のホストの最大数は 256 です。
      slb_internet_enabled         = true                                                          # API サーバー用にインターネット向け Server Load Balancer インスタンスを作成するかどうかを指定します。デフォルト値: 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              # Kubernetes クラスターの名前。
      node_pool_name        = local.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"
      desired_size          = 2            # ノードプール内のノードの期待数。
      install_cloud_monitor = true         # Kubernetes ノードに CloudMonitor をインストールするかどうかを指定します。
      system_disk_category  = "cloud_efficiency"
      system_disk_size      = 100
      image_type            = "AliyunLinux"
      data_disks {              # ノードのデータディスク設定。
        category = "cloud_essd" # データディスクのカテゴリ。
        size     = 120          # データディスクのサイズ。
      }
    }
    
    # マネージドノードプールを作成します。
    resource "alicloud_cs_kubernetes_node_pool" "managed_node_pool" {
      cluster_id     = alicloud_cs_managed_kubernetes.default.id              # Kubernetes クラスターの名前。
      node_pool_name = local.managed_nodepool_name                            # ノードプールの名前。
      vswitch_ids    = split(",", join(",", alicloud_vswitch.vswitches.*.id)) # ノードプールの vSwitch。1 つ以上の vSwitch ID を指定します。vSwitch は availability_zone で指定されたゾーンにある必要があります。
      desired_size   = 0                                                      # ノードプール内のノードの期待数。
      management {
        auto_repair     = true
        auto_upgrade    = true
        max_unavailable = 1
      }
      instance_types        = var.worker_instance_types
      instance_charge_type  = "PostPaid"
      install_cloud_monitor = true
      system_disk_category  = "cloud_efficiency"
      system_disk_size      = 100
      image_type            = "AliyunLinux"
      data_disks {
        category = "cloud_essd"
        size     = 120
      }
    }
    
    # 自動スケーリングノードプールを作成します。ノードプールは最大 10 ノードまでスケールアウトでき、少なくとも 1 ノードを維持する必要があります。
    resource "alicloud_cs_kubernetes_node_pool" "autoscale_node_pool" {
      cluster_id     = alicloud_cs_managed_kubernetes.default.id
      node_pool_name = local.autoscale_nodepool_name
      vswitch_ids    = split(",", join(",", alicloud_vswitch.vswitches.*.id))
      scaling_config {
        min_size = 1
        max_size = 10
      }
      instance_types        = var.worker_instance_types
      install_cloud_monitor = true         # Kubernetes ノードに CloudMonitor をインストールするかどうかを指定します。
      system_disk_category  = "cloud_efficiency"
      system_disk_size      = 100
      image_type            = "AliyunLinux3"
      data_disks {              # ノードのデータディスク設定。
        category = "cloud_essd" # データディスクのカテゴリ。
        size     = 120          # データディスクのサイズ。
      }
    }
  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
  4. 次のコマンドを実行してクラスターを作成します。

    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 5m48s [id=ccb53e72ec6c447c990762800********]
    ...
    
    Apply complete! Resources: 11 added, 0 changed, 0 destroyed.
  5. 検証結果

    terraform show コマンドの実行

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

    terraform show

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

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

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

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

terraform destroy