部署Web集群

更新时间:

本文介绍如何使用Terraform部署Web集群。

前提条件

在开始之前,请您确保完成以下操作:

背景信息

在部署一个网站或者应用时,需要部署一系列的节点,SLB对各个节点分配请求,并根据访问数量或者资源使用的情况来自动伸缩。本文介绍将如何使用Terraform部署一个这样的Web集群。在本示例中,整个应用部署在一个可用区,并且只提供8080端口访问hello world网页。

操作步骤

  1. 创建VPC网络和交换机。

    1. 创建terraform.tf文件,输入以下内容,并保存在当前的执行目录中。

      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"
      }
    2. 运行terraform apply开始创建。

    3. 运行terraform show查看已创建的VPC和vSwitch。

      您也可以登录VPC控制台查看VPC和vSwitch的属性。

  2. 创建安全组,并将安全组作用于上一步创建的VPC中。

    1. terraform.tf文件中增加以下内容。

      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"
      }
    2. 运行terraform apply开始创建。

    3. 运行terraform show查看已创建的安全组和安全组规则。

  3. 创建负载均衡实例,为其分配公网IP。在本示例中,为负载均衡实例配置了从前端80端口到后端8080端口的映射,并输出公网IP用于后续测试。

    1. 创建slb.tf文件,并增加以下内容。

      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
      }
    2. 运行terraform apply开始创建。

    3. 运行terraform show查看已创建的负载均衡实例。

  4. 创建弹性伸缩。

    在本示例中,将创建以下资源:

    • 伸缩组:在模板中指定伸缩最小为2,最大为10,并将伸缩组与新建的负载均衡实例绑定。由于伸缩组的配置要求SLB必须有相应配置的监听器,因此模板中用depends_on属性指定了部署顺序。

    • 伸缩组配置:在模板中指定ECS实例的具体配置。在初始化配置(user-data)中生成一个Hello World的网页,并在8080端口提供服务。为简化操作,本示例中会为ECS实例分配公网IP,并且设置force_delete=true用于后续删除环境。

    • 伸缩规则:定义具体的伸缩规则。

    1. 创建ess.tf文件,并增加以下内容。

      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
      }
    2. 运行terraform apply开始创建。

      创建成功后,会输出SLB的公网IP。

      等待大约两分钟,弹性伸缩将自动创建ECS实例。

    3. 输入命令curl http://<slb public ip>进行验证。

      如果看到Hello, World,表示成功通过负载均衡实例访问ECS实例提供的网页。

  5. 运行terraform destroy删除测试环境。经确认后,整个部署的环境将被删除。

    使用Terraform可以便捷地删除和重新部署一个环境。如果您想重新部署,运行terraform apply即可。