2016-05-30 8 views
6

Ich versuche, einen Nginx-Proxy zu erstellen, der Anfragen an /<service> zu http://<service> weiterleitet. Ich versuchte zunächst, die folgenden:Dynamische proxy_pass in nginx zu einem anderen Pod in Kubernetes

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

aber es funktioniert nicht sagen, so etwas wie (beim Aufruf /myservice):

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

Da myservice ist nicht von außen zugänglich Ich habe versucht go-dnsmasq als Beiwagen zu installieren in der gleiche Schote und ich versuche, es für die DNS-Auflösung zu verwenden (wie ich in this Beispiel gesehen habe) und meine nginx Config ändern wie folgt aussehen:

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

Aber jetzt nginx nicht mit:

[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" "-" 

Mein Kubernetes pod dies wie folgt aussieht:

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 im dnsmasq Behälter Laufen gibt mir:

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 

Und nmap --min-parallelism 100 -sT -sU localhost im Rennen Nginx-Container:

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 

So scheint es, dass Dnsmasq und Nginx tatsächlich in Betrieb sind? Was könnte ich falsch machen?

Antwort

10

Nach viel Forschung und Versuch und Irrtum gelang es mir, dies zu lösen. Zunächst änderte es die pod Spezifikation:

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 

dann die ipv6 für den Resolver in nginx deaktivieren musste ich auch:

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

dann funktioniert es wie erwartet!

+0

danke dafür! –

+1

Das ist großartig. Vielen Dank. Nicht sicher, warum 'kube-dns' als Resolver nicht funktioniert. – ZoidbergWill