A Load-balancer made from steel

Related tags

Network slb
Overview

slb

The Steel Load Balancer

A load-balancer forged in the fires of Sheffield

Getting slb

Prebuilt binaries for armv7 and amd64 exist in the releases page, or grab the source and go build away 🤓

How it works!

The slb automates a number of seperate tasks to provide the end user a simple to use load-balancing experience. It provides a simple API endpoint and will automatically create a load-balancer endpoint (IP address), which a user can easily add backend servers too.

Requirements

The requirements are very lightweight!!

  • Linux host (running a 3.x+ kernel)
  • Layer 2 network (for ARP)
  • Layer 3 network (for BGP)

It supports both x86 and arm, and will run happily on a Raspberry pi!

Architecture

The Machine that is running slb will create an API endpoint on port 10001 that is used to create load-balancers, this API endpoint is used to create/update and delete load-balancer instances.

  • In Layer2 slb should be started with an IPAM range to create loadbalancers with
  • In layer3 slb will use the Equinix Metal API to select an IP address.

This new load-balancer is then advertised to the outside world through either network mechanism. We can now use the API to add backend server:port to this load-balancer instance at this point we will use IPVS to create a NAT based round-robin load-balancer instance.

Using SLB

When running on a layer 2 network

The below example will create an slb server that listens on port 10001 and will generate load-balancers in the ipamRange specified.

./slb server \
      --arp \
      --adapter eth0 \
      --ipamRange 192.168.0.85-192.168.0.90

Example output

INFO[0000] Starting the Steel Load-Balancer
INFO[0000] API Server will be exposed on [0.0.0.0:10001]
INFO[0000] Enabled IPv4 Forwarding in the kernel
INFO[0000] Enabled Connection tracking in the kernel

When using Equinix Metal (Layer 3)

The Auth token is required in order for API queries:

export PACKET_AUTH_TOKEN=""

Also required are the project and facility IDs so that Equinix Metal Elastic IPs are created in the correct facility/project.

./slb server \
      --adapter lo \
      --bgp \
      --equinixMetal \
      --project xxxx \
      --facility xxxx

Example output

INFO[0000] Starting the Steel Load-Balancer
INFO[0000] API Server will be exposed on [0.0.0.0:10001]
INFO[0000] Enabled IPv4 Forwarding in the kernel
INFO[0000] Enabled IPv4 Virtual Server connection tracking in the kernel
INFO[0002] Querying BGP settings for [am6-c3.small.x86-01]
INFO[0002] Add a peer configuration for:169.254.255.1    Topic=Peer
INFO[0002] Add a peer configuration for:169.254.255.2    Topic=Peer
INFO[0007] Peer Up                                       Key=169.254.255.1 State=BGP_FSM_OPENCONFIRM Topic=Peer
2021/11/12 13:40:02 conf:<local_as:65000 neighbor_address:"169.254.255.1" peer_as:65530 > state:<local_as:65000 neighbor_address:"169.254.255.1" peer_as:65530 session_state:ESTABLISHED router_id:"147.75.86.18" > transport:<local_address:"10.12.39.1" local_port:34481 remote_port:179 >
INFO[0008] Peer Up                                       Key=169.254.255.2 State=BGP_FSM_OPENCONFIRM Topic=Peer
2021/11/12 13:40:03 conf:<local_as:65000 neighbor_address:"169.254.255.2" peer_as:65530 > state:<local_as:65000 neighbor_address:"169.254.255.2" peer_as:65530 session_state:ESTABLISHED router_id:"147.75.86.19" > transport:<local_address:"10.12.39.1" local_port:45091 remote_port:179 >

Create a load-balancer

curl -X POST http://<host>:10001/loadbalancer -H 'Content-Type: application/json' -d '{"name":"test loadbalancer", "port": 6443}'

We can view this new loadbalancer through the API or on the cli where slb is running!

curl -s http://<host>:10001/loadbalancers | jq
[
  {
    "uuid": "087fcb0f-8e07-4123-a32f-e8e83a281023",
    "name": "test loadbalancer",
    "eip": "147.75.84.41",
    "port": 6443,
    "backends": null
  }
]

Add a backend

We can use the API to add a backend service to our load-balancer instance!

curl -X POST http://<host>:10001/loadbalancer/087fcb0f-8e07-4123-a32f-e8e83a281023/backend -d '{"ip":"10.80.96.25", "port": 6443}'

curl -s http://<node>:10001/loadbalancers | jq
[
  {
    "uuid": "087fcb0f-8e07-4123-a32f-e8e83a281023",
    "name": "test loadbalancer",
    "eip": "145.40.96.223",
    "port": 6443,
    "backends": [
      {
        "uuid": "779344ce-72ca-4aec-a1c0-d9c5c4d72419",
        "ip": "10.80.96.25",
        "port": 6443
      }
    ]
  }
]

View load-balancer in ipvs

On our slb node we can inspect in more detail our load-balancer setup

ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  145.40.96.223:6443 rr
  -> 10.80.96.25:6443             Masq    1      0          0

Delete a load-balancer

The following API call will delete the EIP, stop bgp and remove the IPVS service.

curl -X DELETE http://<node>:10001/loadbalancer/087fcb0f-8e07-4123-a32f-e8e83a281023
Releases(v0.1.0)
  • v0.1.0(Nov 12, 2021)

    What's Changed

    • Big-rewrite by @thebsdbox in https://github.com/steel-load-balancer/slb/pull/1
    • Loads of new stuff by @thebsdbox in https://github.com/steel-load-balancer/slb/pull/2
    • Fixes to Makefile and api by @thebsdbox in https://github.com/steel-load-balancer/slb/pull/3

    New Contributors

    • @thebsdbox made their first contribution in https://github.com/steel-load-balancer/slb/pull/1

    Full Changelog: https://github.com/steel-load-balancer/slb/commits/v0.1.0

    Source code(tar.gz)
    Source code(zip)
    slb-amd64-v0.1.0.tar.gz(5.77 MB)
    slb-armv7-v0.1.0.tar.gz(5.25 MB)
Kiwi-balancer - A balancer is a gateway between the clients and the server

Task description Imagine a standard client-server relationship, only in our case

Jozef Lami 0 Feb 11, 2022
A modern layer 7 load balancer from baidu

BFE BFE is a modern layer 7 load balancer from baidu. Advantages Multiple protocols supported, including HTTP, HTTPS, SPDY, HTTP2, WebSocket, TLS, Fas

null 5.6k Aug 15, 2022
High-performance PHP application server, load-balancer and process manager written in Golang

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Spiral Scout 6.7k Aug 12, 2022
A load balancer supporting multiple LB strategies written in Go

farely A load balancer supporting multiple LB strategies written in Go. Goal The goal of this project is purley educational, I started it as a brainst

Mehdi Cheracher 11 Aug 7, 2022
gobetween - modern & minimalistic load balancer and reverse-proxy for the ☁️ Cloud era.

gobetween - modern & minimalistic load balancer and reverse-proxy for the ☁️ Cloud era. Current status: Maintenance mode, accepting PRs. Currently in

Yaroslav Pogrebnyak 1.7k Aug 10, 2022
KgLb - L4 Load Balancer

KgLb KgLb is L4 a load balancer built on top of linux ip virtual server (ip_vs). It provides rich functionality such as discovery, health checks for r

Dropbox 129 Mar 10, 2022
Simple Reverse Proxy Load Balancer

lb - a reverse proxy load-balancing server, It implements the Weighted Round Robin Balancing algorithm

Blessing Pariola 3 Mar 23, 2022
A distributed Layer 2 Direct Server Return (L2DSR) load balancer for Linux using XDP/eBPF

VC5 A distributed Layer 2 Direct Server Return (L2DSR) load balancer for Linux using XDP/eBPF This is very much a proof of concept at this stage - mos

David Coles 30 Jul 31, 2022
Basic Load Balancer

Load Balancer Work flow based on code snippet Trade-offs: 1. Using etcd as a global variable map. 2. Using etcd to store request references rather tha

Nikhil Vasudev 0 Nov 1, 2021
Vippy - A Virtual IP/BGP/IPVS Load-Balancer for Equinix Metal

Vippy - A Virtual IP/BGP/IPVS Load-Balancer for Equinix Metal If I figure out how to make it work.. How it works! The Vippy LB PoC uses BGP/IPVS and E

Daniel Finneran 5 Mar 10, 2022
Lightweight http response time based load balancer written in Go

HTTP Load Balancer Specifications http servers should always return time taken to proceed request in headers as EXECUTION_TIME in ms this load balance

Gaëtan 0 Feb 22, 2022
High-performance PHP application server, load-balancer and process manager written in Golang

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Spiral Scout 6.1k Dec 9, 2021
A Service Load Balancer for Kubernetes.

PureLB - is a Service Load Balancer for Kubernetes PureLB is a load-balancer orchestrator for Kubernetes clusters. It uses standard Linux networking a

PureLB 26 Jul 29, 2022
Consistelancer - Consistent hashing load balancer for Kubernetes

Setup minikube start kubectl apply -f k8s-env.yaml skaffold dev # test locks ku

null 1 Jan 12, 2022
Simple load-balancer for npchat servers, based on the xor distance metric between node & user id

npchat-helmsman Simple load-balancer for npchat servers, based on the xor distance metric between node & user id. Local Development Clone this reposit

npchat 0 Jan 15, 2022
Consul Load-Balancing made simple

Notes From release 1.5.15 onward, fabio changes the default GOGC from 800 back to the golang default of 100.

fabio 7k Aug 15, 2022
Consul Load-Balancing made simple

Notes From release 1.5.15 onward, fabio changes the default GOGC from 800 back to the golang default of 100. Apparently this made some sense back in t

fabio 7k Aug 14, 2022
Golang Super Simple Load Balance

SSLB (Super Simple Load Balancer) ver 0.1.0 It's a Super Simple Load Balancer, just a little project to achieve some kind of performance. Features Hig

Eduardo Pereira 141 Aug 6, 2022
Simple, fast and scalable golang rpc library for high load

gorpc Simple, fast and scalable golang RPC library for high load and microservices. Gorpc provides the following features useful for highly loaded pro

Aliaksandr Valialkin 652 Jul 24, 2022