Home

Awesome

GORB Build Status codecov.io

Go Routing and Balancing

This daemon is an IPVS frontend with a REST API interface. You can use it to control local IPVS instance in the Kernel to dynamically register virtual services and backends. It also supports basic TCP and HTTP health checks (called Gorb Pulse).

Backends which fail to pass the health check will have weights set to zero to inhibit any traffic from being routed into their direction. When a backend comes back online, GORB won't immediately set its weight to the previous value, but instead gradually restore it based on backend's accumulated health statistics.

GORB also supports basic service discovery registration via Consul: just pass in the Consul endpoint to GORB and it will take care of everything else – your services will be registered with names like nginx-80-tcp. Keep in mind that you can use Consul's built-in DNS server to make it even easier to discover your services!

Check out these slides for my DockerCon EU 2015 talk for more information about IPVS, GORB and how to use it with Docker.

Configuration

There's not much of a configuration required - only a handlful of options can be specified on the command line:

gorb [-c <consul-address>] [-f flush-pools] [-i interface] [-l listen-address] | -h

By default, GORB will listen on :4672, bind services on eth0 and keep your IPVS pool intact on launch.

REST API

{
    "host": "10.0.0.1",
    "port": 12345,
    "protocol": "tcp|udp",
    "method": "rr|wrr|lc|wlc|lblc|lblcr|sh|dh|sed|nq|...",
    "persistent": true,
    "flags": "sh-fallback|sh-port",
}

This scheduler has two flags: sh-fallback, which enables fallback to a different server if the selected server was unavailable, and sh-port, which adds the source port number to the hash computation.

{
    "host": "10.1.0.1",
    "port": 12346,
    "method": "nat|tunnel",
    "pulse": {
        "type": "none|tcp|http",
        "args": {
            "method": "GET",
            "port": 54321,
            "path": "/health",
            "expect": 200
        },
        "interval": "5s"
    },
    "weight": 100
}

For more information and various configuration options description, consult man 8 ipvsadm.

Development

Use glide to install dependencies:

glide install -v

This should be done periodically to retrieve any updated dependencies.

TODO