Introduction

This documents gives an overview to the design and functional implementation for Internal Load Balancing on VPC tiers.

Feature developers:

Glossary

Use case

There are 2 tiers in the VPC - Web tier and Application tier. Traffic to Web tier is balanced on the VPC VR on the public side. User wants traffic coming from Web to the App tier to be balanced as well. Load balancing on the App tier will be covered by the Internal LB feature.

Internal LB can be handled by 2 network providers:

The pic below is for the case when InternalLBVm is used as a provider for the LB service on internal tier:

  1. Public LB rule for 72.52.125.10 Public IP, public port 80 and private port 81. It enables LB for traffic coming from the internet to the vms on the Web tier. The LB rule is configured on the VPC VR.
  2. Internal LB rule #1 for 10.10.10.4 guest IP, loadBalancerPort 23 and instancePort 25. The LB rule is configured on InternalLBVM1.
  3. Internal LB rule #2 for 10.10.10.4 guest IP, loadBalancerPort 45 and instancePort 46. The LB rule is configured on InternalLBVM1.
  4. Internal LB rule #3 for 10.10.10.6 guest IP, loadBalancerPort 23 and instancePort 25. The LB rule is configured on InternalLBVM2.

General flow

1) Enable Internal LB on VPC tier

In order to have Internal Load Balancing support on VPC tier, the tier has to be created from the network offering with:

or

Java code changes

Backend changes

TBD. We might need a separate template/set of scripts for Internal LB VM, or we can re-use the existing VR template.

Web Services API

Changes to existing Apis: list/createNetworkOffering APIs will return new parameters in the response - internal_lb and public_lb:. The parameters' type is boolean.

New APIs:

Api Name

Request Parameters

Response parameters

Available to regular user

createInternalLoadBalancerElement

nspid(required) - network service provider UUID

  • id
  • nspid
  • enabled
  • type (always has value of internal_lb_vm)

no

configureInternalLoadBalancerElement

  • id (required) - id of the element
  • enabled(required, boolean) 

the same response as of createInternalLoadBalancerElement

no

listInternalLoadBalancerElements

  • id
  • nspid
  • enabled

the same response as of createInternalLoadBalancerElement

no


no

DB changes

2) Create Load Balancer Rule 

Java code changes

If provider is InternalLBVM:

If LB provider is Netscaler VPX:

Backend changes

TBD. For InternalLBVM, have to put HA proxy management/configuration details here

Web Services API

Introduce new APIs

API Name

Request Parameters

Response parameters

Available to regular user

createLoadBalancer 

  • name (required, unique) - name of the LB
  • displayText (required) - display text of the LB
  • networkId (required) - the guest network id the Load Balancer belongs to. 
  • sourceIpAddressNetworkId (required) - 
  • sourceIpAddress (optional) - source IP address. Has to be specified with sourceIpNetworkId. If not specified, the IP address will be required from the network
  • scheme (required) - supported values Internal/Public
  • algorithm (required)
  • sourcePort (required)
  • instancePort (required)

LoadBalancer object:

  • id
  • name
  • displayText
  • networkId
  • algorithm
  • sourceIpAddressNetworkId
  • sourceIpAddress
  • scheme (Public/Internal)
  • list of LoadBalancerRules objects
  • list of LoadBalancerInstance objects
    LoadBalancerRule object:
  • sourcePort
  • instancePort
    LoadBalancerInstance object:
  • instanceId
  • instanceName

yes

deleteLoadBalancer

  • id (required) - load balancer id
  • true/false

yes

listLoadBalancers

  • id
  • name
  • networkId
  • sourceIpAddressNetworkId
  • sourceIpAddress
  • scheme

list of LoadBalancer objects (see the structure in createLoadBalancer command description)

yes

DB changes

TBD

3) Attach VM to the Load Balancer

Existing API are going to be used to assign/remove vm to/from the load balancer

assignToLoadBalancerRule

assignToLoadBalancerRule

How to list Guest IP addresses allocated for LB purpose

At the moment, cloudStack doesn't expose any API for listing IP addresses from the guest network. You see all the ip addresses allocated by the load balancers by executing the following command:

listLoadBalancers&scheme=Internal&networkId=<Id of the network the load balancer belongs to>

Internal Load Balancing Vm management and life cycle

1) The InternalLBVM will be created with 2 interfaces: eth0 - linkLocal (private in VMWare case), eth1 - the IP address of the LB rule.

2) InternalLBVM will be managed by InternalLoadBalancerVMManager

3) InternalLBVM life cycle:

4) To stop/start/list internal lb vm, use existing stop/start/listRouters command.

Limitations

UI

TBD