Haproxy reload from consul-template

5/10/2021

I have multiple microservices running on my AWS ECS Fargate cluster. Inside a task (pod), there will be multiple containers (1 container for core-business service and additional 3 sidecar containers). Here are the list of those containers:

  • core-business service container (runs the core business service on specific port)
  • consul-agent container (runs consul-agent and joins it with the consul-master)
  • consul-template container (gets the service information from consul and updates the haproxy.cfg)
  • haproxy container (takes the haproxy.cfg from consul-template and runs)

All these containers are up and running fine as well. The problem is to reload the haproxy. Since the consul-template is responsible for updating the haproxy.cfg file, Should I need to add some configuration on consul-template itself to update the haproxy?

Here is the command I am currently using for consul-template:

consul-template -consul-addr=xx.xx.xx.xx:8500 -template /etc/consul-template/data/haproxy.cfg.ctmpl:/etc/consul-template/data/haproxy.cfg

What can I try to achieve this?

-- Deependra Dangal
consul
consul-template
docker
haproxy
kubernetes

1 Answer

6/17/2021

I am currently having the exact same issue, but for Nginx.

From my research, there is no good solution. The one that seems to work is to mount the volume

-v /var/run/docker.sock:/var/run/docker.sock

on the consul-template container.

I see you are using :

consul-template -consul-addr=xx.xx.xx.xx:8500 -template /etc/consul-template/data/haproxy.cfg.ctmpl:/etc/consul-template/data/haproxy.cfg

in order to run a command after the consul-template renders a new config file, use something like:

consul-template -consul-addr=xx.xx.xx.xx:8500 -template /etc/consul-template/data/haproxy.cfg.ctmpl:/etc/consul-template/data/haproxy.cfg:docker run haproxy-container command-to-reload-haproxy

HINT

I find it more readable to use consul-template config files, the language is very well specified here: https://github.com/hashicorp/consul-template/blob/master/docs/configuration.md .

Using that approach you would have a config file (for example consul_template_config.hcl) for consul-template like:

consul {
  address = "consul-address:8500"
}

template {
  source = "/etc/consul-template/data/haproxy.cfg.ctmpl"
  destination = "/etc/consul-template/data/haproxy.cfg"
  command = "docker run haproxy-container command-to-reload-haproxy"
}

Then, you run the consul-template container using

consul-template -config /path/to/consul_template_config.hcl

or using

consul-template -config /path/to/folder/containing->consul_template_config.hcl (This approach is more advanced, and lets you have consul-template-configs across multiple files, and not only in 1 like consul_template_config.hcl)

I know it is not a good solution to use this docker volume (security warnings), but it was what I could find about our use case.

-- dans4b
Source: StackOverflow