Вы можете либо назначить выделенный балансировщик нагрузки для каждого из них (дорогое решение, но прямолинейное), либо заставить свой Ingress Controller принимать запросы только с именем хоста и указывать каждому имени хоста его сервис в своем пространстве имен ( дешевое решение, но сложное).
Решение для балансировки нагрузки:
Это легко, если вы работаете с облачным провайдером, поэтому каждый раз, когда клиент выставляет приложение, вы просто создаете сервис типа LoadBalancer
, указывающий на его приложение. Поскольку для каждого приложения вы получаете новый балансировщик нагрузки, у вас нет проблем с конфликтом портов. Недостатки в том, что это можно сделать только с облачным провайдером, и это будет довольно дорого.
Ingress Solution:
Это профессиональное решение , Это дешево, но это также сложнее. Итак, вы должны создать ресурс Ingress, например, так:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
tls:
- secretName: tls
rules:
- host: site1.domain.com
http:
paths:
- path: /path1/
backend:
serviceName: service1
servicePort: 80
- host: site2.domain.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
...
Здесь у вас есть только один балансировщик нагрузки L7, и именно Ingress Controller выполняет всю маршрутизацию. В зависимости от Ingress Controller, вы можете получить балансировщик нагрузки L4 (например, nginx, Traefik), но все же именно Ingres Controller выполняет маршрутизацию.
Сложность? Вам нужно будет найти способ обновить записи Ingress Controller без простоев для других пользователей. Кроме того, в Kubernetes Ingress Controller не может передать запрос из одного пространства имен в другое. Таким образом, служба должна работать в том же пространстве имен, в котором был создан ресурс Ingress
(обратите внимание, я говорю, что ресурс Ingress
является правилами (как yaml выше), а не Ingress Controller). Это известное ограничение, которое команда Kubernetes уже объявила, что оно никогда не изменится, поскольку оно создает огромную дыру в безопасности.
Вам нужно будет создавать службы без заголовка без селекторов в том же пространстве имен, что и объект Ingress
, и отдельно создайте Endpoint
объекты, указывающие на службу в других пространствах имен. Это может показаться громоздким, но на самом деле это довольно про.