在 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 等
我是 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 等