使用Terraform創(chuàng)建具備自動伸縮功能的節(jié)點池
ACK的節(jié)點池及托管節(jié)點池中的節(jié)點默認不具備自動伸縮能力,您也可以通過使用Terraform工具創(chuàng)建開啟自動伸縮功能的節(jié)點池。本文介紹如何通過Terraform創(chuàng)建開啟自動伸縮功能的節(jié)點池。
本教程所含示例代碼支持一鍵運行,您可以直接運行代碼。一鍵運行
前提條件
自動伸縮功能依賴彈性伸縮(Auto Scaling,舊稱ESS)服務。啟動節(jié)點自動伸縮前,您需要開通彈性伸縮服務,并完成默認角色授權。具體操作,請參見開通彈性伸縮服務。
說明如果您之前已經使用了alicloud_cs_kubernetes_autoscaler組件,默認已開通彈性伸縮服務。
已為系統(tǒng)運維管理 OOS(CloudOps Orchestration Service)服務授權。您可以通過創(chuàng)建AliyunOOSLifecycleHook4CSRole角色,為OOS服務授權。
單擊AliyunOOSLifecycleHook4CSRole。
說明如果當前賬號是阿里云賬號,單擊AliyunOOSLifecycleHook4CSRole即可授權。
如果當前賬號是RAM用戶,請先確保對應的阿里云賬號已授權AliyunOOSLifecycleHook4CSRole,并為RAM用戶授予AliyunRAMReadOnlyAccess系統(tǒng)策略。具體操作,請參見為RAM用戶授權。
在云資源訪問授權頁面,單擊同意授權。
準備Terraform運行環(huán)境,您可以選擇以下任一方式來使用Terraform。
在Terraform Explorer中使用Terraform:阿里云提供了Terraform的在線運行環(huán)境,您無需安裝Terraform,登錄后即可在線使用和體驗Terraform。適用于零成本、快速、便捷地體驗和調試Terraform的場景。
Cloud Shell:阿里云Cloud Shell中預裝了Terraform的組件,并已配置好身份憑證,您可直接在Cloud Shell中運行Terraform的命令。適用于低成本、快速、便捷地訪問和使用Terraform的場景。
在本地安裝和配置Terraform:適用于網絡連接較差或需要自定義開發(fā)環(huán)境的場景。
背景信息
Terraform是一種開源工具,通過Provider來支持新的基礎架構,用于安全高效地預覽、配置和管理云基礎架構和資源。更多信息,請參見Terraform產品介紹。
在Alibaba Cloud Provider的老版本中,ACK提供了一個名為alicloud_cs_kubernetes_autoscaler的組件。alicloud_cs_kubernetes_autoscaler組件可以實現(xiàn)節(jié)點的彈性伸縮,但是其能力受限:
配置復雜,使用成本高。
伸縮的節(jié)點都會被放置到默認節(jié)點池,自動伸縮的節(jié)點未單獨維護。
部分配置參數不可更改。
Alibaba Cloud Provider從1.111.0版本開始可通過組件alicloud_cs_kubernetes_node_pool創(chuàng)建開啟自動伸縮功能的節(jié)點池,優(yōu)勢如下:
配置簡單,您只需要配置伸縮組內節(jié)點數的上下限。
針對非必須配置,ACK使用默認值的配置,以防誤操作帶來的基礎環(huán)境不一致的問題,例如:操作系統(tǒng)鏡像。
在ACK控制臺中可以直觀地觀察節(jié)點池內節(jié)點的變化。
使用的資源
本教程示例包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。
alicloud_instance_types:根據條件查詢符合要求的ECS實例類型。
alicloud_vpc:創(chuàng)建專有網絡VPC。
alicloud_vswitch:創(chuàng)建虛擬交換機(vSwitch)為VPC劃分一個或多個子網。
alicloud_cs_managed_kubernetes:創(chuàng)建ACK托管版集群。
alicloud_cs_kubernetes_node_pool:為ACK托管集群創(chuàng)建節(jié)點池。
使用Terraform創(chuàng)建開啟自動伸縮功能的節(jié)點池
使用過alicloud_cs_kubernetes_autoscaler組件
如果您的集群之前已經使用alicloud_cs_kubernetes_autoscaler組件,在完成上述為當前集群添加彈性伸縮服務授權后,您需要執(zhí)行以下步驟平滑切換alicloud_cs_kubernetes_autoscaler至alicloud_cs_kubernetes_node_pool,以創(chuàng)建開啟自動伸縮功能的節(jié)點池。
修改集群的autoscaler-meta配置項。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在配置項頁面左上角的命名空間下拉框中,選擇kube-system,然后在autoscaler-meta配置項右側操作列下,單擊編輯。
在編輯面板中,修改autoscaler-meta配置項的值。
您需將
taints
值的String類型改成數組類型,即在值文本框中,修改"taints":""
為"taints":[]
。單擊確定。
同步節(jié)點池。
在集群管理頁左側導航欄,選擇 。
在節(jié)點池頁面右上方,單擊同步節(jié)點池。
未使用過alicloud_cs_kubernetes_autoscaler組件
您可以使用Terraform創(chuàng)建開啟自動伸縮功能的節(jié)點池。
創(chuàng)建節(jié)點池的配置文件。
為已有集群創(chuàng)建開啟自動伸縮功能的節(jié)點池
在已有集群中創(chuàng)建開啟自動伸縮功能的節(jié)點池,配置示例如下。
provider "alicloud" { } # 為已有集群創(chuàng)建開啟自動伸縮功能的節(jié)點池。 resource "alicloud_cs_kubernetes_node_pool" "at1" { # 目標集群ID。 cluster_id = "" name = "np-test" # 節(jié)點池內節(jié)點使用的vswitch,至少提供一個。 vswitch_ids = ["vsw-bp1mdigyhmilu2h4v****"] instance_types = ["ecs.e3.medium"] password = "Hello1234" scaling_config { # 最小節(jié)點數。 min_size = 1 # 最大節(jié)點數。 max_size = 5 } }
創(chuàng)建新的具備自動伸縮功能的節(jié)點池集群
創(chuàng)建一個包含自動伸縮節(jié)點池的集群,配置示例如下。
provider "alicloud" { region = var.region_id } variable "region_id" { type = string default = "cn-shenzhen" } variable "cluster_spec" { type = string description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters." default = "ack.pro.small" } # 指定虛擬交換機(vSwitches)的可用區(qū)。 variable "availability_zone" { description = "The availability zones of vswitches." default = ["cn-shenzhen-c", "cn-shenzhen-e", "cn-shenzhen-f"] } # 用于創(chuàng)建新vSwitches的CIDR地址塊列表。 variable "node_vswitch_cidrs" { type = list(string) default = ["172.16.0.0/23", "172.16.2.0/23", "172.16.4.0/23"] } # 用于創(chuàng)建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"] } # 定義了用于啟動工作節(jié)點的ECS實例類型。 variable "worker_instance_types" { description = "The ecs instance types used to launch worker nodes." default = ["ecs.g6.2xlarge", "ecs.g6.xlarge"] } # 設置工作節(jié)點的密碼 variable "password" { description = "The password of ECS instance." default = "Test123456" } # 指定創(chuàng)建ACK托管集群名稱的前綴。 variable "k8s_name_prefix" { description = "The name prefix used to create managed kubernetes cluster." default = "tf-ack-shenzhen" } # 指定ACK集群安裝的組件。包括Terway(網絡組件)、csi-plugin(存儲組件)、csi-provisioner(存儲組件)、logtail-ds(日志組件)、Nginx Ingress Controller、ack-arms-prometheus(監(jiān)控組件)以及ack-node-problem-detector(節(jié)點診斷組件)。 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}" } # 節(jié)點ECS實例配置。將查詢滿足CPU、Memory要求的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 } # 專有網絡。 resource "alicloud_vpc" "default" { vpc_name = local.vpc_name cidr_block = "172.16.0.0/12" } # Node交換機。 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交換機。 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) } # Kubernetes托管版。 resource "alicloud_cs_managed_kubernetes" "default" { name = local.k8s_name_terway # Kubernetes集群名稱。 cluster_spec = var.cluster_spec # 創(chuàng)建Pro版集群。 worker_vswitch_ids = split(",", join(",", alicloud_vswitch.vswitches.*.id)) # 節(jié)點池所在的vSwitch。指定一個或多個vSwitch的ID,必須在availability_zone指定的區(qū)域中。 pod_vswitch_ids = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # Pod虛擬交換機。 new_nat_gateway = true # 是否在創(chuàng)建Kubernetes集群時創(chuàng)建新的NAT網關。默認為true。 service_cidr = "10.11.0.0/16" # Pod網絡的CIDR塊。當cluster_network_type設置為flannel,你必須設定該參數。它不能與VPC CIDR相同,并且不能與VPC中的Kubernetes集群使用的CIDR相同,也不能在創(chuàng)建后進行修改。集群中允許的最大主機數量:256。 slb_internet_enabled = true # 是否為API Server創(chuàng)建Internet負載均衡。默認為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) } } } # 創(chuàng)建自動伸縮節(jié)點池,節(jié)點池最多可以擴展到 10 個節(jié)點,最少保持 1 個節(jié)點。 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登錄集群節(jié)點的密碼。 install_cloud_monitor = true # 是否為kubernetes的節(jié)點安裝云監(jiān)控。 system_disk_category = "cloud_efficiency" system_disk_size = 100 image_type = "AliyunLinux3" data_disks { # 節(jié)點數據盤配置。 category = "cloud_essd" # 節(jié)點數據盤種類。 size = 120 # 節(jié)點數據盤大小。 } }
執(zhí)行如下命令,初始化Terraform運行環(huán)境。
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.
執(zhí)行
terraform apply
命令完成創(chuàng)建。驗證結果。
完成創(chuàng)建節(jié)點池后,在節(jié)點池列表中可以看到新建的節(jié)點池,該節(jié)點池名稱下會標注已開啟自動伸縮。
清理資源
當您不再需要上述通過Terraform創(chuàng)建或管理的資源時,請運行terraform destroy
命令以釋放資源。關于terraform destroy
的更多信息,請參見Terraform常用命令。
terraform destroy
完整示例
本教程所含示例代碼支持一鍵運行,您可以直接運行代碼。一鍵運行
示例代碼
provider "alicloud" {
region = var.region_id
}
variable "region_id" {
type = string
default = "cn-shenzhen"
}
variable "cluster_spec" {
type = string
description = "The cluster specifications of kubernetes cluster,which can be empty. Valid values:ack.standard : Standard managed clusters; ack.pro.small : Professional managed clusters."
default = "ack.pro.small"
}
# 指定虛擬交換機(vSwitches)的可用區(qū)。
variable "availability_zone" {
description = "The availability zones of vswitches."
default = ["cn-shenzhen-c", "cn-shenzhen-e", "cn-shenzhen-f"]
}
# 用于創(chuàng)建新vSwitches的CIDR地址塊列表。
variable "node_vswitch_cidrs" {
type = list(string)
default = ["172.16.0.0/23", "172.16.2.0/23", "172.16.4.0/23"]
}
# 用于創(chuàng)建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"]
}
# 定義了用于啟動工作節(jié)點的ECS實例類型。
variable "worker_instance_types" {
description = "The ecs instance types used to launch worker nodes."
default = ["ecs.g6.2xlarge", "ecs.g6.xlarge"]
}
# 設置工作節(jié)點的密碼
variable "password" {
description = "The password of ECS instance."
default = "Test123456"
}
# 指定創(chuàng)建ACK托管集群名稱的前綴。
variable "k8s_name_prefix" {
description = "The name prefix used to create managed kubernetes cluster."
default = "tf-ack-shenzhen"
}
# 指定ACK集群安裝的組件。包括Terway(網絡組件)、csi-plugin(存儲組件)、csi-provisioner(存儲組件)、logtail-ds(日志組件)、Nginx Ingress Controller、ack-arms-prometheus(監(jiān)控組件)以及ack-node-problem-detector(節(jié)點診斷組件)。
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}"
}
# 節(jié)點ECS實例配置。將查詢滿足CPU、Memory要求的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
}
# 專有網絡。
resource "alicloud_vpc" "default" {
vpc_name = local.vpc_name
cidr_block = "172.16.0.0/12"
}
# Node交換機。
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交換機。
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)
}
# Kubernetes托管版。
resource "alicloud_cs_managed_kubernetes" "default" {
name = local.k8s_name_terway # Kubernetes集群名稱。
cluster_spec = var.cluster_spec # 創(chuàng)建Pro版集群。
worker_vswitch_ids = split(",", join(",", alicloud_vswitch.vswitches.*.id)) # 節(jié)點池所在的vSwitch。指定一個或多個vSwitch的ID,必須在availability_zone指定的區(qū)域中。
pod_vswitch_ids = split(",", join(",", alicloud_vswitch.terway_vswitches.*.id)) # Pod虛擬交換機。
new_nat_gateway = true # 是否在創(chuàng)建Kubernetes集群時創(chuàng)建新的NAT網關。默認為true。
service_cidr = "10.11.0.0/16" # Pod網絡的CIDR塊。當cluster_network_type設置為flannel,你必須設定該參數。它不能與VPC CIDR相同,并且不能與VPC中的Kubernetes集群使用的CIDR相同,也不能在創(chuàng)建后進行修改。集群中允許的最大主機數量:256。
slb_internet_enabled = true # 是否為API Server創(chuàng)建Internet負載均衡。默認為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)
}
}
}
# 創(chuàng)建自動伸縮節(jié)點池,節(jié)點池最多可以擴展到 10 個節(jié)點,最少保持 1 個節(jié)點。
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登錄集群節(jié)點的密碼。
install_cloud_monitor = true # 是否為kubernetes的節(jié)點安裝云監(jiān)控。
system_disk_category = "cloud_efficiency"
system_disk_size = 100
image_type = "AliyunLinux3"
data_disks { # 節(jié)點數據盤配置。
category = "cloud_essd" # 節(jié)點數據盤種類。
size = 120 # 節(jié)點數據盤大小。
}
}
如果您想體驗更多完整示例,請前往更多完整示例中對應產品的文件夾查看。