部署Web集群
本文介紹如何使用Terraform部署Web集群。
前提條件
在開(kāi)始之前,請(qǐng)您確保完成以下操作:
使用Terraform,您需要一個(gè)阿里云賬號(hào)和訪問(wèn)密鑰(AccessKey)。 請(qǐng)?jiān)诎⒗镌瓶刂婆_(tái)中的AccessKey管理頁(yè)面上創(chuàng)建和查看您的AccessKey。
已經(jīng)安裝并配置了Terraform,具體操作請(qǐng)參見(jiàn)在本地安裝和配置Terraform和在Cloud Shell中使用Terraform。
背景信息
在部署一個(gè)網(wǎng)站或者應(yīng)用時(shí),需要部署一系列的節(jié)點(diǎn),SLB對(duì)各個(gè)節(jié)點(diǎn)分配請(qǐng)求,并根據(jù)訪問(wèn)數(shù)量或者資源使用的情況來(lái)自動(dòng)伸縮。本文介紹將如何使用Terraform部署一個(gè)這樣的Web集群。在本示例中,整個(gè)應(yīng)用部署在一個(gè)可用區(qū),并且只提供8080端口訪問(wèn)hello world網(wǎng)頁(yè)。
操作步驟
創(chuàng)建VPC網(wǎng)絡(luò)和交換機(jī)。
創(chuàng)建terraform.tf文件,輸入以下內(nèi)容,并保存在當(dāng)前的執(zhí)行目錄中。
provider "alicloud" { region = "cn-beijing" } resource "alicloud_vpc" "vpc" { vpc_name = "tf_test_foo" cidr_block = "172.16.0.0/12" } resource "alicloud_vswitch" "vsw" { vpc_id = alicloud_vpc.vpc.id cidr_block = "172.16.0.0/21" zone_id = "cn-beijing-b" }
運(yùn)行
terraform apply
開(kāi)始創(chuàng)建。運(yùn)行
terraform show
查看已創(chuàng)建的VPC和vSwitch。您也可以登錄VPC控制臺(tái)查看VPC和vSwitch的屬性。
創(chuàng)建安全組,并將安全組作用于上一步創(chuàng)建的VPC中。
在terraform.tf文件中增加以下內(nèi)容。
resource "alicloud_security_group" "default" { name = "default" vpc_id = alicloud_vpc.vpc.id } resource "alicloud_security_group_rule" "allow_all_tcp" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "1/65535" priority = 1 security_group_id = alicloud_security_group.default.id cidr_ip = "0.0.0.0/0" }
運(yùn)行
terraform apply
開(kāi)始創(chuàng)建。運(yùn)行
terraform show
查看已創(chuàng)建的安全組和安全組規(guī)則。
創(chuàng)建負(fù)載均衡實(shí)例,為其分配公網(wǎng)IP。在本示例中,為負(fù)載均衡實(shí)例配置了從前端80端口到后端8080端口的映射,并輸出公網(wǎng)IP用于后續(xù)測(cè)試。
創(chuàng)建slb.tf文件,并增加以下內(nèi)容。
resource "alicloud_slb_load_balancer" "listener" { load_balancer_name = "tf-example" internet_charge_type = "PayByTraffic" address_type = "internet" instance_charge_type = "PayByCLCU" } resource "alicloud_slb_listener" "http" { load_balancer_id = alicloud_slb_load_balancer.listener.id backend_port = 8080 frontend_port = 80 bandwidth = 10 protocol = "http" sticky_session = "on" sticky_session_type = "insert" cookie = "testslblistenercookie" cookie_timeout = 86400 health_check = "on" health_check_type = "http" health_check_connect_port = 8080 } output "slb_public_ip" { value = alicloud_slb_load_balancer.listener.address }
運(yùn)行
terraform apply
開(kāi)始創(chuàng)建。運(yùn)行
terraform show
查看已創(chuàng)建的負(fù)載均衡實(shí)例。
創(chuàng)建彈性伸縮。
在本示例中,將創(chuàng)建以下資源:
伸縮組:在模板中指定伸縮最小為2,最大為10,并將伸縮組與新建的負(fù)載均衡實(shí)例綁定。由于伸縮組的配置要求SLB必須有相應(yīng)配置的監(jiān)聽(tīng)器,因此模板中用depends_on屬性指定了部署順序。
伸縮組配置:在模板中指定ECS實(shí)例的具體配置。在初始化配置(user-data)中生成一個(gè)Hello World的網(wǎng)頁(yè),并在8080端口提供服務(wù)。為簡(jiǎn)化操作,本示例中會(huì)為ECS實(shí)例分配公網(wǎng)IP,并且設(shè)置
force_delete=true
用于后續(xù)刪除環(huán)境。伸縮規(guī)則:定義具體的伸縮規(guī)則。
創(chuàng)建ess.tf文件,并增加以下內(nèi)容。
resource "alicloud_ess_scaling_group" "scaling" { min_size = 2 max_size = 10 scaling_group_name = "tf-scaling" vswitch_ids = alicloud_vswitch.vsw.*.id loadbalancer_ids = alicloud_slb_load_balancer.listener.*.id removal_policies = ["OldestInstance", "NewestInstance"] depends_on = ["alicloud_slb_listener.http"] } resource "alicloud_ess_scaling_configuration" "config" { scaling_group_id = alicloud_ess_scaling_group.scaling.id image_id = "ubuntu_18_04_64_20G_alibase_20190624.vhd" instance_type = "ecs.n4.large" security_group_id = alicloud_security_group.default.id active = true enable = true user_data = "#!/bin/bash\necho \"Hello, World\" > index.html\nnohup busybox httpd -f -p 8080&" internet_max_bandwidth_in = 10 internet_max_bandwidth_out = 10 internet_charge_type = "PayByTraffic" force_delete = true } resource "alicloud_ess_scaling_rule" "rule" { scaling_group_id = alicloud_ess_scaling_group.scaling.id adjustment_type = "TotalCapacity" adjustment_value = 2 cooldown = 60 }
運(yùn)行
terraform apply
開(kāi)始創(chuàng)建。創(chuàng)建成功后,會(huì)輸出SLB的公網(wǎng)IP。
等待大約兩分鐘,彈性伸縮將自動(dòng)創(chuàng)建ECS實(shí)例。
輸入命令
curl http://<slb public ip>
進(jìn)行驗(yàn)證。如果看到
Hello, World
,表示成功通過(guò)負(fù)載均衡實(shí)例訪問(wèn)ECS實(shí)例提供的網(wǎng)頁(yè)。
運(yùn)行
terraform destroy
刪除測(cè)試環(huán)境。經(jīng)確認(rèn)后,整個(gè)部署的環(huán)境將被刪除。使用Terraform可以便捷地刪除和重新部署一個(gè)環(huán)境。如果您想重新部署,運(yùn)行
terraform apply
即可。