2016-05-30 3 views
6

Я пытаюсь создать прокси-сервер nginx, который отправляет запросы /<service> в http://<service>. Сначала я попробовал следующее:Динамический proxy_pass в nginx для другого pod в Kubernetes

location ~ ^/(.+)$ { 
    set $backend "http://$1:80"; 
    proxy_pass $backend; 
} 

Но он не говорит что-то вроде (при вызове /myservice):

[error] 7741#0: *1 no resolver defined to resolve http://myservice 

Поскольку myservice является не доступен извне, я попытался установить go-dnsmasq как коляску в тот же самый pod, и я пытаюсь использовать его для разрешения DNS (например, я видел в примере this) и изменил конфигурацию nginx так, чтобы он выглядел так:

location ~ ^/(.+)$ { 
     resolver 127.0.0.1:53; 
     set $backend "http://$1:80"; 
     proxy_pass $backend; 
} 

Но теперь Nginx терпит неудачу с:

[error] 9#9: *734 myservice could not be resolved (2: Server failure), client: 127.0.0.1, server: nginx-proxy, request: "GET /myservice HTTP/1.1", host: "localhost:8080" 
127.0.0.1 - xxx [30/May/2016:10:34:23 +0000] "GET /myservice HTTP/1.1" 502 173 "-" "curl/7.38.0" "-" 

Мой Kubernetes стручок выглядит следующим образом:

spec: 
    containers: 
    - name: nginx 
     image: "nginx:1.10.0" 
     ports: 
     - containerPort: 8080 
      name: "external" 
      protocol: "TCP" 
    - name: dnsmasq 
     image: "janeczku/go-dnsmasq:release-1.0.5" 
     args: 
     - --listen 
     - "0.0.0.0:53" 

Бег netstat -ntlp в контейнере Dnsmasq дает мне:

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 0.0.0.0:8080   0.0.0.0:*    LISTEN  - 
tcp  0  0 :::53     :::*     LISTEN  1/go-dnsmasq 

И работает nmap --min-parallelism 100 -sT -sU localhost в nginx:

Starting Nmap 6.47 (http://nmap.org) at 2016-05-30 10:33 UTC 
Nmap scan report for localhost (127.0.0.1) 
Host is up (0.00055s latency). 
Other addresses for localhost (not scanned): 127.0.0.1 
Not shown: 1997 closed ports 
PORT  STATE SERVICE 
53/tcp open domain 
8080/tcp open http-proxy 
53/udp open domain 

Итак, похоже, что dnsmasq и nginx действительно работают и работают? Что я могу делать неправильно?

ответ

10

После долгих исследований и испытаний и ошибок мне удалось это решить. Во-первых, я изменил спецификацию стручок на:

spec: 
    containers: 
    - name: nginx 
     image: "nginx:1.10.0" 
     ports: 
     - containerPort: 8080 
      name: "external" 
      protocol: "TCP" 
    - name: dnsmasq 
     image: "janeczku/go-dnsmasq:release-1.0.5" 
     args: 
     - --listen 
     - "127.0.0.1:53" 
     - --default-resolver 
     - --append-search-domains 
     - --hostsfile=/etc/hosts 
     - --verbose 

я также должен был отключить ipv6 для разрешения имен в Nginx:

location ~ ^/(.+)$ { 
     resolver 127.0.0.1:53 ipv6=off; 
     set $backend "http://$1:80"; 
     proxy_pass $backend; 
} 

Затем он работает, как ожидалось!

+0

спасибо за это! –

+1

Это замечательно. Спасибо. Не уверен, почему 'kube-dns' как распознаватель не работает. – ZoidbergWill

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