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

Container Service for Kubernetes:Terraform を使用してオートスケーリングが有効なノードプールを作成する

最終更新日:Nov 09, 2025

デフォルトでは、Container Service for Kubernetes (ACK) のノードプールおよびマネージドノードプールのノードは、自動的にスケールインまたはスケールアウトできません。Terraform を使用して、オートスケーリングが有効なノードプールを作成できます。このトピックでは、Terraform を使用してオートスケーリングが有効なノードプールを作成する方法について説明します。

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。Terraform Explorer で実行

前提条件

  • オートスケーリング機能は、Alibaba Cloud サービスの Auto Scaling に依存します。ノードのオートスケーリング機能を有効にする前に、Auto Scaling をアクティブ化し、デフォルトの ESS ロールを ACK に割り当てる必要があります。詳細については、「Auto Scaling をアクティブ化する」をご参照ください。

    説明

    alicloud_cs_kubernetes_autoscaler コンポーネントを使用したことがある場合、Auto Scaling はアクティブ化されています。

  • CloudOps Orchestration Service (OOS) にアクセスするための権限が付与されています。次の手順を実行して、OOS アクセス権限を提供する AliyunOOSLifecycleHook4CSRole ロールを作成できます。

    1. AliyunOOSLifecycleHook4CSRole をクリックします。

      説明
      • 現在のアカウントが Alibaba Cloud アカウントの場合は、AliyunOOSLifecycleHook4CSRole をクリックします。

      • 現在のアカウントが RAM ユーザーの場合は、Alibaba Cloud アカウントに AliyunOOSLifecycleHook4CSRole ロールが割り当てられていることを確認してください。次に、AliyunRAMReadOnlyAccess ポリシーを RAM ユーザーにアタッチします。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

    2. [RAM クイック承認] ページで、[承認] をクリックします。

  • Terraform のランタイム環境は、次のいずれかの方法で準備されます。

    • Explorer: Alibaba Cloud は Terraform のオンラインランタイム環境を提供します。環境にログインして、インストールせずに Terraform を使用できます。低コストで効率的かつ便利な方法で Terraform を使用およびデバッグする必要があるシナリオに適しています。

    • Cloud Shell: Cloud Shell には Terraform がプリインストールされており、認証情報が設定されています。Cloud Shell で Terraform コマンドを実行できます。低コストで効率的かつ便利な方法で Terraform を使用およびアクセスする必要があるシナリオに適しています。

    • オンプレミスマシンに Terraform をインストールして設定する: ネットワーク接続が不安定な場合や、カスタム開発環境が必要なシナリオに適しています。

背景情報

Terraform は、Terraform プロバイダーを通じて新しいインフラストラクチャをサポートするオープンソースツールです。Terraform を使用して、クラウドインフラストラクチャとリソースをプレビュー、設定、管理できます。詳細については、「Terraform とは」をご参照ください。

Alibaba Cloud Provider の以前のバージョンでは、ACK は alicloud_cs_kubernetes_autoscaler という名前のコンポーネントを提供します。alicloud_cs_kubernetes_autoscaler コンポーネントを使用して、ノードのオートスケーリングを有効にできます。ただし、次の制限が適用されます。

  • 構成が複雑で、コストが高くなります。

  • スケーリングされる各ノードはデフォルトのノードプールに追加され、個別に維持することはできません。

  • 一部のパラメーターは変更できません。

Alibaba Cloud Provider 1.111.0 以降では、alicloud_cs_kubernetes_node_pool コンポーネントを使用して、オートスケーリングが有効なノードプールを作成できます。このコンポーネントには次の利点があります。

  • シンプルなスケーリング設定を提供します。スケーリンググループ内のノード数の下限と上限を設定するだけです。

  • オプションのパラメーターにデフォルト設定を使用して、ノード間の環境の不整合を防ぎます。これにより、ユーザーエラーが防止されます。たとえば、ノードごとに異なる OS イメージを設定する場合があります。

  • ACK コンソールでノードプール内のノードの変更を明示的に表示できます。

リソース

説明

特定のリソースに対して課金されます。リソースが不要になった場合は、できるだけ早くリソースをリリースまたはサブスクライブ解除してください。

ACK コンソールを使用して Terraform リクエストパラメーターを生成する

リクエストパラメーターが正しくない場合、または必要な構成が以下の例に含まれていない場合は、ACK コンソールを使用してノードプールを作成するために必要なリクエストパラメーターを生成できます。画面録画をストリーミングするには、次の手順を実行します。

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

  2. クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. [ノードプールの作成] ページで、パラメーターを設定し、[確認] をクリックします。表示されるダイアログボックスで、左下隅にある [Console-to-Code] をクリックします。

  4. [Terraform] タブでは、コードブロックにノードプール作成に必要なパラメーターセットが表示されます。右上隅の def60920129c15b1257006a07a2b4da4 をクリックしてコピーします。

Terraform を使用してオートスケーリングが有効なノードプールを作成する

以前に alicloud_cs_kubernetes_autoscaler を使用した場合

alicloud_cs_kubernetes_autoscaler コンポーネントを使用したことがある場合は、クラスターに Auto Scaling へのアクセスを承認し、次の手順を実行して alicloud_cs_kubernetes_node_pool コンポーネントに切り替えます。その後、クラスターにオートスケーリングが有効なノードプールを作成できます。

  1. autoscaler-meta ConfigMap を変更します。

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

    2. クラスター ページで、変更するクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[設定] > [ConfigMap] を選択します。

    3. [ConfigMap] ページの左上隅で、[名前空間] ドロップダウンリストから [Kube-system] を選択します。autoscaler-meta ConfigMap を見つけ、[アクション] 列の [編集] をクリックします。

    4. [編集] パネルで、[autoscaler-meta] ConfigMap の値を変更します。

      taints 値のデータ型を文字列から配列に変更する必要があります。[値] テキストボックスで、"taints":"""taints":[] に変更します。

    5. [OK] をクリックします。

  2. ノードプールを同期します。

    1. 詳細ページの左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

    2. [ノードプール] ページの右上隅で、[ノードプールの同期] をクリックします。

以前に alicloud_cs_kubernetes_autoscaler を使用していない場合

Terraform を使用して、オートスケーリングが有効なノードプールを作成できます。

  1. ノードプールの構成ファイルを作成します。

    既存の ACK クラスターでオートスケーリングが有効なノードプールを作成する

    次のコードは、既存の ACK クラスターでオートスケーリングが有効なノードプールを作成する方法の例を示しています。

    provider "alicloud" {
    }
    # 既存の ACK クラスターでオートスケーリングが有効なノードプールを作成します。
    resource "alicloud_cs_kubernetes_node_pool" "at1" {
      # ノードプールを作成する ACK クラスターの ID。
      cluster_id           = ""
      name                 = "np-test"
      # ノードプール内のノードが使用する vSwitch。少なくとも 1 つの vSwitch を指定する必要があります。
      vswitch_ids          = ["vsw-bp1mdigyhmilu2h4v****"]
      instance_types       = ["ecs.e3.medium"]
      password             = "Hello1234"
     
      scaling_config {
        # ノードプール内のノードの最小数。
        min_size     = 1
        # ノードプール内のノードの最大数。
        max_size     = 5
      }
    
    }

    オートスケーリングが有効なノードプールを作成する

    次のコードは、オートスケーリングが有効なノードプールを含むクラスターを作成する方法の例を示しています。

    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 の作成に使用される 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 = "ワーカーノードの起動に使用される ECS インスタンスタイプ。"
      default     = ["ecs.g6.2xlarge", "ecs.g6.xlarge"]
    }
    
    # ワーカーノードのパスワードを指定します。
    variable "password" {
      description = "ECS インスタンスのパスワード。"
      default     = "Test123456"
    }
    
    # ACK マネージドクラスターの名前のプレフィックスを指定します。
    variable "k8s_name_prefix" {
      description = "マネージド Kubernetes クラスターの作成に使用される名前のプレフィックス。"
      default     = "tf-ack-shenzhen"
    }
    
    # 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\"}",
        },
        {
          "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" = "",
        }
      ]
    }
    
    # デフォルトのリソース名。
    locals {
      k8s_name_terway = "k8s_name_terway_${random_integer.default.result}"
      vpc_name = "vpc_name_${random_integer.default.result}"
      autoscale_nodepool_name = "autoscale-node-pool-${random_integer.default.result}"
    }
    
    # ワーカーノードの ECS インスタンス仕様。Terraform は、CPU とメモリのリクエストを満たす ECS インスタンスタイプを検索します。
    data "alicloud_instance_types" "default" {
      cpu_core_count       = 8
      memory_size          = 32
      availability_zone    = var.availability_zone[0]
      kubernetes_node_role = "Worker"
    }
    
    resource "random_integer" "default" {
      min = 10000
      max = 99999
    }
    
    # VPC。
    resource "alicloud_vpc" "default" {
      vpc_name   = local.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)
    }
    
    # Pod 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)
    }
    
    # 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)) # Pod が使用する vSwitch。
      new_nat_gateway              = true                                                          # ACK クラスターの作成時に NAT ゲートウェイを作成するかどうかを指定します。デフォルト値: true。
      service_cidr                 = "10.11.0.0/16"                                                # Pod の CIDR ブロック。cluster_network_type パラメーターを flannel に設定した場合、このパラメーターは必須です。Pod の CIDR ブロックは、VPC の CIDR ブロックや VPC 内の他の Kubernetes クラスターの CIDR ブロックと同じにすることはできません。クラスターの作成後に Pod の 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)
        }
      }
    }
    
    # オートスケーリングが有効なノードプールを作成します。ノードプールは最大 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
      password              = var.password # SSH を使用してクラスターにログインするためのパスワード。
      install_cloud_monitor = true         # クラスター内のノードに 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 は初期化されています。

    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 apply コマンドを実行してノードプールを作成します。

  4. 検証結果。

    ノードプールが作成された後、ノードプールページでノードプールを見つけることができます。ノードプールの名前の下に [オートスケーリング有効] が表示されます。

リソースのクリア

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

terraform destroy

サンプルコード

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。

完全なコード

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 の作成に使用される 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 = "ワーカーノードの起動に使用される ECS インスタンスタイプ。"
  default     = ["ecs.g6.2xlarge", "ecs.g6.xlarge"]
}

# ワーカーノードのパスワードを指定します。
variable "password" {
  description = "ECS インスタンスのパスワード。"
  default     = "Test123456"
}

# ACK マネージドクラスターの名前のプレフィックスを指定します。
variable "k8s_name_prefix" {
  description = "マネージド Kubernetes クラスターの作成に使用される名前のプレフィックス。"
  default     = "tf-ack-shenzhen"
}

# 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\"}",
    },
    {
      "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" = "",
    }
  ]
}

# デフォルトのリソース名。
locals {
  k8s_name_terway = "k8s_name_terway_${random_integer.default.result}"
  vpc_name = "vpc_name_${random_integer.default.result}"
  autoscale_nodepool_name = "autoscale-node-pool-${random_integer.default.result}"
}

# ワーカーノードの ECS インスタンス仕様。Terraform は、CPU とメモリのリクエストを満たす ECS インスタンスタイプを検索します。
data "alicloud_instance_types" "default" {
  cpu_core_count       = 8
  memory_size          = 32
  availability_zone    = var.availability_zone[0]
  kubernetes_node_role = "Worker"
}

resource "random_integer" "default" {
  min = 10000
  max = 99999
}

# VPC。
resource "alicloud_vpc" "default" {
  vpc_name   = local.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)
}

# Pod 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)
}

# 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)) # Pod が使用する vSwitch。
  new_nat_gateway              = true                                                          # ACK クラスターの作成時に NAT ゲートウェイを作成するかどうかを指定します。デフォルト値: true。
  service_cidr                 = "10.11.0.0/16"                                                # Pod の CIDR ブロック。cluster_network_type パラメーターを flannel に設定した場合、このパラメーターは必須です。Pod の CIDR ブロックは、VPC の CIDR ブロックや VPC 内の他の Kubernetes クラスターの CIDR ブロックと同じにすることはできません。クラスターの作成後に Pod の 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)
    }
  }
}

# オートスケーリングが有効なノードプールを作成します。ノードプールは最大 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
  password              = var.password # SSH を使用してクラスターにログインするためのパスワード。
  install_cloud_monitor = true         # クラスター内のノードに CloudMonitor エージェントをインストールするかどうかを指定します。
  system_disk_category  = "cloud_efficiency"
  system_disk_size      = 100
  image_type            = "AliyunLinux3"

  data_disks {              # ノードのデータディスク構成。
    category = "cloud_essd" # ディスクタイプ。
    size     = 120          # ディスクサイズ。
  }
}

より完全な例を表示したい場合は、Landing with Terraform ページの対応するサービスのディレクトリにアクセスしてください。