Terraform是HashiCorp公司提供的一種開源的云上資源編排工具,用于安全高效地預覽,配置和管理云基礎架構和資源,幫助開發者自動化地創建、更新阿里云基礎設施資源。本文介紹如何使用Terraform創建和刪除ASM實例。
前提條件
已在本地安裝和配置Terraform。具體操作,請參見在本地安裝和配置Terraform。
已配置阿里云賬號信息。創建環境變量,用于存放身份認證和地域信息。
export ALICLOUD_ACCESS_KEY="************" #替換為您的AccessKey ID信息。 export ALICLOUD_SECRET_KEY="************" #替換為您的AccessKey Secret信息。 export ALICLOUD_REGION="cn-beijing" #替換為您的地域ID。
背景信息
關于Terraform的詳細介紹,請參見terraform。
創建ASM實例
在本地創建名為main.tf的配置文件。
若您沒有專有網絡和虛擬交換機,您需要使用以下內容創建main.tf文件。
terraform { required_providers { alicloud = { source = "aliyun/alicloud" } } } variable "k8s_name_prefix" { description = "The name prefix used to create Service Mesh (ASM)." default = "tf-asm" } resource "random_uuid" "this" {} # 默認的資源名稱及配置。 locals { # 服務網格名稱。 mesh_name = substr(join("-", [var.k8s_name_prefix, random_uuid.this.result]), 0, 63) # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 mesh_spec = "enterprise" # 專有網絡名稱。 new_vpc_name = "vpc-for-${local.mesh_name}" # 虛擬交換機名稱。 new_vsw_name = "vsw-for-${local.mesh_name}" } # 可以創建虛擬交換機的AZ。 data "alicloud_zones" "default" { available_resource_creation = "VSwitch" } # 專有網絡。 resource "alicloud_vpc" "default" { vpc_name = local.new_vpc_name } # 虛擬交換機。 resource "alicloud_vswitch" "default" { vpc_id = alicloud_vpc.default.id cidr_block = cidrsubnet(alicloud_vpc.default.cidr_block, 8, 2) zone_id = data.alicloud_zones.default.zones.0.id vswitch_name = local.new_vsw_name } # 查詢可以創建的服務網格版本。 data "alicloud_service_mesh_versions" "default" { edition = local.mesh_spec == "standard" ? "Default" : "Pro" } # 選擇可創建的第一個版本作為創建新服務網格使用的版本。 locals { mesh_version = split(":", data.alicloud_service_mesh_versions.default.ids[0])[1] } # 服務網格ASM實例。 resource "alicloud_service_mesh_service_mesh" "default" { # 服務網格名稱。 service_mesh_name = local.mesh_name # 服務網格的網絡配置。 network { # 專有網絡ID。 vpc_id = alicloud_vpc.default.id # 虛擬交換機ID。 vswitche_list = [alicloud_vswitch.default.id] } # 服務網格的版本。 version = local.mesh_version # 服務網格的API Server和Pilot負載均衡配置。 load_balancer { # 是否使用eip暴露服務網格API Server負載均衡。 api_server_public_eip = true } # 服務網格的實例配置Mesh Config。 mesh_config { # 將訪問日志采集到阿里云日志服務。 access_log { enabled = true } # 啟用控制面日志采集,需開通阿里云日志服務。 control_plane_log { enabled = true } # 啟用ARMS鏈路追蹤。 tracing = true # 如果啟用鏈路追蹤,設置采樣百分比。 pilot { trace_sampling = 100 } # 開啟采集Prometheus監控指標。 telemetry = true # 啟用網格拓撲(需要開啟Prometheus)。 kiali { enabled = true } # 啟用網格審計,需要開通阿里云日志服務。 audit { enabled = true } } # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 cluster_spec = local.mesh_spec }
在main.tf文件中根據實際情況自定義以下參數,其他參數值會使用OpenAPI自動拉取獲取。
參數
描述
mesh_name
自定義服務網格名稱。
mesh_spec
設置服務網格規格,可選:
standard:標準版(免費)。
enterprise:企業版。
ultimate:旗艦版。
new_vpc_name
自定義專有網絡名稱。
new_vsw_name
自定義虛擬交換機名稱。
api_server_public_eip
是否使用EIP暴露服務網格API Server負載均衡,可選:
true:使用EIP暴露服務網格API Server負載均衡。
false:不使用EIP暴露服務網格API Server負載均衡。
若您已有專有網絡和虛擬交換機,您需要使用以下內容創建main.tf文件。
重要專有網絡、虛擬交換機需要和Terraform的身份認證信息處于同一地域,否則將識別不到專有網絡和虛擬交換機。
terraform { required_providers { alicloud = { source = "aliyun/alicloud" } } } variable "asm_name_prefix" { description = "The name prefix used to create Service Mesh (ASM)." default = "tf-asm" } resource "random_uuid" "this" {} # 默認的資源名稱及配置。 locals { # 服務網格名稱。 mesh_name = substr(join("-", [var.asm_name_prefix, random_uuid.this.result]), 0, 63) # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 mesh_spec = "enterprise" # 已有專有網絡名稱。 vpc_name = "vpc-luying-hangzhou1" # 已有虛擬交換機名稱。 vsw_name = "vsw-luying-hangzhou1" } # 專有網絡。 data "alicloud_vpcs" "default" { name_regex = local.vpc_name # 已經存在的vpc名稱。 } # 虛擬交換機。 data "alicloud_vswitches" "default" { vpc_id = data.alicloud_vpcs.default.ids[0] } locals { exist_vswitch_ids = [for vsw in data.alicloud_vswitches.default.vswitches : vsw.id if vsw.name == local.vsw_name] } # 查詢可以創建的服務網格版本。 data "alicloud_service_mesh_versions" "default" { edition = local.mesh_spec == "standard" ? "Default" : "Pro" } # 選擇可創建的第一個版本作為創建新服務網格使用的版本。 locals { mesh_version = split(":", data.alicloud_service_mesh_versions.default.ids[0])[1] } # 服務網格ASM實例。 resource "alicloud_service_mesh_service_mesh" "default" { # 服務網格名稱。 service_mesh_name = local.mesh_name # 服務網格的網絡配置。 network { # 專有網絡ID。 vpc_id = data.alicloud_vpcs.default.ids[0] # 虛擬交換機ID。 vswitche_list = [local.exist_vswitch_ids[0]] } # 服務網格的版本。 version = local.mesh_version # 服務網格的API Server和Pilot負載均衡配置。 load_balancer { # 是否使用eip暴露服務網格API Server負載均衡。 api_server_public_eip = true } # 服務網格的實例配置Mesh Config。 mesh_config { # 將訪問日志采集到阿里云日志服務。 access_log { enabled = true } # 啟用控制面日志采集,需開通阿里云日志服務。 control_plane_log { enabled = true } # 啟用ARMS鏈路追蹤。 tracing = true # 如果啟用鏈路追蹤,設置采樣百分比。 pilot { trace_sampling = 100 } # 開啟采集Prometheus監控指標。 telemetry = true # 啟用網格拓撲(需要開啟Prometheus)。 kiali { enabled = true } # 啟用網格審計,需要開通阿里云日志服務。 audit { enabled = true } } # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 cluster_spec = local.mesh_spec }
在main.tf文件中根據實際情況自定義以下參數,其他參數值會使用OpenAPI自動拉取獲取。
參數
描述
mesh_name
自定義服務網格名稱。
mesh_spec
設置服務網格規格,可選:
standard:標準版(免費)。
enterprise:企業版。
ultimate:旗艦版。
vpc_name
輸入已有專有網絡名稱。
vsw_name
輸入已有虛擬交換機名稱。
api_server_public_eip
是否使用EIP暴露服務網格API Server負載均衡,可選:
true:使用EIP暴露服務網格API Server負載均衡。
false:不使用EIP暴露服務網格API Server負載均衡。
執行以下命令,初始化Terraform運行環境。
terraform init
預期輸出:
Initializing the backend... Initializing provider plugins... - Finding aliyun/alicloud versions matching "1.166.0"... - Finding latest version of hashicorp/random... ... 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資源規劃。
terraform plan
預期輸出:
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: ... Plan: 2 to add, 0 to change, 0 to destroy.
執行以下命令,使用main.tf文件創建ASM實例。
terraform apply
預期輸出:
alicloud_service_mesh_service_mesh.example: Refreshing state... ... Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
在Enter a value參數右側輸入yes,預期返回以下內容:
... alicloud_service_mesh_service_mesh.default: Creating... alicloud_service_mesh_service_mesh.default: Still creating... [10s elapsed] ... alicloud_service_mesh_service_mesh.example: Creation complete after 2m42s [id=**********] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
刪除ASM實例
使用Terraform刪除指定ASM實例時,您必須進入到與main.tf文件相同的目錄下后,才能執行命令刪除該實例。
進入與main.tf文件相同的目錄下,執行以下命令,刪除ASM實例。
terraform destroy
預期輸出:
...
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:
在Enter a value參數右側輸入yes,預期返回以下內容:
...
Destroy complete! Resources: 2 destroyed.
修改ASM實例屬性
您可以通過修改tf文件中的屬性定義,并執行terraform apply將變更應用到ASM實例,本文以修改http10_enabled屬性為例,演示如何通過terraform修改ASM實例屬性。
此處以“已有專有網絡和虛擬交換機”場景的tf文件為例,修改服務網格資源的
mesh_config.pilot.http10_enabled
為true
。terraform { required_providers { alicloud = { source = "aliyun/alicloud" } } } variable "asm_name_prefix" { description = "The name prefix used to create Service Mesh (ASM)." default = "tf-asm" } resource "random_uuid" "this" {} # 默認的資源名稱及配置。 locals { # 服務網格名稱。 mesh_name = substr(join("-", [var.asm_name_prefix, random_uuid.this.result]), 0, 63) # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 mesh_spec = "enterprise" # 已有專有網絡名稱。 vpc_name = "prod-hz-vpc" # 已有虛擬交換機名稱。 vsw_name = "prod-hz-vpc-default" } # 專有網絡。 data "alicloud_vpcs" "default" { name_regex = local.vpc_name # 已經存在的vpc名稱。 } # 虛擬交換機。 data "alicloud_vswitches" "default" { vpc_id = data.alicloud_vpcs.default.ids[0] } locals { exist_vswitch_ids = [for vsw in data.alicloud_vswitches.default.vswitches : vsw.id if vsw.name == local.vsw_name] } # 查詢可以創建的服務網格版本。 data "alicloud_service_mesh_versions" "default" { edition = local.mesh_spec == "standard" ? "Default" : "Pro" } # 選擇可創建的第一個版本作為創建新服務網格使用的版本。 locals { mesh_version = split(":", data.alicloud_service_mesh_versions.default.ids[0])[1] } # 服務網格ASM實例。 resource "alicloud_service_mesh_service_mesh" "default" { # 服務網格名稱。 service_mesh_name = local.mesh_name # 服務網格的網絡配置。 network { # 專有網絡ID。 vpc_id = data.alicloud_vpcs.default.ids[0] # 虛擬交換機ID。 vswitche_list = [local.exist_vswitch_ids[0]] } # 服務網格的版本。 version = local.mesh_version # 服務網格的API Server和Pilot負載均衡配置。 load_balancer { # 是否使用eip暴露服務網格API Server負載均衡。 api_server_public_eip = true } # 服務網格的實例配置Mesh Config。 mesh_config { # 將訪問日志采集到阿里云日志服務。 access_log { enabled = true } # 啟用控制面日志采集,需開通阿里云日志服務。 control_plane_log { enabled = true project = "mesh-log-cab09b566d4a64c1fa05271d5365495f1" } # 啟用ARMS鏈路追蹤。 tracing = true # 如果啟用鏈路追蹤,設置采樣百分比。 pilot { trace_sampling = 100 http10_enabled = true } # 開啟采集Prometheus監控指標。 telemetry = true # 啟用網格拓撲(需要開啟Prometheus)。 kiali { enabled = true } # 啟用網格審計,需要開通阿里云日志服務。 audit { enabled = true } } # 服務網格的規格,可以選擇三種規格:standard: 標準版(免費),enterprise:企業版,ultimate:旗艦版。 cluster_spec = local.mesh_spec }
執行
terraform apply
,觀察到該字段發生變更,符合預期。terraform apply random_uuid.this: Refreshing state... [id=6ab24265-2381-dad9-3be5-351329c5665a] data.alicloud_vpcs.default: Reading... data.alicloud_service_mesh_versions.default: Reading... data.alicloud_service_mesh_versions.default: Read complete after 1s [id=605899410] data.alicloud_vpcs.default: Read complete after 1s [id=2909606812] data.alicloud_vswitches.default: Reading... data.alicloud_vswitches.default: Read complete after 0s [id=866499268] alicloud_service_mesh_service_mesh.default: Refreshing state... [id=cab09b566d4a64c1fa05271d5365495f1] 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_service_mesh_service_mesh.default will be updated in-place ~ resource "alicloud_service_mesh_service_mesh" "default" { id = "cab09b566d4a64c1fa05271d5365495f1" # (6 unchanged attributes hidden) ~ mesh_config { # (5 unchanged attributes hidden) ~ pilot { ~ http10_enabled = false -> true # (1 unchanged attribute hidden) } # (7 unchanged blocks hidden) } # (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
應用變更......省略無關內容...... 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_service_mesh_service_mesh.default: Modifying... [id=cab09b566d4a64c1fa05271d5365495f1] alicloud_service_mesh_service_mesh.default: Still modifying... [id=cab09b566d4a64c1fa05271d5365495f1, 10s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=cab09b566d4a64c1fa05271d5365495f1, 20s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=cab09b566d4a64c1fa05271d5365495f1, 30s elapsed] alicloud_service_mesh_service_mesh.default: Modifications complete after 37s [id=cab09b566d4a64c1fa05271d5365495f1]
添加或移除Kubernetes集群
您可以通過修改tf文件中的cluster_ids數組,將希望加入ASM管理的集群ID追加至數組,將希望從ASM移除的集群ID從數組中移除,并執行terraform apply將變更應用到ASM實例。
此處以添加集群一個集群到asm為例,修改服務網格資源的
cluster_ids
,在數組種追加集群ID:......省略無關內容...... # 服務網格ASM實例。 resource "alicloud_service_mesh_service_mesh" "default" { # 服務網格名稱。 service_mesh_name = local.mesh_name # 服務網格的網絡配置。 network { # 專有網絡ID。 vpc_id = data.alicloud_vpcs.default.ids[0] # 虛擬交換機ID。 vswitche_list = [local.exist_vswitch_ids[0]] } # 服務網格的版本。 version = local.mesh_version # 服務網格的API Server和Pilot負載均衡配置。 load_balancer { # 是否使用eip暴露服務網格API Server負載均衡。 api_server_public_eip = true } cluster_ids = [ "c94a1a1d968e04c55861b8747********" # 新增集群ID到數組 ] ......省略無關內容...... } ......省略無關內容......
執行terraform apply,觀察到數據面集群ID數組發生變更,符合預期
random_uuid.this: Refreshing state... [id=6ab24265-2381-dad9-3be5-351329c5665a] data.alicloud_service_mesh_versions.default: Reading... data.alicloud_vpcs.default: Reading... data.alicloud_vpcs.default: Read complete after 1s [id=2909606812] data.alicloud_vswitches.default: Reading... data.alicloud_vswitches.default: Read complete after 0s [id=866499268] data.alicloud_service_mesh_versions.default: Read complete after 1s [id=3077056360] alicloud_service_mesh_service_mesh.default: Refreshing state... [id=c71fe2f2301234701b2e4116397426342] 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_service_mesh_service_mesh.default will be updated in-place ~ resource "alicloud_service_mesh_service_mesh" "default" { ~ cluster_ids = [ + "c94a1a1d968e04c55861b8747********", ] id = "c71fe2f2301234701b2e4116397426342" tags = {} # (6 unchanged attributes 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
應用變更......省略無關內容...... 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_service_mesh_service_mesh.default: Modifying... [id=c71fe2f2301234701b2e4116397426342] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 10s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 20s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 30s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 40s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 50s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 1m0s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 1m10s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 1m20s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 1m30s elapsed] alicloud_service_mesh_service_mesh.default: Still modifying... [id=c71fe2f2301234701b2e4116397426342, 1m40s elapsed] alicloud_service_mesh_service_mesh.default: Modifications complete after 1m44s [id=c71fe2f2301234701b2e4116397426342] Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Terraform管理的ASM資源
ASM支持通過Terraform管理以下Resource和Data Source:
類型 | 名稱 | 描述 |
Resources | 管理ASM實例。 | |
配置ASM實例權限。 | ||
Data Sources | 列舉所有的ASM實例。 | |
列舉所有可用的服務網格版本。 |
terraform apply看到字段被刪除時的處理方式
為了簡化操作,ASM的部分屬性即使創建時不指定,服務端也會分配默認值,這個特性類似于terraform的Computed
屬性標簽,但是若將這些屬性設置為Computed
,則會使得這些值無法被改為空(字符串類型無法改為空字符串,數值類型無法改為0,布爾類型無法改為false)。為了允許這些屬性被改為空值,ASM Terraform Registry不能將這些屬性設置為Computed
。在您執行terraform apply
時,由于服務端返回了這些屬性,而tf文件中未顯式聲明,terraform會認為您希望刪除這些值,此時,若您不希望置空這些屬性,則應當根據提示手動將它們補充到tf文件中,再執行terraform apply
。