Terraform を使用すると、クラスターやノードプールなどの既存の Container Service for Kubernetes (ACK) リソースをインポートして管理できます。このトピックでは、Terraform を使用して既存の ACK マネージドクラスターを管理する方法について説明します。
前提条件
ACK マネージドクラスターが作成されています。クラスターには、2 つのノードで構成されるノードプールが含まれています。詳細については、「Terraform を使用して ACK マネージドクラスターを作成する」をご参照ください。
手順
作業ディレクトリを作成し、そのディレクトリに main.tf という名前の構成ファイルを作成します。
provider "alicloud" { }次のコマンドを実行して、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.クラスターをインポートします。
クラスターリソースを main.tf ファイルに追加します。
# ACK マネージドクラスター。 resource "alicloud_cs_managed_kubernetes" "default" { }次のコマンドを実行してクラスターをインポートします。
<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": [ ........ ] } ] }terraform.tfstate ファイルの内容に基づいて、main.tf の必須フィールドを入力します。
provider "alicloud" { } resource "alicloud_cs_managed_kubernetes" "default" { worker_vswitch_ids = [ # 必須フィールドを構成します。 ..... ] }次のコマンドを実行してローカルリソースとクラスター内のリソースを比較し、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" }次のコマンドを実行して、先行するフィールドをクラスターにインポートします。
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.
ノードプールをインポートします。
クラスターのノードリソースを
main.tfファイルに追加します。# ACK マネージドクラスター。 resource "alicloud_cs_kubernetes_node_pool" "default" { }次のコマンドを実行して、ノードプールをインポートします。
<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": [ ..... ] } ]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 を使用 }次のコマンドを実行して、先行するフィールドをクラスターにインポートします。
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 ファイルを使用してクラスターまたはノードプールを管理できます。
ノードプールのスケールアウト操作を検証します。
main.tf を使用してノードプールのスケールアウト操作を検証します。
たとえば、インポートされたノードプールを 3 つのノードにスケールアウトするには、
desired_size = 3フィールドを main.tf ファイルに追加します。...... # ACK マネージドクラスター。 resource "alicloud_cs_kubernetes_node_pool" "default" { ..... # ノードプール内のノードの期待数は 3 です。 desired_size = 3 } .....次のコマンドを実行して変更を適用します。
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 コンソールにログインし、[ノードプール] ページに移動して、ノードがノードプールに追加されたことを確認できます。
参考
Terraform は、ROS のマネージドサービスとして利用できます。ROS コンソールで Terraform テンプレートをデプロイできます。詳細については、「Terraform スタックの作成」をご参照ください。