docker - Kubernetes 中基于用户的部署

标签 docker kubernetes kubernetes-pod

我是 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/

相关文章:

python - docker-compose 与来自 sql 转储的多个 postgres 数据库

java - 启用 Alpine 以在 ARM64 arch 上执行 not-musl Java JRE

kubernetes - 仅使用 IPv6 安装 Kubernetes 的指南

Kubernetes : What is hostPort and hostIp used for?

kubernetes - Kubernetes Pod在失败时执行一些操作

kubernetes - 如何在 kubernetes 中跨 presto 集群分发文件

linux - 在脚本中使用 fish shell 函数

docker - 使用 X11 转发在 Docker 中运行多个 GUI

nginx - 检查 Kubernetes 集群上 NGINX 中加载的 SSL 证书的值

kubernetes - 更新 kubernetes helm 值