PowerGSLB is a simple DNS based Global Server Load Balancing (GSLB) solution.
- Main features
- Database diagram
- Class diagram
- Web based administration interface
- Installation on CentOS 7
- Health checks
- Building PowerGSLB RPM packages
- Using PowerGSLB Docker image
- Building PowerGSLB Docker image
- Quick installation and setup
- Written in Python 2.7
- Built as PowerDNS Authoritative Server Remote Backend
- Web based administration interface using w2ui
- HTTPS support for the web server
- DNS GSLB configuration stored in a MySQL / MariaDB database
- Master-Slave DNS GSLB using native MySQL / MariaDB replication
- Multi-Master DNS GSLB using native MySQL / MariaDB Galera Cluster
- Modular architecture
- Multithreaded architecture
- Systemd status and watchdog support
- Extendable health checks:
- ICMP ping
- TCP connect
- HTTP request
- Arbitrary command execution
- Fallback if all the checks failed
- Weighted (priority) records
- Per record client IP / subnet persistence
- DNS GSLB views support
- All-in-one Docker image
yum -y install epel-release
yum -y update
yum -y install python2-pip
pip install pyping
VERSION=1.7.4
yum -y --setopt=tsflags= install \
"https://github.com/AlekseyChudov/powergslb/releases/download/$VERSION/powergslb-$VERSION-1.el7.noarch.rpm" \
"https://github.com/AlekseyChudov/powergslb/releases/download/$VERSION/powergslb-admin-$VERSION-1.el7.noarch.rpm" \
"https://github.com/AlekseyChudov/powergslb/releases/download/$VERSION/powergslb-pdns-$VERSION-1.el7.noarch.rpm"
sed -i 's/^password = .*/password = your-database-password-here/g' /etc/powergslb/powergslb.conf
cp /etc/pdns/pdns.conf /etc/pdns/pdns.conf~
cp "/usr/share/doc/powergslb-pdns-$VERSION/pdns/pdns.conf" /etc/pdns/pdns.conf
yum -y install mariadb-server
sed -i '/\[mysqld\]/a bind-address=127.0.0.1\ncharacter_set_server=utf8' /etc/my.cnf.d/server.cnf
systemctl enable mariadb.service
systemctl start mariadb.service
systemctl status mariadb.service
mysql_secure_installation
VERSION=1.7.4
mysql -p << EOF
CREATE DATABASE powergslb;
GRANT ALL ON powergslb.* TO powergslb@localhost IDENTIFIED BY 'your-database-password-here';
USE powergslb;
source /usr/share/doc/powergslb-$VERSION/database/scheme.sql
source /usr/share/doc/powergslb-$VERSION/database/data.sql
EOF
systemctl enable powergslb.service pdns.service
systemctl start powergslb.service pdns.service
systemctl status powergslb.service pdns.service
yum -y install bind-utils
dig @127.0.0.1 example.com SOA
dig @127.0.0.1 example.com A
dig @127.0.0.1 example.com AAAA
dig @127.0.0.1 example.com ANY
Open URL https://SERVER/admin/.
- Default username: admin
- Default password: admin
Health checks are configured in the "Monitors" sidebar section in JSON format.
Supported check types:
type | description |
---|---|
exec | arbitrary command execution |
icmp | ICMP ping |
http | HTTP request |
tcp | TCP connect |
General parameters for all checks:
parameter | description |
---|---|
type | check type |
interval | interval between checks |
timeout | check timeout |
fall | number of failed checks to disable record |
rise | number of successful checks to enable record |
parameter | description |
---|---|
type | exec |
args | command to execute and arguments |
Example:
{"type": "exec", "args": ["/etc/powergslb/powergslb-check", "%(content)s"], "interval": 3, "timeout": 1, "fall": 3, "rise": 5}
parameter | description |
---|---|
type | icmp |
ip | endpoint IP address |
Example:
{"type": "icmp", "ip": "%(content)s", "interval": 3, "timeout": 1, "fall": 3, "rise": 5}
parameter | description |
---|---|
type | http |
url | endpoint URL |
Example:
{"type": "http", "url": "http://%(content)s/status", "interval": 3, "timeout": 1, "fall": 3, "rise": 5}
parameter | description |
---|---|
type | tcp |
ip | endpoint IP address |
port | endpoint port number |
Example:
{"type": "tcp", "ip": "%(content)s", "port": 80, "interval": 3, "timeout": 1, "fall": 3, "rise": 5}
You should always create RPM packages in a clean environment and preferably on a separate machine!
Please read How to create an RPM package.
yum -y update
yum -y install @Development\ Tools
VERSION=1.7.4
curl "https://codeload.github.com/AlekseyChudov/powergslb/tar.gz/$VERSION" -o "powergslb-$VERSION.tar.gz"
rpmbuild -tb --define "version $VERSION" "powergslb-$VERSION.tar.gz"
Upon successful completion you will have three packages
~/rpmbuild/RPMS/noarch/powergslb-$VERSION-1.el7.noarch.rpm
~/rpmbuild/RPMS/noarch/powergslb-admin-$VERSION-1.el7.noarch.rpm
~/rpmbuild/RPMS/noarch/powergslb-pdns-$VERSION-1.el7.noarch.rpm
For quick setup, you can pull all-in-one Docker image from docker.io.
VERSION=1.7.4
docker pull docker.io/alekseychudov/powergslb:"$VERSION"
docker run -it --name powergslb --hostname powergslb \
-p 53:53/tcp -p 53:53/udp -p 443:443/tcp \
--tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
docker.io/alekseychudov/powergslb:"$VERSION"
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' powergslb
docker exec -it powergslb bash
docker stop powergslb
For systemd to run in Docker container the following SELinux boolean should be enabled.
semanage boolean --modify --on container_manage_cgroup
To create an all-in-one Docker image.
VERSION=1.7.4
docker build -f docker/Dockerfile --build-arg VERSION="$VERSION" \
--force-rm --no-cache -t powergslb:"$VERSION" https://github.com/AlekseyChudov/powergslb.git