Nginx proxy_pass指令字符串插值

时间:2017-04-10 15:14:20

标签: nginx kubernetes interpolation

我在Kubernetes上运行Nginx。

当我使用以下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动态获取服务名称。

1 个答案:

答案 0 :(得分:8)

我找到了理由和解决方案。

Nginx检测proxy_pass中是否使用了变量(我不知道它是如何做到的)。如果没有变量,则在启动时解析主机名并缓存IP地址。如果有变量,它使用解析器(DNS服务器)在运行时查找IP。

所以解决方案就是像这样指定Kube 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来获取该名称。