![基于 NGINX 环境的路由](https://linux22.com/image/776996/%E5%9F%BA%E4%BA%8E%20NGINX%20%E7%8E%AF%E5%A2%83%E7%9A%84%E8%B7%AF%E7%94%B1.png)
我有一个在多个 K8s 集群中运行的单个应用程序;假设有一个前端服务和两个后端服务。
我使用 NGINX 代理将请求从前端发送到后端服务。常规 NGINX 版本,不是NGINX+。这是 nginx.conf:
server {
....
set $back1 "<k8s hostname for the backend1 service>";
set $back2 "<k8s hostname for the backend2 service>";
location /back1 {
rewrite ^/back1/(.*)$ /$1 break;
proxy_pass http://$back1;
}
<and same for the backend 2 service>
}
所以基本上,在我的前端应用程序中,我将后端服务地址设置为本地主机/back1和本地主机/back2,请求到达 NGINX,它会剥离那些返回1和返回2前缀并调用我在 K8s 中的实际后端服务中指定的任何端点。
由于我有多个 K8s 集群,后端服务主机名不同,因此我需要在 NGINX 配置中考虑到这一点。
问题是:NGINX 有没有办法区分我的 K8s 集群?也许我可以将环境变量传递给运行前端服务的容器,然后创建一个如果nginx.conf 中的语句。例如:
server {
if (${env} = "cluster1") {
set $back1 = "<cluster1 hostname>"
}
if (${env} = "cluster2") {
set $back1 = "<cluster2 hostname>"
}
}
或者我可以在 nginx conf 中执行 shell 命令来获取主机名并写入类似的 if 块。
我将非常感激对此事的任何帮助!
答案1
我走了一条不同的路线——通过模板、环境变量和 envsubst 实用程序(在最新的 nginx docker 镜像中提供)。
在模板中:
set $upstream_back1 "${BACK1}";
set $upstream_back2 "${BACK2}";
在 Dockerfile 中
RUN envsubst < yourtemplate > /etc/nginx/nginx.conf