2017-04-10 44 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。

因此,解決辦法是指定這樣的庫貝DNS服務器:

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

需要注意的是,必須使用該服務的全本地DNS名稱,你可以通過運行nslookup service-1得到。