ok, recently i am trying to setup a low cost HA on the cloud. And i decide to go with Vultr since they provide $2.5 machine for me to test and play around (although i can only spam 2 of such machine) Here i will drop down how i did it so i won't forget and you can copy it if you want.
Initial Cloud VPS Setup
ok here, you will need at least 3 machines, i'll call them the following with the spec i've used to create this setup
- Ubuntu 17.10 x64 1024 MB Server - 192.168.23.10 [Worker1]
- Ubuntu 17.10 x64 512 MB Server - 192.168.23.11 [Worker2]
- Ubuntu 17.10 x64 512 MB Server - 192.168.23.11 [Worker3]
- Floating IP - 192.168.10.10
i name them worker1, worker2 and worker3 as show above. Now, the reason why i choose Ubuntu 17 instead of CoreOS is purely because CoreOS is stuck at Docker 1.12 the time i am writing and you need to install its Alpha version to get Docker 17.09-ce
Note: You should not attach the floating IP to any particular instance via your control panel. If an IP is attached via the control panel, high availability will not function properly.
Installing lastest
Docker on Ubuntu 17.10
Fire the following comment on each machine,
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce -y
and if it doesn't work, most likely docker doesn't support your newest Ubuntu and you have to switch it to a lower one as show below,
vi /etc/apt/sources.list
change artful to zesty
deb [arch=amd64] https://download.docker.com/linux/ubuntu zesty stable
then go ahead and install again.
Once its done, check the version. You should get something like this below,
root@worker1:/etc/bird# docker -v
Docker version 17.09.0-ce, build afdb6d4
once this is done, we are going to install blue for BGP
Installing and Configuring BGP using Bird in Ubuntu 17.10
First, do yourself a favor and add its repo
sudo add-apt-repository ppa:cz.nic-labs/bird
apt-get update -y
once this is done, you'll get an error because it doesn't support Ubuntu 17.10 yet. Hence, gonna go downwards again.
vi /etc/apt/sources.list.d/cz_nic-labs-ubuntu-bird-artful.list
change it to the below,
deb http://ppa.launchpad.net/cz.nic-labs/bird/ubuntu xenial main
save it and try to install bird below,
sudo apt-get install bird
And we have bird installed. Now to configure it, we will paste the following into /etc/bird/bird.conf
log "/var/log/bird" all;
router id 192.168.23.10; # instance ip
protocol device
{
scan time 60;
}
protocol direct
{
interface "dummy1";
}
protocol bgp vultr
{
local as 11512; #instances ASN number
source address 192.168.23.10; #instance ip
import none;
export all;
graceful restart on;
next hop self;
multihop 2;
neighbor 169.254.169.252 as 64019; #vultr IP and ASN number
password "xC4c2EGaXuP7a74!"; #vulr password
}
then proceed to restart
service bird restart
service bird status
● bird.service - BIRD Internet Routing Daemon (IPv4)
Loaded: loaded (/lib/systemd/system/bird.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-10-30 10:30:51 UTC; 19min ago
Process: 5140 ExecStartPre=/usr/sbin/bird -p (code=exited, status=0/SUCCESS)
Process: 5130 ExecStartPre=/usr/lib/bird/prepare-environment (code=exited, status=0/SUCCESS)
Main PID: 5145 (bird)
Tasks: 1 (limit: 4915)
Memory: 640.0K
CPU: 53ms
CGroup: /system.slice/bird.service
└─5145 /usr/sbin/bird -f -u bird -g bird
Oct 30 10:30:51 worker_a systemd[1]: Starting BIRD Internet Routing Daemon (IPv4)...
Oct 30 10:30:51 worker_a systemd[1]: Started BIRD Internet Routing Daemon (IPv4).
now make sure you have the above, if not, its most likely because your log permission is set as root, if that's the case, try the below,
chown bird:bird /var/log/bird
and restart bird again. Ensure your firewall isn't blocking port 179 for BGP to communicate with your machine. Once this is done, you can test it out externally via telnet
telnet 192.168.23.10 179
Trying 192.168.23.10...
Connected to 192.168.23.10.vultr.com.
Escape character is '^]'.
Connection closed by foreign host.
you should get something like this. Now, the most important part if not you will get the following
birdc show proto all vultr
BIRD 1.6.3 ready.
name proto table state since info
vultr BGP master start 13:49:30 Idle Received: Bad peer AS
Preference: 100
Input filter: REJECT
Output filter: ACCEPT
Routes: 0 imported, 0 exported, 0 preferred
Route change stats: received rejected filtered ignored accepted
Import updates: 0 0 0 0 0
Import withdraws: 0 0 --- 0 0
Export updates: 0 0 0 --- 0
Export withdraws: 0 --- --- --- 0
BGP state: Idle
Neighbor address: 169.254.169.254
Neighbor AS: 64515
Error wait: 10/300
Last error: Received: Bad peer AS
Setup Dummy IP Configuration
run the following to create a dummy IP configuration for your Bird to forward to
ip link add dev dummy1 type dummy
ip link set dummy1 up
ip addr add dev dummy1 192.168.10.10
where 192.168.10.10 is the floating IP. Now you can test whether the above setup is correct with the following
ip addr show dev dummy1
6: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 4e:79:76:36:6d:b0 brd ff:ff:ff:ff:ff:ff
inet 45.77.110.78/32 scope global dummy1
valid_lft forever preferred_lft forever
inet6 fe80::4c79:76ff:fe36:6db0/64 scope link
valid_lft forever preferred_lft forever
Now, restart your Bird so that it gets the above dummy. To set it persistently, do the following
vi /etc/rc.local
ip link add dev dummy1 type dummy
ip link set dummy1 up
ip addr add dev dummy1 192.168.10.10/32
then restart or reboot your machine
service bird restart
Once this is done, you should get the following,
birdc show proto all vultr
BIRD 1.6.3 ready.
name proto table state since info
vultr BGP master up 14:44:15 Established
Preference: 100
Input filter: REJECT
Output filter: ACCEPT
Routes: 0 imported, 1 exported, 0 preferred
Route change stats: received rejected filtered ignored accepted
Import updates: 0 0 0 0 0
Import withdraws: 0 0 --- 0 0
Export updates: 1 0 0 --- 1
Export withdraws: 0 --- --- --- 0
BGP state: Established
Neighbor address: 169.254.169.254
Neighbor AS: 64515
Neighbor ID: 208.167.241.119
Neighbor caps: refresh restart-aware AS4 add-path-rx
Session: external multihop AS4
Source address: 45.77.78.111
Hold timer: 132/180
Keepalive timer: 29/60
Once you get this, all should be good. Try it out.