alicloud_cs_kubernetes_node_pool で scaling_config を設定すると、需要に応じて Container Service for Kubernetes (ACK) ノードを自動スケーリングできます。
Terraform Explorer でこれらのサンプルを実行できます。
ここで作成したリソースには課金が発生します。完了後は terraform destroy で削除してください。
前提条件
次の条件を満たしていることを確認してください。
-
Auto Scaling がアクティブ化され、デフォルトのロールが割り当てられていること。
以前に
alicloud_cs_kubernetes_autoscalerコンポーネントを使用していた場合、Auto Scaling はすでにアクティブ化されています。 -
CloudOps Orchestration Service (OOS) へアクセスするための AliyunOOSLifecycleHook4CSRole ロールが作成されていること。
-
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.
-
-
[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_sizeとmax_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 パラメーターを生成できます。
-
ACK コンソールにログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
-
対象のクラスターの名前をクリックします。左側のナビゲーションペインで、[ノード] > [ノードプール] を選択します。
-
[ノードプールの作成] をクリックし、パラメーターを設定して [確認] をクリックします。ダイアログボックスで、[Console-to-Code] をクリックします。
-
[Console-to-Code] パネルで、[Terraform] タブをクリックします。コードブロックには、ノードプールのパラメーターが表示されます。
をクリックして使用します。
自動スケーリングが有効なノードプールの作成
状況に応じて手順を選択してください。
以前に alicloud_cs_kubernetes_autoscaler を使用していた場合
alicloud_cs_kubernetes_node_pool に移行します。
ステップ 1:autoscaler-meta ConfigMap を変更する
-
ACK コンソールにログオンします。左側のナビゲーションペインで、[クラスター]をクリックします。
-
対象のクラスターの名前をクリックします。左側のナビゲーションペインで、[構成] > [ConfigMap] を選択します。
-
[ConfigMap] ページで、[名前空間] ドロップダウンリストから [kube-system] を選択します。autoscaler-meta を見つけ、[操作] 列の [編集] をクリックします。
-
[編集] パネルの [値] テキストボックスで、
taintsの値を"taints":""から"taints":[]に変更します。 -
[OK]をクリックします。
ステップ 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 については、「一般的なコマンド」をご参照ください。