【问题标题】:Is using deployments to isolate clients in Kubernetes a good idea?在 Kubernetes 中使用部署来隔离客户端是个好主意吗?
【发布时间】:2021-08-04 15:05:32
【问题描述】:

我们正在将老化的单体架构迁移到更强大的解决方案,并将 Kubernetes 作为最合适的平台来实现我们的目标。同时,我们希望拆分和隔离我们的客户数据,以确保安全并改善隐私。

我们正在考虑最终让每个客户拥有一个数据库,并将这些连接详细信息嵌入到每个客户的部署中。然后,我们将构建某种路由服务,将客户端的请求链接到它们各自的部署/服务。

由于我们的各个客户端的规模差异很大(我们有一些每分钟产生数千个请求,而另一些则每产生数百个请求),我们喜欢能够扩展它们的选项通过部署上的 ReplicaSet 独立进行。

但是,我对集群中可以存在/成功管理的部署数量上限有些担忧,因为我们可能会关注数百个不同的客户端,这些客户端将继续增长。我还担心成本,以及为我们的小客户提供专用资源(基本上是整个虚拟机)可能会如何影响我们的预算。

所以我的问题是:

  • 这是个好主意吗?为什么或为什么不,如果没有,我们是否可以考虑使用替代架构来实现相同的目标?
  • 这个解决方案是否比它需要的更昂贵?

如果您能提供任何见解,我将不胜感激,谢谢!

【问题讨论】:

  • 您有/预计有多少客户?如果您有 1,000 个客户端,其中 90% 处于“每天数百个请求”的长尾范围内,并且每个副本需要 4 GB 的 RAM,那么您将支付 4 TB 的 RAM 以大部分时间处于空闲状态.这么多 pod 也会给 Kubernetes 核心带来一些压力。
  • 我们还没有深入研究,因为我们仍在探索中,但使用率非常高的客户端的数量可能不到十几个。其他几百个可能要小得多。中间没有太多。如果隔离较小的客户端通常资源效率非常低,那么是否有一个合理的中间地带可以很好地与较大的客户端的全面隔离一起发挥作用?
  • @Hackerman 只是为了让我正确理解这一点:这个拓扑是否表示每个租户都有自己的命名空间?这里是否也期望这些是相同的应用程序,为四个不同的客户端运行?我也不确定我是否完全理解为什么客户端会自己与控制平面进行交互。我希望它们与应用程序交互,并且应用程序将根据需要与控制平面交互。
  • 简短回答,是的:)。有很多关于“K8s Multitenancy Namespaces”的文档

标签: kubernetes architecture containers google-kubernetes-engine


【解决方案1】:

对于这种情况,我可以想到几个选项:

  1. 为每个客户部署单独的集群。这还允许您为每个客户正确调整集群的大小,并为每个客户相应地配置自动缩放。缺点是每个集群的管理费为每小时 0.10 美元,但您可以完全保证一切都是隔离的,您可以使用cluster autoscaler 确保只有每个客户实际需要的 VM 正在运行.对于较小的客户,您可能希望将其用于小型(且便宜)的机器类型。

  2. 如 cmets 中所述,另一种选择是使用命名空间。但是你必须configure the cluster properly,因为那里有exist ways of accessing services in different namespaces

  3. 在您自己在集群上运行的软件中实施客户隔离。这意味着强制您的软件仅访问给定客户的数据库,但我不建议采用这种方式。

【讨论】:

  • 你能就你为什么不喜欢数字 3 提供建议吗?我在不同地方与近十几个不同的人进行了交流,因此他们的反应都相反——应该从应用程序内部而不是在 Kubernetes 中管理租户。你能解释一下为什么你的立场不同吗?
  • 您好,这是我的观点,因为自定义代码存在错误和可能的漏洞,可能需要很长时间才能被发现,尤其是在您的代码不是开源的情况下。如果您的公司(或者更好的是外部公司)有一个团队可以对代码进行安全审计以确保不存在任何可能的安全漏洞,那么这是一个完全可行的选择,但请记住即使是安全审计也不是完美的,他们可能会遗漏一些东西,并且每个新的代码补丁都可能引入新的安全问题,TLDR 没关系,但你需要小心。
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2021-03-31
  • 2020-08-22
相关资源
最近更新 更多