#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
.