Nginx проксируют многим контейнер, работающий на различных узлах CoreOS

Осуществление навигацию в Интернете, я нашел много учебных руководств о проксировании к различным контейнерам Докера, работающим на том же хосте, с помощью Nginx/Confd (или Haproxy или Vulcand). Однако, что я должен сделать, это отличается. После обзора моей инфраструктуры:

  • Кластер CoreOS онлайн с 5 узлами, все выполнение etcd
  • На каждом узле кластера запускаются различные контейнеры Докера (веб-серверы Nginx, запускающие приложения WordPress) использование флота, не выставляя порт и пишущий их дюйм/с (IP докера, взятый с докером, осматривают) на etcd.
  • Если узел понижается, мои сервисы автоматически перемещены в другой доступный узел

Теперь, то, что я должен сделать, должно иметь скажем, один прокси Nginx, которые направляют мой трафик к различным контейнерам в зависимости от vhost. Следование примеру:

Nginx (с IP паба) получают запрос xxx.domain.com --> node-1 --> container с автоматическим присвоенным IP (слушающий на порте 80)

Nginx (с IP паба) получают запрос yyy.domain.com --> node-2 --> container с автоматическим присвоенным IP (слушающий на порте 80)

Здесь мои вопросы:

  • Это - мой корректный сценарий? Я думаю что-то не так?
  • Мой прокси Nginx должен быть вне кластера CoreOS? Или я должен выполнить его на каждом узле CoreOS?
  • Как я могу достигнуть этой конфигурации? Каков лучший способ?

Заранее спасибо!

3
задан 27 March 2015 в 13:34
3 ответа

Для того, чтобы nginx мог "находить" контейнеры, работающие на узлах, вам понадобится какой-то тип обнаружения служб. Вы можете записать в etcd запись при запуске контейнера и удалить его при выходе и попросить nginx проверить их.

Для перемещения сервисов вы можете взглянуть на парк для простого планирования.

1
ответ дан 3 December 2019 в 06:32

Не знаю, правильно ли я вас понял. Но вот как я бы это сделал:

Поместите балансировщик нагрузки (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

Вам это помогает?

1
ответ дан 3 December 2019 в 06:32

Для этого можно использовать трио nginx, etcd & confd. Есть замечательный пост в блоге под названием "Балансировка нагрузки с CoreOS, confd и nginx", который проведет вас через три контейнера.

  1. Вам нужен разделяемый "data" контейнер, где вы можете хранить динамически сгенерированные конфигурации nginx
  2. Вам нужен контейнер под управлением confd, который будет читать значения из etcd и динамически генерировать конфигурацию nginx для вас (она сохраняется в томе из разделяемого "data" контейнера)
  3. Наконец, вам нужен nginx, который просто использует этот разделяемый "data" том для своих конфигураций.

Ключом к этому является то, что каждый 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.

.
1
ответ дан 3 December 2019 в 06:32

Теги

Похожие вопросы