使用Terraform管理ASM实例
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" version = "1.186.0" } } } 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" version = "1.186.0" } } } 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.
Terraform管理的ASM资源
ASM支持通过Terraform管理以下Resource和Data Source:
类型 | 名称 | 描述 |
Resources | 管理ASM实例。 | |
配置ASM实例权限。 | ||
Data Sources | 列举所有的ASM实例。 | |
列举所有可用的服务网格版本。 |