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

Container Service for Kubernetes:Terraform で自動スケーリングノードプールを作成する

最終更新日:Jun 17, 2026

alicloud_cs_kubernetes_node_poolscaling_config を設定すると、需要に応じて Container Service for Kubernetes (ACK) ノードを自動スケーリングできます。

Terraform Explorer でこれらのサンプルを実行できます。
警告

ここで作成したリソースには課金が発生します。完了後は terraform destroy で削除してください。

前提条件

次の条件を満たしていることを確認してください。

  • Auto Scaling がアクティブ化され、デフォルトのロールが割り当てられていること。

    以前に alicloud_cs_kubernetes_autoscaler コンポーネントを使用していた場合、Auto Scaling はすでにアクティブ化されています。
  • CloudOps Orchestration Service (OOS) へアクセスするための AliyunOOSLifecycleHook4CSRole ロールが作成されていること。

    1. AliyunOOSLifecycleHook4CSRole をクリックして、[RAM クイック承認] ページを開きます。

      説明
      • For Alibaba Cloud accounts: click the link directly.

      • For RAM users: your Alibaba Cloud account must have the AliyunOOSLifecycleHook4CSRole role assigned. Attach the AliyunRAMReadOnlyAccess policy to the RAM user. See Grant permissions to a RAM user.

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

  • 次のいずれかのオプションで設定された Terraform 実行環境。

    オプション 最適な用途
    Terraform Explorer ローカルインストール不要のクイックテスト
    Cloud Shell 認証情報が事前設定された Terraform
    ローカルマシン 不安定なネットワークまたはカスタム開発環境

背景情報

Alibaba Cloud プロバイダー 1.111.0 では、自動スケーリングノードプールを管理するための alicloud_cs_kubernetes_node_pool リソースが導入されました。これは、以下の 3 つの制限があった従来の alicloud_cs_kubernetes_autoscaler コンポーネントに代わるものです。

  • 運用オーバーヘッドが大きい複雑な設定

  • スケーリングされたノードがデフォルトのノードプールに追加され、個別に管理できないこと

  • 作成後に特定のパラメーターを変更できないこと

alicloud_cs_kubernetes_node_pool リソースは、これら 3 つの問題すべてに対処します。

  • 自動スケーリングに必要なパラメーターは、min_sizemax_size の 2 つのみです。

  • 各ノードプールは独立して管理され、ACK コンソールで表示可能です。

  • オプションのパラメーターは安全なデフォルト値を使用し、ノード間の環境ドリフトを防止します。

Terraform リソース

リソース 機能
alicloud_instance_types 指定された条件を満たす Elastic Compute Service (ECS) インスタンスタイプをクエリします
alicloud_vpc 仮想プライベートクラウド (VPC) を作成します
alicloud_vswitch VPC 内に vSwitch を作成します
alicloud_cs_managed_kubernetes ACK マネージドクラスターを作成します
alicloud_cs_kubernetes_node_pool ACK マネージドクラスター用のノードプールを作成します
リソース 目的
alicloud_instance_types 利用可能な ECS インスタンスタイプをクエリします
alicloud_vpc 仮想プライベートクラウド (VPC) を作成します
alicloud_vswitch VPC 内に vSwitch (サブネット) を作成します
alicloud_cs_managed_kubernetes ACK マネージドクラスターを作成します
alicloud_cs_kubernetes_node_pool 自動スケーリング機能を持つノードプールを作成します

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

これらのサンプルがお使いの設定に対応していない場合は、ACK コンソールから正確な Terraform パラメーターを生成できます。

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

  2. 対象のクラスターの名前をクリックします。左側のナビゲーションペインで、[ノード] > [ノードプール] を選択します。

  3. [ノードプールの作成] をクリックし、パラメーターを設定して [確認] をクリックします。ダイアログボックスで、[Console-to-Code] をクリックします。

  4. [Console-to-Code] パネルで、[Terraform] タブをクリックします。コードブロックには、ノードプールのパラメーターが表示されます。def60920129c15b1257006a07a2b4da4 をクリックして使用します。

自動スケーリングが有効なノードプールの作成

状況に応じて手順を選択してください。

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

alicloud_cs_kubernetes_node_pool に移行します。

ステップ 1:autoscaler-meta ConfigMap を変更する

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

  2. 対象のクラスターの名前をクリックします。左側のナビゲーションペインで、[構成] > [ConfigMap] を選択します。

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

  4. [編集] パネルの [値] テキストボックスで、taints の値を "taints":"" から "taints":[] に変更します。

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

ステップ 2:ノードプールを同期する

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

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

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

すべてのサンプルでは、scaling_config を使用してノード数の範囲を定義します。

既存クラスターへの自動スケーリングノードプールの追加

ACK クラスターがすでにある場合は、次の最小限の設定でノードプールを追加します。

provider "alicloud" {
}

# 既存の ACK クラスターに自動スケーリングノードプールを追加します。
resource "alicloud_cs_kubernetes_node_pool" "at1" {
  # 既存の ACK クラスターの ID。
  cluster_id     = ""
  name           = "np-test"
  # ノードプールに少なくとも 1 つの vSwitch を指定します。
  vswitch_ids    = ["vsw-bp1mdigyhmilu2h4v****"]
  instance_types = ["ecs.e3.medium"]
  password       = "Hello1234"

  scaling_config {
    min_size = 1  # 最小ノード数
    max_size = 5  # 最大ノード数
  }
}

クラスターと自動スケーリングノードプールの同時作成

1 回の terraform apply で、VPC、ACK Pro 版クラスター、および自動スケーリングノードプールをプロビジョニングします。

provider "alicloud" {
  region = var.region_id
}

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

variable "cluster_spec" {
  type        = string
  description = "クラスター仕様。空にすることもできます。有効な値:ack.standard:Standard マネージドクラスター、ack.pro.small:ACK Pro 版クラスター。"
  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-controller (Ingress)、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}"
}

# ワーカーノードとして使用する、8 vCPU と 32 GiB メモリを持つ 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 (Terway が Pod IP 割り当てに使用)。
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
  cluster_spec = var.cluster_spec  # ack.pro.small は ACK Pro 版クラスターを作成します。
  # vSwitch は availability_zone で指定されたゾーンに存在する必要があります。
  worker_vswitch_ids           = split(",", join(",", alicloud_vswitch.vswitches.*.id))
  pod_vswitch_ids              = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id))
  new_nat_gateway              = true   # クラスター用の NAT ゲートウェイを作成します。
  service_cidr                 = "10.11.0.0/16"  # VPC CIDR ブロックと重複しないようにします。最大 65,534 ホスト。
  slb_internet_enabled         = true   # API サーバー用のインターネット向け SLB インスタンスを作成します。
  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)
    }
  }
}

# 自動スケーリングが有効なノードプールを作成します。1 から 10 ノードの間でスケーリングします。
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            # ディスクサイズ (GiB)。
  }
}

ステップ 1: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.

ステップ 2:設定を適用する

terraform apply

ステップ 3:結果を確認する

apply が完了したら、ACK コンソールの [ノードプール] ページに移動します。新しいノードプールの名前の下に [自動スケーリング有効] が表示されます。

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

この設定で作成したすべてのリソースを削除します。

terraform destroy

terraform destroy については、「一般的なコマンド」をご参照ください。

次のステップ

参考