/govip

Primary LanguageGoApache License 2.0Apache-2.0

Govip

Govip is an application to ensure an IP address is set on one of the servers at any given time, to keep a service available during a failure. It's similar to the popular keepalived but instead of using VRRP it needs an etcd cluster to decide which node should have the address.

It's a small application useful in scenarios where an etcd is already deployed. We deploy etcd, apiserver, haproxy and govip instances together on kubernetes master nodes in bare-metal deployments. One of the govips place the VIP on one of the nodes, so the API traffic is received on the haproxy running on that node which proxies to all apiservers.

Synchronization between govip instances is accomplished using etcd concurrency API. Instances will try to become the election leader and claim the VIP address only when they succeed. This means the entire process relies on etcd. If the etcd cluster is down you won't have a VIP on any of the servers. If it's up and functioning correctly, you won't have a split brain issue. That's the objective anyway.

Building

go build -o govip -ldflags "-X main.Version=1.0.0"

Running

Usage of ./govip:
  -cacert string
        etcd CA cert (default "ca.crt")
  -cert string
        etcd cert file (default "server.crt")
  -etcd string
        etcd address(es) (default "https://127.0.0.1:2379")
  -key string
        etcd key file (default "server.key")
  -member string
        Unique name for this govip (default "hostname")
  -name string
        Position to synchronize multiple govips (default "/govip/")
  -version
        Print version and exit
  -vif string
        Interface to announce the VIP from (default "eth0")
  -vip string
        VIP to announce from the selected govip (default "192.168.0.254/32")

govip will stop if it can't reach the configured etcd cluster. So you should run it using a supervisor capable of restarting it, like systemd. An example file is in the repository.

In practice you would run more than one instance of govip on different nodes using the same -name, -vip and etcd details but with different -member parameters.