Nginx proxy_pass指令字符串插值

标签 nginx kubernetes interpolation

我在 Kubernetes 上运行 Nginx。

当我使用以下 proxy_pass 指令时,它会按预期工作:

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

但是以下方法不起作用:

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

我收到一条错误消息,提示没有定义解析器来解析 service-1.default

据我所知 proxy_pass 正在接收完全相同的字符串,那么为什么它的行为不同?

我需要使用变量,因为我使用正则表达式从 URL 动态获取服务名称。

最佳答案

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

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 获取该名称。

关于Nginx proxy_pass指令字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326913/

相关文章:

kubernetes - Helm 将 SecretKeyRef 连接到一个环境变量中

html - 调整缩略图的 HTML Canvas 大小 : Can I reduce pixellation and improve resized appearance/interpolation?

ssl - 为 ssl 开放 443 端口

linux - 从 LAN 找不到 aspNet 核心 Linux 404

python - kubernetes python 客户端获取特定注释的值

android - 有没有办法覆盖 Android Gallery 小部件默认动画,例如插值器

python - rbf 和 scipy 的二维概率分布

java - 如何从 Java Web 应用程序控制 NGINX?

docker - 如何禁用对 docker swarm 中覆盖网络的外部访问

c# - 从 istio Service Mesh 上的工作节点中的服务连接到 Kubernetes API Server