全部产品
云市场

挂载SLB

更新时间:2020-01-20 13:20:13

负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端服务的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。负载均衡后端继支持添加ECS实例、弹性网卡后,如今已经开始支持ECI实例。不论是直接将ECI实例作为后端服务的场景,还是k8s+vk的场景,这一功能都非常重要。下面将介绍把ECI实例添加至负载均衡(后文将统一简称slb)后端的基本流程。

准备工作

创建ECI实例

我们创建两个ECI实例,每个实例跑一个nginx服务(建议开启ECI日志收集),端口号都是80。如下:

ECI-SLB-1

创建负载均衡

创建一个新的slb实例或者用已有的,本例使用一个带有公网能力的slb。如下:

eci-slb-2

添加ECI到slb的后端

目前slb控制台还不支持直接挂ECI,所以要通过slb的openAPI,我们以java sdk为例。

添加后端服务:

  1. AddBackendServersRequest addBackendServersRequest = new AddBackendServersRequest();
  2. addBackendServersRequest.setLoadBalancerId(SLB_ID);
  3. List<BackendServer> backendServers = new ArrayList<>();
  4. ECI_IDS.forEach(eciId -> {
  5. SetBackendServersResponse.BackendServer slbBackendServer = new SetBackendServersResponse.BackendServer();
  6. slbBackendServer.setServerId(eciId);
  7. slbBackendServer.setWeight("100");
  8. slbBackendServer.setType("eci");
  9. backendServers.add(slbBackendServer);
  10. });
  11. addBackendServersRequest.setBackendServers(new Gson().toJson(backendServers));
  12. client.getAcsResponse(addBackendServersRequest);

获取完整代码

注:只有运行中的ECI,如Pending、Running、以及Restarting、Updating才支持添加到slb的后端;已经到达终态的ECI,如Succeeded、Failed不支持添加;创建中的ECI,如Scheduling的不保证

查询后端服务状态:

  1. //需要先参考下面的步骤,在SLB控制台完成设置
  2. DescribeHealthStatusRequest describeHealthStatusRequest = new DescribeHealthStatusRequest();
  3. describeHealthStatusRequest.setLoadBalancerId(SLB_ID);
  4. try {
  5. client.getAcsResponse(describeHealthStatusRequest);
  6. } catch (ClientException e) {
  7. e.printStackTrace();
  8. }

获取完整代码

返回:

  1. {
  2. "backendServers":[
  3. {
  4. "bizProtocol":"tcp",
  5. "listenerPort":80,
  6. "port":80,
  7. "protocol":"tcp",
  8. "serverHealthStatus":"normal",
  9. "serverId":"eci-bp1edrpb6jjcltu2c0iz",
  10. "serverIp":"192.168.7.32"
  11. },
  12. {
  13. "bizProtocol":"tcp",
  14. "listenerPort":80,
  15. "port":80,
  16. "protocol":"tcp",
  17. "serverHealthStatus":"normal",
  18. "serverId":"eci-bp1a28amc48d47w922jd",
  19. "serverIp":"192.168.7.33"
  20. }
  21. ],
  22. "requestId":"4DC09389-910F-44D7-A60A-ABD73D9AA3B4"
  23. }

可以看到已经添加成功了(也可以直接通过登录slb控制台查看)。

移除后端服务

删除ECI前可以不用显式地从slb后端剔除,ECI在删除的时候会自动帮用户剔除。到达终态的ECI,如Succeeded、Failed也会被自动从slb后端剔除。

  1. RemoveBackendServersRequest removeBackendServersRequest = new RemoveBackendServersRequest();
  2. removeBackendServersRequest.setLoadBalancerId(SLB_ID);
  3. List<SetBackendServersResponse.BackendServer> backendServers = new ArrayList<>();
  4. ECI_IDS.forEach(eciId->{
  5. SetBackendServersResponse.BackendServer slbBackendServer = new SetBackendServersResponse.BackendServer();
  6. slbBackendServer.setServerId(eciId);
  7. slbBackendServer.setWeight("100");
  8. slbBackendServer.setType("eci");
  9. backendServers.add(slbBackendServer);
  10. });
  11. removeBackendServersRequest.setBackendServers(new Gson().toJson(backendServers));
  12. try {
  13. client.getAcsResponse(removeBackendServersRequest);
  14. } catch (ClientException e) {
  15. e.printStackTrace();
  16. }

获取完整代码

Slb控制台设置(首次需要配置)

监听配置

进入slb控制台,可以看到通过api添加的ECI实例已经在控制台的后端服务列表中了(因为暂时还没和ECI控制台进行关联,所以不支持跳转,但是显示的实例id是准确的,控制台关联很快就会支持)。

eci-slb-3

设置调度算法

默认为根据加权轮询

eci-slb-4

默认后端服务器

nginx默认是监听80端口,所以设置端口分别是80,权重根据业务分配,具体的数字不重要,主要是看比例值。

eci-slb-5

健康检查

eci-slb-6

验证

在本地curl slb的公网ip(重复多次):

  1. liumihustdeMacBook-Pro:~ liumihust$ curl 47.96.65.203 80

通过查看ECI的日志,可以看到请求通过slb被分发到了不同的eci实例上。

eci-slb-7