Service Discovery with A Records
DNS A records map hostnames to IP addresses. You can configure HAProxy to query for these records and populate
server lines from the information that returns.
Configure DNS A records
Update your DNS nameserver to resolve a hostname, such as myservice.example.local, to one or more IP addresses using A records.
Query the nameserver
Query the nameserver directly with the
digtool to ensure that it returns the correct records, as follows:
Multiple IP addresses should return for the same hostname.
$ dig @192.168.50.30 -p 53 A myservice.example.local
;; QUESTION SECTION: ;myservice.example.local. IN A ;; ANSWER SECTION: myservice.example.local. 90 IN A 192.168.50.31 myservice.example.local. 90 IN A 192.168.50.32 myservice.example.local. 90 IN A 192.168.50.33
Configure a resolvers section
You add a
resolvers section in your HAProxy configuration file to set the DNS nameservers for HAProxy to watch for changes.
Edit the HAProxy configuration file
Add one or more
nameserverlines to specify the IP addresses and ports of your DNS nameservers.
accepted_payload_sizeto 8192 to allow larger DNS payloads, which is required to receive more server IPs within a single DNS result.
resolvers mydns nameserver dns1 192.168.50.30:53 accepted_payload_size 8192
Add a server-template
backendto set the template for the
serverlines when HAProxy queries your DNS servers, as follows:
server-template <prefix> <num | range> <fqdn>[:<port>] [params*]
A string used as a prefix for each server name. (e.g. web)
The number of servers you want to generate automatically. This number will increment and append to the
prefixof each server when forming its name.
The number of servers you want to generate automatically, specified as starting and ending numbers to append to the
prefixof each server when forming its name.
The fully-qualified domain name used to query the nameservers.
A hardcoded port number.
backend webservers balance roundrobin server-template web 5 myservice.example.local:80 check resolvers mydns init-addr none
In this example, the
Adds the specified number of servers (5) to the backend.
Their names will have "web" as a prefix.
The host name myservice.example.local is queried.
Port 80 is hardcoded.
resolverssection mydns is specified.
init-addr noneargument means that HAProxy can initialize without having to resolve the IP addresses at startup. They can be resolved during runtime.
When HAProxy reads this DNS result, it is equivalent to defining a
backendstatically that looks like this:
backend webservers balance roundrobin server web1 192.168.50.31:80 check server web2 192.168.50.32:80 check server web3 192.168.50.33:80 check server web4 check disabled server web5 check disabled
When you add more records to your nameserver, they will automatically go into the backend to fill in the web4 and web5 slots.
Check server status
You can monitor the status of these servers on the HAProxy Stats page, which shows the following:
Only one server is up (green) and actually listening.
The next two servers are down (red) due to failed health checks.
The last two servers, which don't have assigned IP addresses, are in maintenance mode and can't receive traffic.
To display a tooltip to indicate the server's IP address and port, add a line with
stats show legends to the
frontend section of the configuration file.
Inspect servers with HAProxy's Runtime API
To enable the HAProxy Runtime API, add a
stats socketdirective to the
globalsection of your configuration file:
global log stdout local0 stats socket :9000 mode 660 level admin
To see the servers loaded into memory, run the command
show servers state servers, as follows:
$ echo "show servers state servers" | nc localhost 9000
# be_id be_name srv_id srv_name srv_addr srv_fqdn srv_port srvrecord 3 servers 1 web1 192.168.50.33 myservice.example.local 80 - 3 servers 2 web2 192.168.50.31 myservice.example.local 80 - 3 servers 3 web3 192.168.50.32 myservice.example.local 80 - 3 servers 4 web4 - myservice.example.local 80 - 3 servers 5 web5 - myservice.example.local 80 -
This example shows five servers: web1, web2, web3, web4 and web5.
However, the DNS records returned IP addresses for only three servers.
When there are more servers generated from the template than there are DNS records, the extra servers do not get an assigned IP address; they show a dash where an IP address would normally go.
These servers start in maintenance mode and will pick up IP addresses as more DNS records return.