Развертывание на основе пользователя в Kubernetes - PullRequest
2 голосов
/ 26 марта 2020

Я немного новичок ie на kubernetes. И мы хотим представить некоторые из наших продуктов в качестве SaaS нашим клиентам. Так что мне нужны пользовательские изолированные развертывания. После некоторых исследований я решил создать пространство имен для каждого пользователя. Затем разверните то, что пользователь хочет от нашего шаблона, в пространство имен пользователя. Но есть проблема с отображением портов. Допустим, у нас есть 6 пользователей, и все они хотят использовать приложение deploy django. Таким образом, все они хотят получить доступ к своему проекту из 80 и 443 портов. Есть ли какое-то решение для этого в kubernetes? Если это так, как мне поступить?

И как я могу разделить развертывания каждого пользователя на разные сети или виртуальные сети, чтобы изолировать их сети друг от друга?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Вы можете либо назначить выделенный балансировщик нагрузки для каждого из них (дорогое решение, но прямолинейное), либо заставить свой 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 объекты, указывающие на службу в других пространствах имен. Это может показаться громоздким, но на самом деле это довольно про.

1 голос
/ 26 марта 2020

Для разделения внешнего доступа к приложениям вам необходимо развернуть Ingress Controller и создать различные входы, указывающие на службы каждого приложения. Каждый вход будет содержать уникальный URL-адрес для каждого приложения.

Чтобы запретить внутреннюю связь между пространствами имен, необходимо развернуть сетевые политики . Для этого вам потребуется развернуть аддон . Или вы можете решить эту проблему, развернув любую общую службу me sh: Istio, Linkerd, Consul et c.

...