Re: host not found in upstream: не появилась возможность игнорировать?

Valery Kholodkov valery+nginx на grid.net.ru
Чт Мар 16 14:25:39 UTC 2017


Для решения этой проблемы достаточно всем контейнерам одного сервиса в 
оверлей-сети прописать один и тот же алиас. Тогда докер в своем 
внутреннем DNS-е пропишет запись с множеством адресов и nginx сможет 
резолвить набор адресов контейнеров соответствующих сервису.

Пример на docker-compose:

version: '2'

services:
   myapp:

     [ ... пропущено ... ]

     networks:
       ovr0:
         aliases:
           - myapp

networks:
   ovr0:
     external:
       name: ovr0

Конфиг nginx:

server {
	server_name myurl.com;
	listen 80 ;
	access_log /var/log/nginx/access.log vhost;
	location / {
		proxy_pass http://myapp;
	}
}

Замечания:

1. nginx должен быть докеризирован. Я пока не нашел способов роутинга 
трафика с хоста в оверлей-сеть;
2. Контейнеры должны использовать внутренный DNS докера;
3. Оверлей-сеть не всегда стабильна, особенно в глобальном масштабе. 
Полагаю максимальная стабильность может  быть гарантирована, только если 
все хосты находятся в локальной сети.

On 16-03-17 14:56, obolobova wrote:
> Здравствуйте.
>
> У нас крутится nginx в докере, и проксирует запросы на большое количество
> сервисов, тоже в контейнерах.
> Все это хозяйство объединено в Docker overlay network, и адресация идет не
> по реальным хостнеймам, а по именам/алиасам докер-контейнеров (DNS-резолвинг
> обеспечивает сетевая инфраструктура докера).
>
> Конфиг примерно такой:
>
> upstream my_upstream1 {
> 	server DOCKER_CONTAINER1:8080 max_fails=0;
> 	server DOCKER_CONTAINER2:8080;
> 	keepalive 32;
> }
>
> # еще куча апстримов
> upstream my_upstream2...
> upstream my_upstream3...
>
> server {
> 	server_name myurl.com;
> 	listen 80 ;
> 	access_log /var/log/nginx/access.log vhost;
> 	location / {
> 		proxy_pass http://my_upstream1;
> 		
> 		#также пробовали вариант с переменной
> 		set $my_var my_upstream1;
> 		proxy_pass http://$my_var;
> 	}
> }
>
> Проблема, наверное, уже понятна: если хоть один контейнер исчезает (упал,
> удалили, машина провалилась под землю, whatever), то соответствующее имя не
> резолвится и NGINX крэшится при старте.
> Подчеркну, что проблема не в резолвере - он работает совершенно верно,
> исчезнувший контейнер и не должен резолвиться - всё, его нет, и докер
> убирает соответствующую запись из своего DNS.
>
> Описанный выше вариант - штатная ситуация, в системе будут сотни апстримов и
> тысячи контейнеров, какие-то из них будут падать обязательно.
>
> Можно ли что-то сделать - на уровне штатного конфига - чтобы NGINX всё же
> стартовал?
> В гугле пишут, что либо ничего не сделать, либо использовать переменную в
> proxy_pass - но нам не помогло. Если хоть одно имя хоть в одном upstream не
> резолвится, NGINX не стартует.
> Может быть, появился какой-то новый workaround?
>
> Если нет, то, насколько я понимаю, остается вариант цеплять к NGINXу
> дополнительный DNS, который все эти апстримы будет резолвить хоть бы на
> 127.0.0.1?
>
> Большое спасибо.
>
> Posted at Nginx Forum: https://forum.nginx.org/read.php?21,272978,272978#msg-272978
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>


Подробная информация о списке рассылки nginx-ru