Осуществление навигацию в Интернете, я нашел много учебных руководств о проксировании к различным контейнерам Докера, работающим на том же хосте, с помощью Nginx/Confd (или Haproxy или Vulcand). Однако, что я должен сделать, это отличается. После обзора моей инфраструктуры:
Теперь, то, что я должен сделать, должно иметь скажем, один прокси Nginx, которые направляют мой трафик к различным контейнерам в зависимости от vhost. Следование примеру:
Nginx (с IP паба) получают запрос xxx.domain.com
--> node-1
--> container
с автоматическим присвоенным IP (слушающий на порте 80)
Nginx (с IP паба) получают запрос yyy.domain.com
--> node-2
--> container
с автоматическим присвоенным IP (слушающий на порте 80)
Здесь мои вопросы:
Заранее спасибо!
Для того, чтобы nginx мог "находить" контейнеры, работающие на узлах, вам понадобится какой-то тип обнаружения служб. Вы можете записать в etcd запись при запуске контейнера и удалить его при выходе и попросить nginx проверить их.
Для перемещения сервисов вы можете взглянуть на парк для простого планирования.
Не знаю, правильно ли я вас понял. Но вот как я бы это сделал:
Поместите балансировщик нагрузки (HAProxy, Nginx, Amazon ELB (если вы используете EC2)) за пределами кластера, маршрутизируя каждый трафик внутри него.
Внутри него вы могли бы дать Гогета попробуй: https://github.com/arkenio/gogeta
Это обратный прокси-сервер, работающий глобально (на каждом узле) и маршрутизирующий трафик на основе записей домена в etcd в определенные контейнеры. Затем вы можете настроить свои служебные файлы, добавляя и удаляя их присутствие в etcd, который отслеживает gogeta.
ExecStart=<do something>
ExecStartPost=/usr/bin/etcdctl set /services/<your_service>/%i/location '{\"host\": "%H", \"port\": <your containers exposed port>}'
ExecStop=/usr/bin/docker stop <your service>
ExecStopPost=/usr/bin/etcdctl rm --recursive /services/<your_service>/%i
Он работает и запрашивает балансировку нагрузки со стратегией Round Robin. Хотя, похоже, есть проблема, которую я зарегистрировал https://github.com/arkenio/gogeta/issues/10
Вам это помогает?
Для этого можно использовать трио nginx, etcd & confd. Есть замечательный пост в блоге под названием "Балансировка нагрузки с CoreOS, confd и nginx", который проведет вас через три контейнера.
Ключом к этому является то, что каждый HTTP-бекенд будет объявлять себя через etcd, а затем confd будет подхватывать изменения и перенастраивать nginx на лету. Этот процесс очень близок к тому, о чем @Julian упоминал в предыдущем ответе:
ExecStart=<do something>
ExecStartPost=/usr/bin/etcdctl set /services/<your_service>/%i/location '{\"host\": "%H", \"port\": <your containers exposed port>}'
ExecStop=/usr/bin/docker stop <your service>
ExecStopPost=/usr/bin/etcdctl rm --recursive /services/<your_service>/%i
Посмотрите confd шаблон docs для более подробных примеров, но у вас будет что-то примерно такое:
{{range $dir := lsdir "/services/web"}}
upstream {{base $dir}} {
{{$custdir := printf "/services/web/%s/*" $dir}}{{range gets $custdir}}
server {{$data := json .Value}}{{$data.IP}}:80;
{{end}}
}
server {
server_name {{base $dir}}.example.com;
location / {
proxy_pass {{base $dir}};
}
}
{{end}}
Просто заметьте, что вам понадобится только одно из этих "трио", если только вы не хотите более доступную установку, и в этом случае вам понадобится два или более. Когда вы запустите HA, вы, вероятно, захотите предоставить им экземпляр ELB.
.