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.confyum -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
EOFsystemctl enable powergslb.service pdns.service
systemctl start powergslb.service pdns.service
systemctl status powergslb.service pdns.serviceyum -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 ANYOpen 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