У меня есть кластер 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;
}
Возможно, вам необходимо использовать полное квалифицированное имя, то есть lead-api. .svc.cluster.local: –
MrE
кстати, не знаете, почему не использовать вместо этого использование Службы? Служба будет загружать баланс с NGINX на все, что у вас есть. – MrE
Я могу nslookup изнутри контейнера nginx только с lead-api, и он разрешает просто отлично. Кроме того, у меня есть несколько интерфейсных API, которые работают индивидуально, и я хочу запускать их под одним URL. Я изучил использование входного контроллера, но это было слишком сложно для того, что я пытался выполнить. – blockloop