Как перенаправить пользовательский поддомен домена на один сервис kubernetes с поддоменом в качестве параметра / пути?

#kubernetes #kubernetes-ingress #nginx-ingress

#kubernetes #kubernetes-вход #nginx-вход

Вопрос:

У меня есть требование к многопользовательскому приложению, в котором каждый клиент должен быть разделен поддоменами, как показано ниже

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

Таким образом, в этом случае может быть любое количество арендаторов. У меня есть серверная служба Kubernetes с именем myservice, отвечающая за обработку всех этих запросов, и их необходимо идентифицировать на основе их поддомена.
например, если запрос поступает из tn.example.com затем его нужно перенаправить в -> myservice/tn .

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

Итак, здесь имя поддомена будет аргументом path во время перенаправления, которое будет различать разные поддомены с точки зрения приложения. Мне нужно сделать это динамически для любого количества поддоменов.
Как этого можно достичь в контроллере входа Kubernetes Nginx?

Комментарии:

1. Это ваш локальный env или облачный env? Возможность ручного редактирования Ingress YAML здесь не предусмотрена? Эти поддомены будут только увеличиваться или уменьшаться?

2. он находится в облаке и не хочет вручную редактировать входной yaml каждый раз, когда добавляется новый клиент. поддомен обычно увеличивается. как это будет отличаться, если это локальная настройка?

Ответ №1:

Я боюсь, что Nginx Ingress не может предоставить именно то, что вам нужно простым и понятным способом. Однако вы всегда можете использовать более продвинутые функции, такие как переопределение Server/Location Block раздела фрагментом конфигурации через аннотацию, а затем использовать блок lua для извлечения subdomain и изменения URI запроса на серверный.

На Github был аналогичный поток, где пользователь sanigo использовал configuration-snippet в lua 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 .