2016-11-18 3 views
3

У меня есть кластер Kubernetes, который я настраиваю с помощью kube-aws. Я пытаюсь запустить пользовательскую конфигурацию NGINX, которая использует разрешения DNS для proxy_pass. Вот блок NGINX кодыDNS не разрешает с NGINX в Kubernetes

location /api/v1/lead { 
    resolver 10.3.0.10 ipv6=off; 
    set $container lead-api; 
    proxy_pass http://$container:3000; 
} 

10.3.0.10 происходит от кластера IP службы DNS, найденной в Kubernetes. Я также пробовал 127.0.0.11, что мы и используем в среде docker-compose/docker.

$ kubectl describe --namespace=kube-system service kube-dns 
Name:     kube-dns 
Namespace:    kube-system 
Labels:     k8s-app=kube-dns 
         kubernetes.io/cluster-service=true 
         kubernetes.io/name=KubeDNS 
Selector:    k8s-app=kube-dns 
Type:     ClusterIP 
IP:      10.3.0.10 
Port:     dns  53/UDP 
Endpoints:    10.2.26.61:53 
Port:     dns-tcp 53/TCP 
Endpoints:    10.2.26.61:53 
Session Affinity:  None 

Эта конфигурация хорошо работает в трех различных средах, в которых используется докер. Однако я получаю следующее сообщение об ошибке в журнале Nginx в Kubernetes кластера

[ошибка] 9 # 9: * 20 свинцово-апи не может быть решена (2: сбой сервера), клиент: 10.2.26.0, сервер : запрос: "GET/API/v1/ведущие/661DF757-722B-4-1-81BD-C7FD398BBC88 HTTP/1.1"

Если я бег Nslookup в стручках Nginx я могу разрешить хост с теми же серверами DNS :

$ kubectl exec nginx-1855584872-kdiwh -- nslookup lead-api 
Server:   10.3.0.10 
Address:  10.3.0.10#53 

Name: lead-api.default.svc.cluster.local 
Address: 10.3.0.167 

Я не знаю, имеет значение это или нет, , Когда я смотрю журналы журналов для dnsmasq, я не вижу ничего подходящего. Если я изменю блок NGINX на hardcode proxy_pass, тогда он будет исправлен. Однако у меня есть другие конфигурации, для которых требуются динамические имена прокси. Я мог бы жестко закодировать каждый восходящий поток таким образом, но я хочу знать, как заставить DNS-преобразователь работать.

location /api/v1/lead { 
    proxy_pass http://lead-api:3000; 
} 
+0

Возможно, вам необходимо использовать полное квалифицированное имя, то есть lead-api. .svc.cluster.local: MrE

+0

кстати, не знаете, почему не использовать вместо этого использование Службы? Служба будет загружать баланс с NGINX на все, что у вас есть. – MrE

+0

Я могу nslookup изнутри контейнера nginx только с lead-api, и он разрешает просто отлично. Кроме того, у меня есть несколько интерфейсных API, которые работают индивидуально, и я хочу запускать их под одним URL. Я изучил использование входного контроллера, но это было слишком сложно для того, что я пытался выполнить. – blockloop

ответ

9

Разрешение имени терпит неудачу, поскольку вам необходимо использовать полное квалифицированное доменное имя. То есть, вы должны использовать:

lead-api.<namespace>.svc.cluster.local

не только

lead-api

Используя только имя хоста обычно будет работать, потому что в kubernetes в resolv.conf настроен домены поиска, так что вы не обычно необходимо предоставить полное доменное имя службы. например:

search default.svc.cluster.local svc.cluster.local cluster.local 
nameserver 10.3.240.10 
options ndots:5 

Однако, с указанием полного доменного имени необходимо, когда вы говорите Nginx использовать пользовательский распознаватель, потому что он не получает выгоду от этих поисковых домен спецификации.

+0

это была проблема с моей. Он работал в одной системе, где мы были развернуты по умолчанию NS, но не в другом, где у нас была обычная NS. Чтобы решить эту проблему, вы можете просто поставить lead-api. Предполагая, что остальная часть находится в вашем resolv.conf. – JamStar

-1

Вы должны использовать Service

http://kubernetes.io/docs/user-guide/services/

kubernetes Service прокси трафика на ваш Pods (то есть то, что вы называете 'служение', которое ваше приложение)

Я думаю, вы используете Kubernetes для возможности развертывания и масштабирования ваших приложений (Pods), чтобы трафик должен был балансировать с нагрузкой после их масштабирования, и у вас есть несколько Поды поговорить. Это то, что делает Service.

A Service имеет свой собственный IP-адрес. Пока существует Service, Nginx Pod, ссылающийся на этот Service в восходящем потоке, будет работать нормально.

Nginx (бесплатная версия) умирает, когда он не может решить восходящий поток, но если определено значение Service, он имеет свой собственный IP-адрес и получает разрешение.

Если Pods за Service не работают, Nginx не будет видеть, что и будет пытаться перенаправить трафик, но будет возвращать 502 (недопустимый шлюз)

Так, только определил Service, а затем довести до ваш Pods с соответствующей меткой, так что Service заберет их. Вы можете удалить, масштабировать, заменить те Pods, не затрагивая Nginx Pod. Пока есть хотя бы один Pod, работающий позади Service, Nginx всегда сможет подключиться к вашему API.

+0

lead-api это сервис, и я понимаю, как работают сервисы. Я также понимаю, что я могу изменить (и уже имею) конфигурацию на жесткий код «http: // lead-api». Я понимаю, что восходящий поток будет работать нормально, если я начну работу с услугой lead-api. У меня есть другие динамические конфигурации nginx, которые требуют одинаковой конфигурации резольвера. Это просто пример. Мой вопрос заключается не в том, «как заставить его работать каким-то другим способом», а «почему DNS-резольвер не работает». – blockloop

+0

Вы пытались использовать полное доменное имя? – MrE

+0

Хорошо, что это сработало с полным доменным именем. Спасибо! – blockloop

Смежные вопросы