2017-04-10 100 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得到。