我是 kubernetes 的新手。我们希望将我们的一些产品作为 SaaS 提供给我们的客户。所以我需要基于用户的隔离部署。经过一番研究,我决定为每个用户创建一个 namespace 。然后将用户想要的内容从我们的模板部署到用户的命名空间。但是端口映射有问题。假设我们有 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 执行路由。
复杂性?您必须找到一种方法来更新入口 Controller 记录,而不会让其他用户停机。此外,在 Kubernetes 上,入口 Controller 无法将请求从一个命名空间传递到另一个命名空间。因此,该服务需要在创建 Ingress
资源的同一命名空间中运行(注意,我说的是 Ingress
资源,即规则(如上面的 yaml );不是入口 Controller )。这是 Kubernetes 团队已经宣布永远不会改变的已知限制,因为它引入了巨大的安全漏洞。
您需要在 Ingress
对象所在的命名空间中创建没有选择器的 headless 服务,并单独创建指向其他命名空间中的服务的 Endpoint
对象。它可能看起来很麻烦,但实际上非常专业。
关于docker - Kubernetes 中基于用户的部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60864275/