【问题标题】:Nginx proxy_pass directive string interpolationNginx proxy_pass 指令字符串插值
【发布时间】:2017-04-10 15:14:20
【问题描述】:

我在 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 动态获取服务名称。

【问题讨论】:

    标签: nginx kubernetes interpolation


    【解决方案1】:

    我已经找到原因和解决方案了。

    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 获得。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2013-06-27
    • 2018-03-15
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多