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

Container Service for Kubernetes:Terraform を使用して既存のクラスターを管理する

最終更新日:Nov 09, 2025

Terraform を使用すると、クラスターやノードプールなどの既存の Container Service for Kubernetes (ACK) リソースをインポートして管理できます。このトピックでは、Terraform を使用して既存の ACK マネージドクラスターを管理する方法について説明します。

前提条件

ACK マネージドクラスターが作成されています。クラスターには、2 つのノードで構成されるノードプールが含まれています。詳細については、「Terraform を使用して ACK マネージドクラスターを作成する」をご参照ください。

手順

  1. 作業ディレクトリを作成し、そのディレクトリに main.tf という名前の構成ファイルを作成します。

    provider "alicloud" {
    }
  2. 次のコマンドを実行して、Terraform の環境を初期化します。

    terraform init

    次の情報が返された場合、Terraform は初期化されています。

    Initializing the backend...
    
    Initializing provider plugins...
    - Checking for available provider plugins...
    - Downloading plugin for provider "alicloud" (hashicorp/alicloud) 1.90.1...
    ...
    
    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. クラスターをインポートします。

    1. クラスターリソースを main.tf ファイルに追加します。

      # ACK マネージドクラスター。
      resource "alicloud_cs_managed_kubernetes" "default" {
      }
    2. 次のコマンドを実行してクラスターをインポートします。

      <Cluster-ID> を、インポートするクラスターの ID に置き換えます。

      terraform import alicloud_cs_managed_kubernetes.default <Cluster-ID>

      期待される出力:

      alicloud_cs_managed_kubernetes.default: Importing from ID "cc7c582b0XXXXXcb80ae118eef0cb12"...
      alicloud_cs_managed_kubernetes.default: Import complete!
        Imported alicloud_cs_managed_kubernetes
      alicloud_cs_managed_kubernetes.default: Refreshing state... [id=cc7c582b0XXXXXcb80ae118eef0cb12]
      
      Import successful!
      
      The resources that were imported are shown above. These resources are now in
      your Terraform state and will henceforth be managed by Terraform.

      インポートされた次のクラスター情報が terraform.tfstate ファイルに表示されます。

      {
            "mode": "managed",
            "type": "alicloud_cs_managed_kubernetes",
            "name": "default",
            "provider": "provider.alicloud",
            "instances": [
              {
                "mode": "managed",
                "type": "alicloud_cs_managed_kubernetes",
                "name": "default",
                "provider": "provider.alicloud",
                "instances": [
                   ........
                ]
              }
            ]
          }
    3. terraform.tfstate ファイルの内容に基づいて、main.tf の必須フィールドを入力します。

      provider "alicloud" {
      }
      
      resource "alicloud_cs_managed_kubernetes" "default" {
        worker_vswitch_ids = [   # 必須フィールドを構成します。
          .....
        ]
      }
    4. 次のコマンドを実行してローカルリソースとクラスター内のリソースを比較し、main.tf ファイルがクラスターリソースと一致していることを確認します。

      terraform plan

      ステータスの更新を示す -> または新しいフィールドを示す + が付いた次の内容を main.tf ファイルに追加します。(known after apply) とラベル付けされたフィールドは無視できます。詳細については、「Only works for Create Operation」をご参照ください。

      alicloud_cs_managed_kubernetes.default: Refreshing state..
      erraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      -/+ destroy and then create replacement
      
      Terraform will perform the following actions:
      # 値が更新された次のフィールドを main.tf ファイルに追加します。
        # alicloud_cs_managed_kubernetes.default must be replaced
            ~ cluster_spec                 = "ack.pro.small" -> (known after apply)
            ~ connections                  = {
                - "api_server_internet" = ""
                - "api_server_intranet" = "https://10.XX.XX.154:6443"
                - "service_domain"      = "*.ca28e9fbefe8647d2a21057bcf5c993e0.cn-hangzhou.alicontainer.com"
              } -> (known after apply)
            - control_plane_log_components = [] -> null
            + control_plane_log_project    = (known after apply)
            + control_plane_log_ttl        = (known after apply)
              deletion_protection          = false
            - enable_rrsa                  = false -> null
            ~ id                           = "ca28e9fbeXXXXXX1057bcf5c993e0" -> (known after apply)
            + install_cloud_monitor        = (known after apply)
            + is_enterprise_security_group = (known after apply)
            + load_balancer_spec           = "slb.s1.small"
            ~ name                         = "TFCESHI" -> (known after apply)
            + name_prefix                  = "Terraform-Creation"  # クラスター名を Terraform-Creation に変更します。名前を変更したくない場合は、代わりに name フィールドを使用できます。
            ~ nat_gateway_id               = "ngw-bp17XXXXguwkeyj" -> (known after apply)
            + new_nat_gateway              = true
            ~ node_cidr_mask               = 26 -> 24 # 強制的に置き換え
            + node_port_range              = (known after apply)
            + platform                     = (known after apply)
            - pod_cidr                     = "172.16.224.0/20" -> null # 強制的に置き換え
              proxy_mode                   = "ipvs"
            ~ resource_group_id            = "rg-acfmwXXXXesq" -> (known after apply)
            ~ rrsa_metadata                = [
                - {
                    - enabled                = false
                    - ram_oidc_provider_arn  = ""
                    - ram_oidc_provider_name = ""
                    - rrsa_oidc_issuer_url   = ""
                  },
              ] -> (known after apply)
            ~ security_group_id            = "sg-bp11XXXXXX9d8rp3" -> (known after apply)
            - service_cidr                 = "192.168.0.0/16" -> null # 強制的に置き換え
            ~ slb_id                       = "lb-bp1dqXXXXXXeifbb3" -> (known after apply)
            + slb_internet                 = (known after apply)
            + slb_internet_enabled         = true
            ~ slb_intranet                 = "10.XX.XXX.154" -> (known after apply)
            - tags                         = {} -> null
            - timezone                     = "Asia/Shanghai" -> null # 強制的に置き換え
            ~ version                      = "1.31.1-aliyun.1" -> (known after apply)
            ~ vpc_id                       = "vpc-bp1l44aXXXXXXc54ev" -> (known after apply)
            + worker_auto_renew_period     = (known after apply)
            + worker_disk_size             = (known after apply)
            + worker_instance_charge_type  = (known after apply)
            + worker_period                = (known after apply)
            + worker_period_unit           = (known after apply)
            ~ worker_ram_role_name         = "KubernetesWorkerRole-04d86599-xxxx-487a-b927-379e63b9d485" -> (known after apply)
              worker_vswitch_ids           = [
                  "vsw-bp1fXXXXX2nuig6h",
              ]
      
            ~ maintenance_window {
                ~ duration         = "3h" -> (known after apply)
                ~ enable           = true -> (known after apply)
                ~ maintenance_time = "2024-10-22T16:00:00.000Z" -> (known after apply)
                ~ weekly_period    = "Wednesday" -> (known after apply)
              }
      
            + operation_policy {
                + cluster_auto_upgrade {
                    + channel = (known after apply)
                    + enabled = (known after apply)
                  }
              }
      
            - timeouts {}
      
            + worker_nodes {
                + id         = (known after apply)
                + name       = (known after apply)
                + private_ip = (known after apply)
              }
          }
      
      Plan: 1 to add, 0 to change, 1 to destroy.
      説明

      リソーステンプレートがリソースステータスと一致するようにするには、terraform plan を実行しても変更が表示されなくなるまで、不足しているパラメーター定義を手動でテンプレートに追加する必要があります。

      provider "alicloud" {
        region = "cn-hangzhou" # クラスターが存在するリージョン。
      }
      
      resource "alicloud_cs_managed_kubernetes" "default" {
        worker_vswitch_ids           = [
                  "vsw-bp1fXXXXX2nuig6h"
              ]
        deletion_protection          = false
        load_balancer_spec           = "slb.s1.small"
        name                         = "TFCESHI"
        new_nat_gateway              = true
        proxy_mode                   = "ipvs"
        slb_internet_enabled         = true
        node_cidr_mask               = 26
        service_cidr                 = "192.168.0.0/16"
        pod_cidr                     = "172.16.224.0/20"
        control_plane_log_components = []
        enable_rrsa                  = false
        tags                         = {}
        timezone                     = "Asia/Shanghai"
      }
    5. 次のコマンドを実行して、先行するフィールドをクラスターにインポートします。

      terraform apply

      フィールドがインポートされると、次の情報が返されます。

      alicloud_cs_managed_kubernetes.default: Modifying... [id=cc7c582b0XXXXXcb80ae118eef0cb12]
      alicloud_cs_managed_kubernetes.default: Modifications complete after 2s [id=cc7c582b0XXXXXcb80ae118eef0cb12]
      
      Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
  4. ノードプールをインポートします。

    1. クラスターのノードリソースを main.tf ファイルに追加します。

      # ACK マネージドクラスター。
      resource "alicloud_cs_kubernetes_node_pool" "default" {
      }
    2. 次のコマンドを実行して、ノードプールをインポートします。

      <Cluster-ID> を前のステップで指定したクラスター ID に置き換えます。<Nodepool-ID> をインポートするノードプールの ID に置き換えます。クラスター ID とノードプール ID はコロン (:) で区切ります。

      terraform import alicloud_cs_kubernetes_node_pool.default <Cluster-ID>:<Nodepool-ID>

      期待される出力:

      alicloud_cs_kubernetes_node_pool.default: Importing from ID "cc7c582b0XXXXXcb80ae118eef0cb12*:np0f8f219XXXXX5d4aa503c3d24ca****"...
      alicloud_cs_kubernetes_node_pool.default: Import complete!
        Imported alicloud_cs_kubernetes_node_pool
      alicloud_cs_kubernetes_node_pool.default: Refreshing state... [id=cc7c582b0XXXXXcb80ae118eef0cb12:np651662XXXXXd9979360b24b1a009]
      
      Import successful!
      
      The resources that were imported are shown above. These resources are now in
      your Terraform state and will henceforth be managed by Terraform.

      インポートされた次のノードプール情報が terraform.tfstate ファイルに含まれています。

      .....
      "resources": [
          {
            "mode": "managed",
            "type": "alicloud_cs_kubernetes_node_pool",
            "name": "default",
            "provider": "provider.alicloud",
            "instances": [
              .....
            ]
          }
        ]
    3. terraform.tfstate ファイルの内容に基づいて、main.tf の必須フィールドを入力します。

      provider "alicloud" {
      }
      
      # ノードプール。
      resource "alicloud_cs_kubernetes_node_pool" "default" {
        name           =  ....  # ノードプールの名前。
        instance_types =  ....  # ノードプールのインスタンスタイプ。
        vswitch_ids    =  ....  # ノードプールの vSwitch ID。
        cluster_id     = alicloud_cs_managed_kubernetes.default.id # cluster_id を使用
      }
    4. 次のコマンドを実行して、先行するフィールドをクラスターにインポートします。

      terraform apply

      フィールドがインポートされると、次の情報が返されます。

      alicloud_cs_kubernetes_node_pool.default: Refreshing state... [id=cc7c5XXXXX6dcb80ae118eef0cb12:np651662XXXXXd9979360b24b1a009]
      alicloud_cs_managed_kubernetes.default: Refreshing state... [id=cc7c582XXXXX6dcb80ae118eef0cb12]
      
      Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
        ~ update in-place
      
      Terraform will perform the following actions:
      
        ............
      
      
              # (2 unchanged blocks hidden)
          }
      Plan: 0 to add, 1 to change, 0 to destroy.

    クラスターがインポートされた後、main.tf ファイルを使用してクラスターまたはノードプールを管理できます。

  5. ノードプールのスケールアウト操作を検証します。

    1. main.tf を使用してノードプールのスケールアウト操作を検証します。

      たとえば、インポートされたノードプールを 3 つのノードにスケールアウトするには、desired_size = 3 フィールドを main.tf ファイルに追加します。

      ......
      
      # ACK マネージドクラスター。
      resource "alicloud_cs_kubernetes_node_pool" "default" {
        .....
        # ノードプール内のノードの期待数は 3 です。
        desired_size = 3
      }
      
      .....
    2. 次のコマンドを実行して変更を適用します。

      terraform apply

      返された情報で、yes と入力し、[Enter] を押して、変更が完了するのを待ちます。

      alicloud_cs_kubernetes_node_pool.default: Refreshing state... [id=cc7c5XXXXX546dcb80ae118eef0cb12:np651662dfc3e4440d9979360b24b1a009]
      alicloud_cs_managed_kubernetes.default: Refreshing state... [id=cc7c582bXXXXXcb80ae118eef0cb12]
      
      Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
        ~ update in-place
      
      Terraform will perform the following actions:
      
        # alicloud_cs_kubernetes_node_pool.default will be updated in-place
        ~ resource "alicloud_cs_kubernetes_node_pool" "default" {
            ~ desired_size               = 2 -> 3
              # (2 unchanged blocks hidden)
          }
      
      Plan: 0 to add, 1 to change, 0 to destroy.
      
      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_kubernetes_node_pool.default: Modifying... [id=cc7c582b0XXXXXcb80ae118eef0cb12:np651662dfc3e4XXXXX360b24b1a009]
      alicloud_cs_kubernetes_node_pool.default: Still modifying... [id=cc7c582XXXXX6dcb80ae118eef0cb12:np651662dXXXXX0d9979360b24b1a009, 10s elapsed]
      alicloud_cs_kubernetes_node_pool.default: Still modifying... [id=cc7c582bXXXXX6dcb80ae118eef0cb12:np651662XXXXX0d9979360b24b1a009, 20s elapsed]
      alicloud_cs_kubernetes_node_pool.default: Still modifying... [id=cc7c582bXXXXXdcb80ae118eef0cb12:np65166XXXXX440d9979360b24b1a009, 30s elapsed]
      alicloud_cs_kubernetes_node_pool.default: Still modifying... [id=cc7c582b0XXXXXae118eef0cb12:np6516XXXXX3e4440d9979360b24b1a009, 40s elapsed]
      alicloud_cs_kubernetes_node_pool.default: Still modifying... [id=cc7c582b0XXXXX6dcb80ae118eef0cb12:np65166XXXXXe4440d9979360b24b1a009, 50s elapsed]
      alicloud_cs_kubernetes_node_pool.default: Modifications complete after 1m0s [id=cc7c582b0b2b546dcb80ae118eef0cb12:np651662dfc3e4440d9979360b24b1a009]
      
      Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

    ACK コンソールにログインし、[ノードプール] ページに移動して、ノードがノードプールに追加されたことを確認できます。

参考