Вы можете либо поместить выделенный балансировщик нагрузки для каждого из них (дорогое решение, но прямолинейное), либо заставить ваш контроллер Ingress принимать запросы только с именем хоста и указывать каждое имя хоста на его службу в его пространстве имен (дешевое решение, но усложнить).
Решение для балансировки нагрузки:
Это легко, если вы работаете с облачным провайдером, поэтому каждый раз, когда клиент предоставляет приложение, вы просто создаете службу типа LoadBalancer
, указывающую на его приложение. Поскольку для каждого приложения вы получаете новый балансировщик нагрузки, у вас нет проблем с конфликтами портов. Теперь недостатки в том, что это вы можете сделать только с облачным провайдером, и это будет довольно дорого.
Решение Ingress:
Это профессиональное решение. Это дешево, но и сложнее. Итак, вы должны создать ресурс 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 вы можете получить балансировщик нагрузки L4 (например, nginx, Traefik), но все же маршрутизацию выполняет контроллер Ingres.
Сложность? Вам нужно будет найти способ обновить записи Ingress Controller без простоев для других пользователей. Кроме того, в Kubernetes Ingress Controller не может передать запрос из одного пространства имен в другое. Таким образом, служба должна работать в том же пространстве имен, в котором был создан ресурс Ingress
(обратите внимание, я говорю ресурс Ingress
, поскольку это правила (например, yaml выше), а не Ingress Controller). Это известное ограничение, о котором уже объявила команда Kubernetes, и оно никогда не будет изменено, поскольку создает огромную дыру в безопасности.
Вам нужно будет создать безголовые службы без селекторов в том же пространстве имен, что и Ingress
объект, и отдельно создать Endpoint
объектов, указывающих на службу в других пространствах имен. Это может показаться громоздким, но на самом деле это довольно профессионально.
person
suren
schedule
26.03.2020