负载均衡(Load Balancer)是对多台云服务器进行流量分发的负载均衡服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。同样在实际的项目开发中,通过多个负载均衡,我们可以方便的实现灰度发布。

资源编排的负载均衡功能介绍

配置和管理一个负载均衡实例,主要涉及3部分的功能操作,包括:

  • 负载均衡实例属性配置:通过实例属性配置来定义一个负载均衡实例的类型
  • 负载均衡服务监听配置:通过服务监听配置来定义一个负载均衡实例的各项策略和转发规则
  • 负载均衡后端服务器配置:通过后端服务器配置来定义一个负载均衡实例后端用来处理用户请求的多个ECS实例

资源编排将上述的服务抽象为下面的资源类型:

  • ALIYUN::SLB::LoadBalancer
  • 创建一个负载均衡的基本配置
  • ALIYUN::SLB::Listener
  • 添加监听到负载均衡并启动监听
  • ALIYUN::SLB::BackendServerAttachment
  • 挂载ECS到负载均衡
  • ALIYUN::SLB::LoadBalancerClone
  • 深度复制一个SLB,包括监听规则和状态,这个在另外的文章专门介绍。
负载均衡的实践

首先我们创建一个空的负载均衡,和其它的资源类型一样,我们首先创建一个JSON的模板。

创建一个负载均衡

根据模板定义我们可以选择付费类型为按流量和固定带宽。对于VPC类型的负载均衡需要提供相应的VpcIdVSwitchId即可。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "CreateLoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    }
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "CreateLoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}
在负载均衡上创建监听

只创建一个负载均衡是不工作的,接着我们需要创建像对应的监听。在下面的例子中我们创建一个HTTP的监听,将前端的80端口映射到后端的8080端口上。

在这里我们添加了一个新的资源ALIYUN::SLB::Listener, 基本配置和SLB的控制台类似。相比控制台的输入参数,这里抽象为了键值对,可以更加快捷方便的实现。创建的监听在生产之后将会自动启动。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "LoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    },
    "CreateListener": {
      "Type": "ALIYUN::SLB::Listener",
      "Properties": {
          "LoadBalancerId": {"Ref": "LoadBalancer"},
          "ListenerPort": "80",
          "BackendServerPort": 8080,
          "Bandwidth": 1,
          "Protocol": "http",
          "HealthCheck": {
              "HealthyThreshold": 3,
              "UnhealthyThreshold": 3,
              "Interval": 2,
              "Timeout": 5,
              "HttpCode": "http_2xx,http_3xx,http_4xx,http_5xx"
          },
          "Scheduler": "wrr"
      }
    },
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "LoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}
在负载均衡上挂载ECS资源

最后我们挂载相对应的ECS,并设置权重。权重的范围为0-100。权重0代表着优雅的下线,将不再输入流量。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "InstanceOne": {
      "Description": "需要挂载的ECS的实例Id",
      "Type": "String"
    },
     "InstanceTwo": {
      "Description": "需要挂载的ECS的实例Id",
      "Type": "String"
    },   
  },
  "Resources": {
    "LoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    },
    "CreateListener": {
      "Type": "ALIYUN::SLB::Listener",
      "Properties": {
          "LoadBalancerId": {"Ref": "LoadBalancer"},
          "ListenerPort": "80",
          "BackendServerPort": 8080,
          "Bandwidth": 1,
          "Protocol": "http",
          "HealthCheck": {
              "HealthyThreshold": 3,
              "UnhealthyThreshold": 3,
              "Interval": 2,
              "Timeout": 5,
              "HttpCode": "http_2xx,http_3xx,http_4xx,http_5xx"
          },
          "Scheduler": "wrr"
      }
    },
    "AttachEcs": {
      "Type": "ALIYUN::SLB::BackendServerAttachment",
      "Properties": {
        "LoadBalancerId": {"Ref": "LoadBalancer"},
        "BackendServers": [
            {
                "ServerId": {"Ref": "InstanceOne"},
                "Weight": 100
            },
             {
                "ServerId": {"Ref": "InstanceTwo"},
                "Weight": 100
            }           
        ]
      }    
    }
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "LoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}

当开发和测试完成之后,您可以通过删除资源栈,这样创建的负载均衡,监听将会被快速的删除。

通过抽象化的模板。可以把日常的挂载SLB和卸载SLB通过资源编排的模板来快速的实现,降低重复劳动,提升发布效率。

为了更加方便的简化您的操作,我们将在下篇讲解SLB的Clone。