#docker #kubernetes #haproxy #consul #consul-template
Вопрос:
В моем кластере AWS ECS Fargate запущено несколько микросервисов. Внутри задачи (модуля) будет несколько контейнеров (1 контейнер для обслуживания основного бизнеса и дополнительные 3 контейнера для колясок). Вот список этих контейнеров:
- контейнер службы основного бизнеса (запускает службу основного бизнеса в определенном порту)
- контейнер консула-агента (запускает консула-агента и соединяет его с мастером консула)
- консул-контейнер шаблона (получает служебную информацию от консула и обновляет файл haproxy.cfg)
- контейнер haproxy (берет файл haproxy.cfg из шаблона consul и запускает)
Все эти контейнеры также работают и работают нормально. Проблема в том, чтобы перезагрузить haproxy. Поскольку шаблон consul отвечает за обновление файла haproxy.cfg, должен ли я добавить некоторую конфигурацию в сам шаблон consul для обновления haproxy?
Вот команда, которую я в настоящее время использую для consul-шаблона:
consul-template -consul-addr=xx.xx.xx.xx:8500 -template /etc/consul-template/data/haproxy.cfg.ctmpl:/etc/consul-template/data/haproxy.cfg
Что я могу попытаться сделать для этого?
Ответ №1:
В настоящее время у меня точно такая же проблема, но для Nginx.
Из моих исследований следует, что хорошего решения не существует. Единственное, что, кажется, работает, — это смонтировать том
-v /var/run/docker.sock:/var/run/docker.sock
на контейнере консул-шаблон.
Я вижу, вы используете :
consul-template -consul-addr=xx.xx.xx.xx:8500 -template /etc/consul-template/data/haproxy.cfg.ctmpl:/etc/consul-template/data/haproxy.cfg
чтобы выполнить команду после того, как шаблон consul отобразит новый файл конфигурации, используйте что-то вроде:
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
подсказка
Я нахожу более удобным использовать файлы конфигурации шаблона консула, язык здесь очень хорошо указан: https://github.com/hashicorp/consul-template/blob/master/docs/configuration.md .
Используя этот подход, у вас будет файл конфигурации (например, consul_template_config.hcl) для шаблона консула, такого как:
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"
}
Затем вы запускаете контейнер consul-template с помощью
consul-template -config /path/to/consul_template_config.hcl
или с помощью
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)
Я знаю, что использование этого тома docker (предупреждения о безопасности) не является хорошим решением, но это было то, что я смог найти в нашем примере использования.
Комментарии:
1. Вопрос Noob: Как запустить это
consul-template -config /path/to/consul_template_config.hcl
, если одна из служб выйдет из строя ?2. Совсем не нуб, мы все учимся ! 2 варианта: 1) Настройте наблюдателя за консулами так, чтобы при изменении чего-либо в кластере консулов вы запускали команду consul-template ( consul.io/docs/dynamic-app-config/watches ). Это должно потребовать минимальной настройки, поскольку часы консула уже являются частью Агентов и серверов Консула. Настройка аналогична настройке проверки работоспособности. 2) Ваша команда фактически уже делает это, она запускает процесс шаблона консула и прослушивает кластер консула в соответствии с изменениями в файле *.hcl. На самом деле я использую эту опцию внутри службы операционной системы.