Setup
To start with launch two instances, we'll call them lb-1.example.com
and lb-2.example.com
. One will have a public IP and one won't (check the box when creating an instance that says "Private networking only - don't assign a public IPv4 address"), generate each one with a random password rather than SSH key (this will come in handy later!)
We'll use Ubuntu 16.04 XS instances, but you can likely use any OS, provided you know how to script it as the way we'll do this is very basic functionality in Linux.
This shows a live IP address (185.136.235.217) but we'll use your.public.ip.address
throughout the rest of the guide.
The plan
We will install something that will serve HTTP requests on both servers. We'll write a script on each instance that checks every minute if HTTP responds on the public IP, if not, switch it to the current machine using the API. You could choose to do this more frequently, you could do it on a separate (and therefore independent) monitoring instance, but this will work to demonstrate the IP address transfer API.
The script
Create a file on both machines called /usr/local/bin/ha-switch.sh
that contains the following:
#!/bin/bash
CURRENT_INSTANCE_ID=94c65d21-e5f7-4462-a55e-91d549f889da
PUBLIC_IP=your.public.ip.address
API_TOKEN=abcdef0123456789abcdef0123456789
r=`wget -q http://$PUBLIC_IP`
if [ $? -ne 0 ]; then
curl -H "Authorization: bearer $API_TOKEN" -X PUT \
https://api.civo.com/v2/instances/$CURRENT_INSTANCE_ID/ip/$PUBLIC_IP
fi
This script sets up a few variables (you should adjust the three variables CURRENT_INSTANCE_ID
(this should change to be the instance ID of each instance, it's in the URL of the instance's details page), PUBLIC_IP
and API_TOKEN
(from https://www.civo.com/api when logged in). It then requests the webpage over HTTP and if wget
exits with an error condition then make the "Moving a public IP between instances" API call to switch the public IP to point to this instance instead.
Remember to finish by making the script executable with chmod +x /usr/local/bin/ha-switch.sh
. On the second machine lb-2.example.com
remember it currently doesn't have inbound access from the internet (because it currently has no public IP), so you should connect to it using ssh root@your.public.ip.address
first then from that instance use ssh root@lb2.internal.ip.address
to connect over the private network. Remember this is why we created them with passwords (unless you want to get in to SSH Agent Forwarding).
Running it regularly
This part is very easy, simply run crontab -e
and add a line like this:
* * * * * /usr/local/bin/ha-switch.sh
Getting the website up and running
Normally at this point, you'd install and configure your web site (or already have it running), but for now we'll just install Apache on both machines using:
apt update && apt install -y apache2
And you should then be able to hit http://your.public.ip.address/ in a browser and see a standard apache page:
The test
Now let's simulate a failure. lb-1.example.com
has the public IP, so SSH in to that machine and run the command:
service apache2 stop
Apache will go down and within a minute the control panel will reflect that the IP address has switched over to the lb-2.example.com
instance and HTTP traffic is being served again.