如何使用子域作为参数/路径将域的自定义子域重定向到单个kubernetes服务?

时间:2020-10-22 12:57:32

标签: kubernetes kubernetes-ingress nginx-ingress

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

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.

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

1 个答案:

答案 0 :(得分:0)

恐怕Nginx Ingress不能以简单直接的方式提供您所需要的东西。 但是,您始终可以使用更多高级功能,例如使用configuration snippet through annotation覆盖Server/Location Block部分,然后使用lua Block提取subdomain并将请求URI更改为后端。

Github上有类似的线程,其中用户sanigo使用configuration-snippetlua 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完全相同。