このトピックでは、Terraform を使用して ACK 専用クラスターを作成する方法について説明します。
このトピックのサンプルコードは、数回クリックするだけで実行できます。 詳細については、「Terraform Explorer」をご参照ください。
新規の ACK 専用クラスターは作成できなくなりました。 アクセスをリクエストするには、する必要がありますする必要があります。
前提条件
Container Service for Kubernetes を有効化していること。 Terraform を使用して ACK を有効化する方法については、「Terraform を使用した ACK の有効化とロールへの権限付与」をご参照ください。
ログインに使用する Resource Access Management (RAM) ユーザーの AccessKey ペアが作成されていること。
説明デフォルトでは、Alibaba Cloud アカウントは、このアカウントに属するすべてのリソースに対する完全な権限を持っています。 認証情報が漏洩した場合の潜在的なセキュリティリスクを最小限に抑えるため、リソース権限が制限された RAM アカウントを使用することを推奨します。
Terraform でコマンドを実行するために使用する RAM ユーザーに、次のポリシーがアタッチされていること。 このポリシーには、Terraform でコマンドを実行するために必要な最小限の権限が含まれています。 詳細については、「RAM ユーザーへの権限付与」をご参照ください。
このアクセスポリシーにより、RAM ユーザーは VPC、vSwitch、および ACK クラスターの作成、表示、削除が可能になります。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "vpc:CreateVpc", "vpc:CreateVSwitch", "vpc:DescribeRouteTableList", "vpc:DescribeVpcAttribute", "vpc:ListEnhanhcedNatGatewayAvailableZones", "vpc:DescribeVSwitchAttributes", "vpc:DescribeNatGateways", "cs:CreateCluster", "cs:DescribeTaskInfo", "cs:DescribeClusterDetail", "cs:DescribeClusterCerts", "cs:CheckControlPlaneLogEnable", "vpc:DeleteVpc", "vpc:DeleteVSwitch", "cs:DeleteCluster" ], "Resource": "*" } ] }Terraform ランタイム環境を準備します。 次のいずれかの方法で Terraform を実行できます。
Terraform Explorer で Terraform を使用する:Alibaba Cloud は Terraform のオンラインランタイム環境を提供しており、インストールなしで使用できます。 この方法は、Terraform を無料で迅速かつ便利にテストおよびデバッグしたいシナリオに適しています。
Cloud Shell:Cloud Shell には Terraform がプリインストールされており、ご利用の認証情報で設定されています。 Cloud Shell で Terraform コマンドを直接実行できます。 この方法は、Terraform を迅速、便利、かつ低コストで使用する方法です。
Resource Orchestration Service (ROS) で Terraform を使用する:ROS は Terraform のマネージド機能を提供します。 Terraform テンプレートを作成し、Alibaba Cloud、AWS、または Azure リソースを定義し、リソースパラメーターと依存関係を設定できます。
ご利用のコンピューターに Terraform をインストールして設定する:この方法は、ネットワーク接続が悪い場合や、カスタム開発環境が必要なシナリオに適しています。
重要Terraform のバージョンが 0.12.28 以降であることを確認してください。 現在のバージョンを確認するには、
terraform --versionコマンドを実行します。
リソース
この例で使用されるリソースの一部は課金対象です。 不要になったリソースは、料金が発生しないようにリリースしてください。
alicloud_instance_types:指定された条件を満たす ECS インスタンスタイプをクエリします。
alicloud_vpc:VPC (Virtual Private Cloud) を作成します。
alicloud_vswitch:vSwitch (仮想スイッチ) を作成して、VPC を 1 つ以上のサブネットに分割します。
alicloud_resource_manager_resource_groups:現在の Alibaba Cloud ユーザーのリソースグループをクエリします。
alicloud_cs_kubernetes:ACK 専用クラスターを作成します。
コンソールからの Terraform リクエストパラメーターの生成
例に必要な設定が含まれていない場合や、パラメーターの組み合わせが正しくない場合は、コンソールから必要なパラメーターを生成できます。 これを行うには、次の手順を実行します:
ACK コンソール。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、[クラスターテンプレート] をクリックします。
表示されたダイアログボックスで、作成するクラスターのタイプを選択し、[作成] をクリックしてから、[クラスター設定] ページでクラスターを設定します。
設定が完了したら、[確認] ページの右上隅にある [Console-to-Code] をクリックします。
サイドバーで、[Terraform] タブをクリックします。 クラスターの作成に必要なパラメーターが表示されます。 これらのパラメーターをコピーして使用できます。
Terraform を使用した ACK 専用クラスター (Terway) の作成
このセクションでは、ネットワークコンポーネントとして Terway を使用する ACK 専用クラスターを作成できます。
作業ディレクトリを作成します。 作業ディレクトリに、main.tf という名前の設定ファイルを作成します。 次のコードを main.tf ファイルにコピーします。
provider "alicloud" { region = var.region_id } variable "region_id" { type = string default = "cn-hangzhou" } variable "zone_ids" { type = list(string) default = ["cn-hangzhou-i","cn-hangzhou-j","cn-hangzhou-k"] } # リソースの名前またはタグを定義します。 variable "name" { default = "tf-example" } # 既存の VPC の ID。 空の場合は、新しい VPC が作成されます。 variable "vpc_id" { description = "Existing vpc id used to create several vswitches and other resources." default = "" } # 'vpc_id' が指定されていない場合に、新しい VPC に使用される CIDR ブロック。 variable "vpc_cidr" { description = "The cidr block used to launch a new vpc when 'vpc_id' is not specified." default = "10.0.0.0/8" } # 既存の vSwitch の ID。 variable "vswitch_ids" { description = "List of existing vswitch id." type = list(string) default = [] } # 'vswitch_ids' が指定されていない場合に、新しい vSwitch の作成に使用される CIDR ブロック。 重複しない 3 つの CIDR ブロックが必要です。 variable "vswitch_cidrs" { description = "List of cidr blocks used to create several new vswitches when 'vswitch_ids' is not specified." type = list(string) default = ["10.1.0.0/16", "10.2.0.0/16", "10.3.0.0/16"] } # Terway 用の既存の vSwitch の ID。 variable "terway_vswitch_ids" { description = "List of existing vswitch ids for terway." type = list(string) default = [] } # 'terway_vswitch_ids' が指定されていない場合に、Terway で使用される vSwitch の CIDR ブロック。 variable "terway_vswitch_cidrs" { description = "List of cidr blocks used to create several new vswitches when 'terway_vswitch_cidrs' is not specified." type = list(string) default = ["10.4.0.0/16", "10.5.0.0/16", "10.6.0.0/16"] } # ACK クラスターにインストールするコンポーネント。 各コンポーネントの名前と設定を指定します。 variable "cluster_addons" { type = list(object({ name = string config = string })) default = [ { "name" = "terway-eniip", "config" = "", }, { "name" = "csi-plugin", "config" = "", }, { "name" = "csi-provisioner", "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\":\"\"}", } ] } locals { all_zone_ids = [for zones in data.alicloud_enhanced_nat_available_zones.enhanced.zones : zones.zone_id] common_zone_ids = setintersection(toset(var.zone_ids),toset(local.all_zone_ids)) # 各ゾーンでサポートされているインスタンスタイプを取得します。 instance_types_per_az = { for az, types in data.alicloud_instance_types.default : az => [for t in types.instance_types : t.id] } # リストされているすべてのゾーンのインスタンスタイプのリストを取得します。 all_instance_types_in_zones = [for zone in local.common_zone_ids : local.instance_types_per_az[zone]] # 各リストをセットに変換します。 sets = [for s in local.all_instance_types_in_zones : toset(s)] # すべてのゾーンに共通のインスタンスタイプを計算します。 common_instance_types = [for element in local.sets[0]: element if length([for set in local.sets: set if contains(set, element)]) == length(local.sets)] } # 拡張 NAT ゲートウェイをサポートするゾーンをクエリします。 data "alicloud_enhanced_nat_available_zones" "enhanced" { } # vpc_id 変数が指定されていない場合、このリソースは vpc_cidr 変数で指定された CIDR ブロックを持つ新しい VPC を作成します。 resource "alicloud_vpc" "vpc" { count = var.vpc_id == "" ? 1 : 0 cidr_block = var.vpc_cidr } # vswitch_ids 変数が指定されていない場合、デフォルトで指定された vswitch_cidrs に基づいて新しい vSwitch が作成されます。 resource "alicloud_vswitch" "vswitches" { count = length(var.vswitch_ids) > 0 ? 0 : length(var.vswitch_cidrs) vpc_id = var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id cidr_block = element(var.vswitch_cidrs, count.index) zone_id = tolist(local.common_zone_ids)[count.index] } # terway_vswitch_ids 変数が指定されていない場合、デフォルトで指定された terway_vswitch_cidrs に基づいて Terway 用の vSwitch が作成されます。 resource "alicloud_vswitch" "terway_vswitches" { count = length(var.terway_vswitch_ids) > 0 ? 0 : length(var.terway_vswitch_cidrs) vpc_id = var.vpc_id == "" ? join("", alicloud_vpc.vpc.*.id) : var.vpc_id cidr_block = element(var.terway_vswitch_cidrs, count.index) zone_id = tolist(local.common_zone_ids)[count.index] } # 現在の Alibaba Cloud ユーザーのリソースグループをクエリします。 data "alicloud_resource_manager_resource_groups" "default" { status = "OK" } # Alibaba Cloud の ECS インスタンスタイプをクエリします。 data "alicloud_instance_types" "default" { for_each = toset(local.common_zone_ids ) availability_zone = each.key cpu_core_count = 8 memory_size = 16 kubernetes_node_role = "Master" system_disk_category = "cloud_essd" } # ACK 専用クラスターを作成します。 設定には、コントロールプレーン vSwitch、Pod vSwitch、インスタンスタイプ、ディスク、パスワード、および Service CIDR ブロックが含まれます。 resource "alicloud_cs_kubernetes" "default" { master_vswitch_ids = length(var.vswitch_ids) > 0 ? split(",", join(",", var.vswitch_ids)) : length(var.vswitch_cidrs) < 1 ? [] : split(",", join(",", alicloud_vswitch.vswitches.*.id)) # 拡張 NAT をサポートするゾーンのリスト。 pod_vswitch_ids = length(var.terway_vswitch_ids) > 0 ? split(",", join(",", var.terway_vswitch_ids)) : length(var.terway_vswitch_cidrs) < 1 ? [] : split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # Terway を使用する場合の Pod ネットワーク用の vSwitch CIDR ブロック。 master_instance_types = [local.common_instance_types[0],local.common_instance_types[0],local.common_instance_types[0]] # マスターノードのインスタンスタイプ。 master_disk_category = "cloud_essd" # マスターノードのシステムディスクタイプ。 password = "Yourpassword1234" # SSH ログインパスワード。 service_cidr = "172.18.0.0/16" # Service CIDR ブロック。 load_balancer_spec = "slb.s1.small" # Server Load Balancer の仕様。 install_cloud_monitor = "true" # CloudMonitor サービスをインストールします。 resource_group_id = data.alicloud_resource_manager_resource_groups.default.groups.0.id # クラスターが属するリソースグループの ID。 これはリソースを分離するために使用されます。 deletion_protection = "false" # コンソールまたは API 呼び出しによる偶発的な削除を防ぐためのクラスターの削除保護。 timezone = "Asia/Shanghai" # クラスターが使用するタイムゾーン。 os_type = "Linux" # オペレーティングシステムプラットフォームのタイプ。 platform = "AliyunLinux3" # オペレーティングシステムのディストリビューション。 cluster_domain = "cluster.local" # クラスターのローカルドメイン名。 proxy_mode = "ipvs" # kube-proxy のプロキシモード。 custom_san = "www.terraform.io" # カスタム証明書 SAN。 new_nat_gateway = "true" # 新しい NAT Gateway を作成します。 dynamic "addons" { for_each = var.cluster_addons content { name = lookup(addons.value, "name", var.cluster_addons) config = lookup(addons.value, "config", var.cluster_addons) } } }次のコマンドを実行して、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.実行計画を作成し、変更をプレビューします。
terraform plan次の出力は、実行計画が作成されたことを示します。 作成されるリソースに関する情報を表示できます。
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ... Plan: 8 to add, 0 to change, 0 to destroy. ...次のコマンドを実行して、ACK 専用クラスターを作成します。
terraform applyプロンプトが表示されたら、
yesと入力して Enter キーを押します。 コマンドが完了するまで待ちます。 次の出力は、ACK 専用クラスターが作成されたことを示します。... 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_managed_kubernetes.default: Creation complete after 8m26s [id=************] Apply complete! Resources: 8 added, 0 changed, 0 destroyed.検証結果
terraform show コマンドの実行
次のコマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。
terraform showACK コンソールへのログイン
[ACK コンソール]にログオンして、作成したクラスターを表示します。
リソースのクリーンアップ
Terraform によって作成または管理されているリソースが不要になった場合は、次のコマンドを実行してそれらをリリースします。 terraform destroy コマンドの詳細については、「一般的なコマンド」をご参照ください。
terraform destroy コマンドは、作成したすべてのリソースを破棄します。 慎重に進めてください。
terraform destroyプロンプトが表示されたら、yes と入力して Enter キーを押します。 コマンドが完了するまで待ちます。 次の情報が返されると、ACK 専用クラスターが正常に削除されたことを示します。
...
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
...
Destroy complete! Resources: 7 destroyed.完全な例
関連ドキュメント
ACK 専用クラスターの作成時に追加のコンポーネントをインストールするには、「Terraform を使用したコンポーネントの管理」をご参照ください。
ノードプールの作成方法の詳細については、「Terraform を使用した自動スケーリングが有効なノードプールの作成」をご参照ください。
Terraform は ROS のマネージドサービスとして利用できます。 ROS コンソールで Terraform テンプレートをデプロイできます。 詳細については、「Terraform スタックの作成」をご参照ください。