在 Kubernetes 中基于用户的部署

User based deploying in Kubernetes

我是 kubernetes 的新手。我们希望将我们的一些产品作为 SaaS 呈现给我们的客户。所以我需要基于用户的隔离部署。经过一些研究,我决定为每个用户创建一个命名空间。然后将用户想要的内容从我们的模板部署到用户的命名空间。但是有一个关于端口映射的问题。假设我们有 6 个用户,他们都想要部署 django 应用程序。所以他们都想从 80 和 443 端口访问他们的项目。在 kubernetes 中有解决这个问题的方法吗?如果是我该怎么办?

我如何将每个用户的部署分离到不同的网络或 vlan 以将他们的网络彼此隔离?

您可以为它们中的每一个放置一个专用的负载平衡器(昂贵的解决方案,但很简单),或者让您的 Ingress Controller 只接受带有主机名的请求,并将每个主机名指向它的服务,在它的命名空间(便宜但复杂的解决方案)。

负载均衡器解决方案:

这很简单,如果您使用的是云提供商,那么每次客户端公开该应用程序时,您只需创建一个指向他的应用程序的 LoadBalancer 类型服务。由于每个应用程序都有一个新的负载均衡器,因此不会有端口冲突的问题。现在,缺点是你只能通过云提供商来做到这一点,而且会非常昂贵。

入口解决方案:

这是专业解决方案。它很便宜,但也更复杂。因此,您可以像这样创建一个 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 资源的同一命名空间中(注意,我说的是 Ingress 资源,是规则(如上面的 yaml);不是入口控制器)。这是 Kubernetes 团队已经宣布永远不会更改的已知限制,因为它引入了一个巨大的安全漏洞。

您需要在与 Ingress 对象相同的命名空间中创建不带选择器的无外设服务,并单独创建 Endpoint 指向其他命名空间中服务的对象。看似繁琐,其实很专业

要分离对应用程序的外部访问,您需要部署 Ingress Controller 并创建指向每个应用程序服务的不同入口。每个 Ingress 都会为每个应用程序保留其唯一的 URL。

要禁止内部跨命名空间通信,您需要部署 network policies. Fr this you'll need to deploy an addon。 或者您可以通过部署任何常见的服务网格来解决它:Istio、Linkerd、Consul 等