首页 > 解决方案 > 如何将域的自定义子域重定向到以子域为参数/路径的单个 kubernetes 服务?

问题描述

我需要一个多租户应用程序,其中每个租户应由子域分隔,如下所示

t1.example.com  
t2.example.com  
t3.example.com  
.  
.  
.  
tn.example.com

所以在这种情况下可能有任意数量的租户。我有一个名为myservice的 Kubernetes 后端服务,负责处理所有这些请求,并且需要根据它们的子域来识别它们。例如,如果请求来自 tn.example.com 那么它需要被重定向到 -> myservice/tn

t2.example.com   -> myservice/t2  
t3.example.com   -> myservice/t3 and so on.

所以这里的子域名将是重定向期间的路径参数,这将从应用程序的角度区分不同的子域。我需要为任意数量的子域动态地执行此操作。如何在 Kubernetes Nginx 入口控制器中实现这一点?

标签: kuberneteskubernetes-ingressnginx-ingress

解决方案


恐怕Nginx Ingress无法以简单直接的方式准确地提供您需要的东西。但是,您始终可以使用更高级的功能,例如通过 annotationServer/Location Block覆盖带有配置片段的部分,然后使用lua Block提取和更改请求 URI 到后端。subdomain

Github上有类似的线程,用户sanigo使用configuration-snippetwithlua block作为解决方法。

nginx.ingress.kubernetes.io/configuration-snippet: |
  location ~ ^/v2/ {
    set_by_lua_block $repo {
      local host = ngx.req.get_headers()["host"];
      local reg = "^(?<repo>[^.]+).*";
      local m = ngx.re.match(host, reg);
      return m['repo'];
    }
    rewrite ^/(.*)$ /repository/$repo/$1 last;
  }

快速说明:在此示例中,它<repo>的作用与subdomain.


推荐阅读