2017-04-10 14 views
2

私はKubernetesでNginxを実行しています。Nginx proxy_pass指示文字列補間

私は、次のproxy_passが期待どおりに動作しますディレクティブを使用します。

proxy_pass "http://service-1.default"; 

次は動作しません。しかし:

set $service "service-1"; 
proxy_pass "http://$service.default"; 

私は限りno resolver defined to resolve service-1.default

を言ってエラーが出ます私はproxy_passがまったく同じ文字列を受け取っていると言うことができます。なぜ違うのですか?

正規表現を使用してURLからサービス名を動的に取得しているため、変数を使用する必要があります。

答えて

4

私はその理由と解決策を見つけました。

Nginxは、変数がproxy_passで使用されているかどうかを検出します(その方法はわかりません)。変数がない場合、起動時にホスト名が解決され、IPアドレスがキャッシュされます。変数がある場合、実行時にリゾルバ(DNSサーバ)を使用してIPをルックアップします。あなたがnslookup service-1を実行することによって得ることができるサービスの完全なローカルのDNS名を使用する必要があること

resolver kube-dns.kube-system.svc.cluster.local valid=5s; 
set $service "service-1"; 
proxy_pass "http://$service.default.svc.cluster.local"; 

注:

だからソリューションは、このようなKUBE DNSサーバーを指定することです。