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

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

最終更新日:Nov 10, 2025

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

説明

このトピックのサンプルコードは、数回クリックするだけで実行できます。 詳細については、「 Terraform Explorer 」をご覧ください。

前提条件

  • 自動スケーリング機能は、Alibaba Cloud サービス Auto Scaling に依存しています。 したがって、ノードの自動スケーリングを有効にする前に、Auto Scaling をアクティブ化し、アカウントに Auto Scaling のデフォルトロールを割り当てる必要があります。 詳細については、「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 のランタイム環境は、次のいずれかの方法で準備します。

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

    • Cloud Shell で Terraform を使用する: Cloud Shell には Terraform がプリインストールされており、ID 認証情報が構成されています。 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. [ノードプール] ページで、[ノードプールの作成] をクリックします。 表示されるページで、パラメーターを構成し、[確認] をクリックします。 表示されるダイアログボックスで、左下隅にある [コンソールからコードへ] をクリックします。

  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)
    }
    
    // ポッド 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)) // ポッドの vSwitch。
      new_nat_gateway              = true                                                          // Kubernetes クラスターの作成時に NAT ゲートウェイを作成するかどうかを指定します。 デフォルト値: 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 サーバーのインターネット向け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

サンプルコード

説明

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

完全なコード

/* 前のコードブロックと同じなので、翻訳は省略 */

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