基于 NGINX 环境的路由

基于 NGINX 环境的路由

我有一个在多个 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

相关内容